From ca52efbedcde9aebc69f75c6fa430f743e3feb3e Mon Sep 17 00:00:00 2001 From: Danil Iarosh Date: Tue, 22 Sep 2026 11:43:13 +0300 Subject: [PATCH] Initial commit: Exchanger Theme DLC Builder Godot 4.7 project for authoring, previewing, validating, and building Exchanger PCK themes. Includes the example and space-pixel themes, binding contracts, editor tooling, validation/build scripts, and project documentation. --- .agents/AGENTS.md | 5 + .gitignore | 12 + .vscode/extensions.json | 6 + .vscode/settings.json | 12 + .vscode/tasks.json | 164 + AGENTS.md | 101 + CONTRIBUTING.md | 36 + README.md | 98 + activate-theme.ps1 | 7 + addons/exchanger_theme_manager/plugin.cfg | 7 + .../theme_manager_plugin.gd | 1118 +++++ .../theme_manager_plugin.gd.uid | 1 + addons/godot_ai/LICENSE | 21 + addons/godot_ai/README.md | 53 + addons/godot_ai/client_configurator.gd | 1879 ++++++++ addons/godot_ai/client_configurator.gd.uid | 1 + addons/godot_ai/clients/_atomic_write.gd | 251 ++ addons/godot_ai/clients/_atomic_write.gd.uid | 1 + addons/godot_ai/clients/_base.gd | 528 +++ addons/godot_ai/clients/_base.gd.uid | 1 + addons/godot_ai/clients/_cli_exec.gd | 176 + addons/godot_ai/clients/_cli_exec.gd.uid | 1 + addons/godot_ai/clients/_cli_finder.gd | 181 + addons/godot_ai/clients/_cli_finder.gd.uid | 1 + addons/godot_ai/clients/_cli_strategy.gd | 372 ++ addons/godot_ai/clients/_cli_strategy.gd.uid | 1 + addons/godot_ai/clients/_dsh_strategy.gd | 759 ++++ addons/godot_ai/clients/_dsh_strategy.gd.uid | 1 + addons/godot_ai/clients/_json_strategy.gd | 989 ++++ addons/godot_ai/clients/_json_strategy.gd.uid | 1 + addons/godot_ai/clients/_manual_command.gd | 383 ++ .../godot_ai/clients/_manual_command.gd.uid | 1 + addons/godot_ai/clients/_path_template.gd | 242 + addons/godot_ai/clients/_path_template.gd.uid | 1 + addons/godot_ai/clients/_registry.gd | 156 + addons/godot_ai/clients/_registry.gd.uid | 1 + addons/godot_ai/clients/_toml_strategy.gd | 730 +++ addons/godot_ai/clients/_toml_strategy.gd.uid | 1 + addons/godot_ai/clients/_yaml_strategy.gd | 549 +++ addons/godot_ai/clients/_yaml_strategy.gd.uid | 1 + addons/godot_ai/clients/antigravity.gd | 39 + addons/godot_ai/clients/antigravity.gd.uid | 1 + addons/godot_ai/clients/cherry_studio.gd | 18 + addons/godot_ai/clients/cherry_studio.gd.uid | 1 + addons/godot_ai/clients/claude_code.gd | 84 + addons/godot_ai/clients/claude_code.gd.uid | 1 + addons/godot_ai/clients/claude_desktop.gd | 38 + addons/godot_ai/clients/claude_desktop.gd.uid | 1 + addons/godot_ai/clients/cline.gd | 43 + addons/godot_ai/clients/cline.gd.uid | 1 + addons/godot_ai/clients/codex.gd | 45 + addons/godot_ai/clients/codex.gd.uid | 1 + addons/godot_ai/clients/cursor.gd | 21 + addons/godot_ai/clients/cursor.gd.uid | 1 + addons/godot_ai/clients/deepseek_harness.gd | 45 + .../godot_ai/clients/deepseek_harness.gd.uid | 1 + addons/godot_ai/clients/gemini_cli.gd | 25 + addons/godot_ai/clients/gemini_cli.gd.uid | 1 + addons/godot_ai/clients/grok.gd | 35 + addons/godot_ai/clients/grok.gd.uid | 1 + addons/godot_ai/clients/hermes.gd | 46 + addons/godot_ai/clients/hermes.gd.uid | 1 + addons/godot_ai/clients/kilo_code.gd | 38 + addons/godot_ai/clients/kilo_code.gd.uid | 1 + addons/godot_ai/clients/kimi_code.gd | 34 + addons/godot_ai/clients/kimi_code.gd.uid | 1 + addons/godot_ai/clients/kiro.gd | 23 + addons/godot_ai/clients/kiro.gd.uid | 1 + addons/godot_ai/clients/opencode.gd | 39 + addons/godot_ai/clients/opencode.gd.uid | 1 + addons/godot_ai/clients/pi.gd | 63 + addons/godot_ai/clients/pi.gd.uid | 1 + addons/godot_ai/clients/qwen_code.gd | 26 + addons/godot_ai/clients/qwen_code.gd.uid | 1 + addons/godot_ai/clients/roo_code.gd | 42 + addons/godot_ai/clients/roo_code.gd.uid | 1 + addons/godot_ai/clients/trae.gd | 23 + addons/godot_ai/clients/trae.gd.uid | 1 + addons/godot_ai/clients/vscode.gd | 30 + addons/godot_ai/clients/vscode.gd.uid | 1 + addons/godot_ai/clients/vscode_insiders.gd | 23 + .../godot_ai/clients/vscode_insiders.gd.uid | 1 + addons/godot_ai/clients/windsurf.gd | 29 + addons/godot_ai/clients/windsurf.gd.uid | 1 + addons/godot_ai/clients/zed.gd | 29 + addons/godot_ai/clients/zed.gd.uid | 1 + addons/godot_ai/clients/zoo_code.gd | 36 + addons/godot_ai/clients/zoo_code.gd.uid | 1 + addons/godot_ai/connection.gd | 1058 +++++ addons/godot_ai/connection.gd.uid | 1 + .../custom_tools/custom_tool_wrapper.gd | 66 + .../custom_tools/custom_tool_wrapper.gd.uid | 1 + .../godot_ai/custom_tools/mcp_call_context.gd | 44 + .../custom_tools/mcp_call_context.gd.uid | 1 + .../custom_tools/mcp_custom_tool_spec.gd | 66 + .../custom_tools/mcp_custom_tool_spec.gd.uid | 1 + .../custom_tools/mcp_service_locator.gd | 16 + .../custom_tools/mcp_service_locator.gd.uid | 1 + .../custom_tools/mcp_tool_registry.gd | 277 ++ .../custom_tools/mcp_tool_registry.gd.uid | 1 + .../godot_ai/debugger/mcp_debugger_plugin.gd | 1699 +++++++ .../debugger/mcp_debugger_plugin.gd.uid | 1 + addons/godot_ai/dispatcher.gd | 476 ++ addons/godot_ai/dispatcher.gd.uid | 1 + addons/godot_ai/dock_panels/log_viewer.gd | 100 + addons/godot_ai/dock_panels/log_viewer.gd.uid | 1 + .../godot_ai/dock_panels/port_picker_panel.gd | 78 + .../dock_panels/port_picker_panel.gd.uid | 1 + addons/godot_ai/export/mcp_export_plugin.gd | 69 + .../godot_ai/export/mcp_export_plugin.gd.uid | 1 + addons/godot_ai/handlers/_node_validator.gd | 71 + .../godot_ai/handlers/_node_validator.gd.uid | 1 + addons/godot_ai/handlers/_param_validators.gd | 30 + .../handlers/_param_validators.gd.uid | 1 + addons/godot_ai/handlers/_property_errors.gd | 82 + .../godot_ai/handlers/_property_errors.gd.uid | 1 + addons/godot_ai/handlers/animation_handler.gd | 825 ++++ .../handlers/animation_handler.gd.uid | 1 + addons/godot_ai/handlers/animation_presets.gd | 536 +++ .../handlers/animation_presets.gd.uid | 1 + addons/godot_ai/handlers/animation_values.gd | 442 ++ .../godot_ai/handlers/animation_values.gd.uid | 1 + addons/godot_ai/handlers/api_handler.gd | 89 + addons/godot_ai/handlers/api_handler.gd.uid | 1 + addons/godot_ai/handlers/audio_handler.gd | 361 ++ addons/godot_ai/handlers/audio_handler.gd.uid | 1 + addons/godot_ai/handlers/autoload_handler.gd | 91 + .../godot_ai/handlers/autoload_handler.gd.uid | 1 + addons/godot_ai/handlers/batch_handler.gd | 190 + addons/godot_ai/handlers/batch_handler.gd.uid | 1 + addons/godot_ai/handlers/camera_handler.gd | 1145 +++++ .../godot_ai/handlers/camera_handler.gd.uid | 1 + addons/godot_ai/handlers/camera_presets.gd | 81 + .../godot_ai/handlers/camera_presets.gd.uid | 1 + addons/godot_ai/handlers/camera_values.gd | 132 + addons/godot_ai/handlers/camera_values.gd.uid | 1 + addons/godot_ai/handlers/client_handler.gd | 127 + .../godot_ai/handlers/client_handler.gd.uid | 1 + .../handlers/control_draw_recipe_handler.gd | 318 ++ .../control_draw_recipe_handler.gd.uid | 1 + addons/godot_ai/handlers/csg_handler.gd | 118 + addons/godot_ai/handlers/csg_handler.gd.uid | 1 + addons/godot_ai/handlers/curve_handler.gd | 243 + addons/godot_ai/handlers/curve_handler.gd.uid | 1 + addons/godot_ai/handlers/editor_handler.gd | 1060 +++++ .../godot_ai/handlers/editor_handler.gd.uid | 1 + .../godot_ai/handlers/environment_handler.gd | 181 + .../handlers/environment_handler.gd.uid | 1 + .../godot_ai/handlers/filesystem_handler.gd | 312 ++ .../handlers/filesystem_handler.gd.uid | 1 + addons/godot_ai/handlers/gridmap_handler.gd | 192 + .../godot_ai/handlers/gridmap_handler.gd.uid | 1 + addons/godot_ai/handlers/input_handler.gd | 462 ++ addons/godot_ai/handlers/input_handler.gd.uid | 1 + addons/godot_ai/handlers/material_handler.gd | 809 ++++ .../godot_ai/handlers/material_handler.gd.uid | 1 + addons/godot_ai/handlers/material_presets.gd | 92 + .../godot_ai/handlers/material_presets.gd.uid | 1 + addons/godot_ai/handlers/material_values.gd | 194 + .../godot_ai/handlers/material_values.gd.uid | 1 + addons/godot_ai/handlers/node_handler.gd | 1390 ++++++ addons/godot_ai/handlers/node_handler.gd.uid | 1 + addons/godot_ai/handlers/particle_handler.gd | 860 ++++ .../godot_ai/handlers/particle_handler.gd.uid | 1 + addons/godot_ai/handlers/particle_presets.gd | 293 ++ .../godot_ai/handlers/particle_presets.gd.uid | 1 + addons/godot_ai/handlers/particle_values.gd | 246 + .../godot_ai/handlers/particle_values.gd.uid | 1 + .../handlers/physics_shape_handler.gd | 338 ++ .../handlers/physics_shape_handler.gd.uid | 1 + addons/godot_ai/handlers/project_handler.gd | 572 +++ .../godot_ai/handlers/project_handler.gd.uid | 1 + addons/godot_ai/handlers/resource_handler.gd | 591 +++ .../godot_ai/handlers/resource_handler.gd.uid | 1 + addons/godot_ai/handlers/scene_handler.gd | 420 ++ addons/godot_ai/handlers/scene_handler.gd.uid | 1 + addons/godot_ai/handlers/script_handler.gd | 501 +++ .../godot_ai/handlers/script_handler.gd.uid | 1 + addons/godot_ai/handlers/signal_handler.gd | 274 ++ .../godot_ai/handlers/signal_handler.gd.uid | 1 + addons/godot_ai/handlers/test_handler.gd | 349 ++ addons/godot_ai/handlers/test_handler.gd.uid | 1 + addons/godot_ai/handlers/texture_handler.gd | 199 + .../godot_ai/handlers/texture_handler.gd.uid | 1 + addons/godot_ai/handlers/theme_handler.gd | 476 ++ addons/godot_ai/handlers/theme_handler.gd.uid | 1 + addons/godot_ai/handlers/tilemap_handler.gd | 163 + .../godot_ai/handlers/tilemap_handler.gd.uid | 1 + addons/godot_ai/handlers/tileset_handler.gd | 178 + .../godot_ai/handlers/tileset_handler.gd.uid | 1 + addons/godot_ai/handlers/ui_handler.gd | 525 +++ addons/godot_ai/handlers/ui_handler.gd.uid | 1 + addons/godot_ai/mcp_dock.gd | 3784 ++++++++++++++++ addons/godot_ai/mcp_dock.gd.uid | 1 + addons/godot_ai/plugin.cfg | 7 + addons/godot_ai/plugin.gd | 2144 +++++++++ addons/godot_ai/plugin.gd.uid | 1 + addons/godot_ai/runtime/draw_recipe.gd | 86 + addons/godot_ai/runtime/draw_recipe.gd.uid | 1 + addons/godot_ai/runtime/editor_logger.gd | 139 + addons/godot_ai/runtime/editor_logger.gd.uid | 1 + addons/godot_ai/runtime/game_helper.gd | 1317 ++++++ addons/godot_ai/runtime/game_helper.gd.uid | 1 + addons/godot_ai/runtime/game_logger.gd | 142 + addons/godot_ai/runtime/game_logger.gd.uid | 1 + addons/godot_ai/runtime/validation_logger.gd | 43 + .../godot_ai/runtime/validation_logger.gd.uid | 1 + addons/godot_ai/telemetry.gd | 198 + addons/godot_ai/telemetry.gd.uid | 1 + .../godot_ai/testing/script_error_capture.gd | 49 + .../testing/script_error_capture.gd.uid | 1 + addons/godot_ai/testing/test_runner.gd | 441 ++ addons/godot_ai/testing/test_runner.gd.uid | 1 + addons/godot_ai/testing/test_suite.gd | 330 ++ addons/godot_ai/testing/test_suite.gd.uid | 1 + addons/godot_ai/tool_catalog.gd | 110 + addons/godot_ai/tool_catalog.gd.uid | 1 + addons/godot_ai/update_reload_runner.gd | 590 +++ addons/godot_ai/update_reload_runner.gd.uid | 1 + addons/godot_ai/utils/allow_hosts.gd | 170 + addons/godot_ai/utils/allow_hosts.gd.uid | 1 + addons/godot_ai/utils/class_introspection.gd | 259 ++ .../godot_ai/utils/class_introspection.gd.uid | 1 + addons/godot_ai/utils/diagnostics_capture.gd | 66 + .../godot_ai/utils/diagnostics_capture.gd.uid | 1 + addons/godot_ai/utils/editor_log_buffer.gd | 127 + .../godot_ai/utils/editor_log_buffer.gd.uid | 1 + addons/godot_ai/utils/error_codes.gd | 163 + addons/godot_ai/utils/error_codes.gd.uid | 1 + addons/godot_ai/utils/fuzzy_suggestions.gd | 39 + .../godot_ai/utils/fuzzy_suggestions.gd.uid | 1 + addons/godot_ai/utils/game_log_buffer.gd | 105 + addons/godot_ai/utils/game_log_buffer.gd.uid | 1 + addons/godot_ai/utils/json_values.gd | 92 + addons/godot_ai/utils/json_values.gd.uid | 1 + addons/godot_ai/utils/log_backtrace.gd | 113 + addons/godot_ai/utils/log_backtrace.gd.uid | 1 + addons/godot_ai/utils/log_buffer.gd | 67 + addons/godot_ai/utils/log_buffer.gd.uid | 1 + addons/godot_ai/utils/mcp_adoption_label.gd | 23 + .../godot_ai/utils/mcp_adoption_label.gd.uid | 1 + .../utils/mcp_client_refresh_state.gd | 107 + .../utils/mcp_client_refresh_state.gd.uid | 1 + addons/godot_ai/utils/mcp_server_state.gd | 182 + addons/godot_ai/utils/mcp_server_state.gd.uid | 1 + addons/godot_ai/utils/mcp_startup_path.gd | 34 + addons/godot_ai/utils/mcp_startup_path.gd.uid | 1 + addons/godot_ai/utils/path_validator.gd | 198 + addons/godot_ai/utils/path_validator.gd.uid | 1 + addons/godot_ai/utils/port_resolver.gd | 370 ++ addons/godot_ai/utils/port_resolver.gd.uid | 1 + addons/godot_ai/utils/resource_io.gd | 277 ++ addons/godot_ai/utils/resource_io.gd.uid | 1 + addons/godot_ai/utils/scene_path.gd | 155 + addons/godot_ai/utils/scene_path.gd.uid | 1 + addons/godot_ai/utils/screenshot_encode.gd | 38 + .../godot_ai/utils/screenshot_encode.gd.uid | 1 + addons/godot_ai/utils/server_lifecycle.gd | 2197 +++++++++ addons/godot_ai/utils/server_lifecycle.gd.uid | 1 + addons/godot_ai/utils/server_version_check.gd | 126 + .../utils/server_version_check.gd.uid | 1 + addons/godot_ai/utils/settings.gd | 135 + addons/godot_ai/utils/settings.gd.uid | 1 + addons/godot_ai/utils/structured_log_ring.gd | 156 + .../godot_ai/utils/structured_log_ring.gd.uid | 1 + .../godot_ai/utils/surfaced_error_tracker.gd | 642 +++ .../utils/surfaced_error_tracker.gd.uid | 1 + addons/godot_ai/utils/update_manager.gd | 843 ++++ addons/godot_ai/utils/update_manager.gd.uid | 1 + addons/godot_ai/utils/update_mixed_state.gd | 140 + .../godot_ai/utils/update_mixed_state.gd.uid | 1 + addons/godot_ai/utils/uv_cache_cleanup.gd | 161 + addons/godot_ai/utils/uv_cache_cleanup.gd.uid | 1 + addons/godot_ai/utils/variant_serializer.gd | 102 + .../godot_ai/utils/variant_serializer.gd.uid | 1 + .../utils/windows_port_reservation.gd | 146 + .../utils/windows_port_reservation.gd.uid | 1 + addons/godot_ai/vision_routing.gd | 1043 +++++ addons/godot_ai/vision_routing.gd.uid | 1 + build-theme.ps1 | 142 + contracts/screen_bindings.v2.json | 3929 ++++++++++++++++ docs/APPLY_THEME.md | 162 + docs/ARCHITECTURE.md | 92 + docs/BINDING_CONTRACT.md | 367 ++ docs/COMPOSITE_PET_ANIMATIONS.md | 347 ++ docs/PROJECT_CONTEXT.md | 724 +++ docs/QA_AND_TROUBLESHOOTING.md | 89 + docs/QUICK_START.md | 53 + docs/README.md | 34 + docs/SCRIPTING.md | 280 ++ docs/SPACE_PIXEL.md | 441 ++ docs/THEME_AUTHORING.md | 323 ++ docs/THEME_INTEGRATION.md | 73 + docs/WORKFLOW.md | 103 + export_presets.cfg | 74 + godot-ai-LICENSE.txt | 21 + preview-theme.ps1 | 16 + preview.tscn | 131 + preview_scenes/.gdignore | 1 + preview_scenes/CardAmountPreview.tscn | 177 + preview_scenes/CardCustomPreview.tscn | 182 + preview_scenes/CardTerminalPreview.tscn | 127 + preview_scenes/CashPreview.tscn | 222 + preview_scenes/ErrorPreview.tscn | 98 + preview_scenes/HomePreview.tscn | 191 + preview_scenes/PreviewFooter.tscn | 45 + preview_scenes/PreviewLiveReload.gd | 157 + preview_scenes/ServiceAccessPreview.tscn | 172 + preview_scenes/SettingsPreview.gd | 317 ++ preview_scenes/SettingsPreview.tscn | 100 + preview_scenes/SuccessPreview.tscn | 105 + project.godot | 47 + test-theme.ps1 | 58 + themes/example/README.md | 27 + .../package/assets/background/background.png | Bin 0 -> 96063 bytes .../assets/background/background.png.import | 40 + .../package/assets/ui/keyboard_hide.svg | 3 + .../assets/ui/keyboard_hide.svg.import | 43 + .../package/background_decoration.tscn | 6 + themes/example/package/components/footer.tscn | 45 + .../components/on_screen_keyboards.tscn | 550 +++ .../package/contracts/screen_bindings.v2.json | 3929 ++++++++++++++++ themes/example/package/manifest.json | 23 + .../package/scenes/screen_card_amount.tscn | 350 ++ .../scenes/screen_card_custom_amount.tscn | 286 ++ .../package/scenes/screen_card_terminal.tscn | 201 + .../package/scenes/screen_cash_payment.tscn | 291 ++ .../example/package/scenes/screen_error.tscn | 137 + .../example/package/scenes/screen_home.tscn | 415 ++ .../package/scenes/screen_service_access.tscn | 252 ++ .../package/scenes/screen_settings.tscn | 3987 ++++++++++++++++ .../package/scenes/screen_success.tscn | 135 + .../package/scripts/decoration_controller.gd | 20 + .../scripts/decoration_controller.gd.uid | 1 + themes/example/package/ui_theme.tres | 59 + themes/example/source/README.md | 4 + .../example/source/interactive_pet/README.md | 24 + .../assets/animations/alien_pet/action.png | Bin 0 -> 19112 bytes .../animations/alien_pet/action.png.import | 40 + .../animations/alien_pet/climbing_action.png | Bin 0 -> 18604 bytes .../alien_pet/climbing_action.png.import | 40 + .../alien_pet/climbing_action_start.png | Bin 0 -> 27008 bytes .../climbing_action_start.png.import | 40 + .../alien_pet/climbing_action_stop.png | Bin 0 -> 24552 bytes .../alien_pet/climbing_action_stop.png.import | 40 + .../animations/alien_pet/climbing_down.png | Bin 0 -> 30360 bytes .../alien_pet/climbing_down.png.import | 40 + .../animations/alien_pet/climbing_start.png | Bin 0 -> 55116 bytes .../alien_pet/climbing_start.png.import | 40 + .../animations/alien_pet/climbing_up.png | Bin 0 -> 31570 bytes .../alien_pet/climbing_up.png.import | 40 + .../animations/alien_pet/come_closer.png | Bin 0 -> 104115 bytes .../alien_pet/come_closer.png.import | 40 + .../assets/animations/alien_pet/dancing.png | Bin 0 -> 260710 bytes .../animations/alien_pet/dancing.png.import | 40 + .../assets/animations/alien_pet/falling.png | Bin 0 -> 74412 bytes .../animations/alien_pet/falling.png.import | 40 + .../assets/animations/alien_pet/hanging.png | Bin 0 -> 46989 bytes .../animations/alien_pet/hanging.png.import | 40 + .../assets/animations/alien_pet/idle.png | Bin 0 -> 38524 bytes .../animations/alien_pet/idle.png.import | 40 + .../assets/animations/alien_pet/landing.png | Bin 0 -> 37776 bytes .../animations/alien_pet/landing.png.import | 40 + .../assets/animations/alien_pet/sitting.png | Bin 0 -> 96255 bytes .../animations/alien_pet/sitting.png.import | 40 + .../assets/animations/alien_pet/turn_left.png | Bin 0 -> 31428 bytes .../animations/alien_pet/turn_left.png.import | 40 + .../animations/alien_pet/turn_right.png | Bin 0 -> 32120 bytes .../alien_pet/turn_right.png.import | 40 + .../animations/alien_pet/walking_left.png | Bin 0 -> 76871 bytes .../alien_pet/walking_left.png.import | 40 + .../alien_pet/walking_left_start.png | Bin 0 -> 21102 bytes .../alien_pet/walking_left_start.png.import | 40 + .../alien_pet/walking_left_stop.png | Bin 0 -> 16114 bytes .../alien_pet/walking_left_stop.png.import | 40 + .../animations/alien_pet/walking_right.png | Bin 0 -> 76991 bytes .../alien_pet/walking_right.png.import | 40 + .../alien_pet/walking_right_stop.png | Bin 0 -> 16122 bytes .../alien_pet/walking_right_stop.png.import | 40 + .../alien_pet/walking_start_right.png | Bin 0 -> 21122 bytes .../alien_pet/walking_start_right.png.import | 40 + .../assets/animations/banner/frame_01.png | Bin 0 -> 11491 bytes .../animations/banner/frame_01.png.import | 40 + .../assets/animations/banner/frame_02.png | Bin 0 -> 11294 bytes .../animations/banner/frame_02.png.import | 40 + .../assets/animations/bill/frame_01.png | Bin 0 -> 2754 bytes .../animations/bill/frame_01.png.import | 40 + .../assets/animations/bill/frame_02.png | Bin 0 -> 2588 bytes .../animations/bill/frame_02.png.import | 40 + .../assets/animations/bill/frame_03.png | Bin 0 -> 2596 bytes .../animations/bill/frame_03.png.import | 40 + .../assets/animations/bill/frame_04.png | Bin 0 -> 2338 bytes .../animations/bill/frame_04.png.import | 40 + .../assets/animations/card/frame_01.png | Bin 0 -> 3895 bytes .../animations/card/frame_01.png.import | 40 + .../assets/animations/card/frame_02.png | Bin 0 -> 4068 bytes .../animations/card/frame_02.png.import | 40 + .../assets/animations/coin/frame_01.png | Bin 0 -> 2624 bytes .../animations/coin/frame_01.png.import | 40 + .../assets/animations/coin/frame_02.png | Bin 0 -> 2592 bytes .../animations/coin/frame_02.png.import | 40 + .../assets/animations/coin/frame_03.png | Bin 0 -> 2441 bytes .../animations/coin/frame_03.png.import | 40 + .../animations/payment_failed/frame_01.png | Bin 0 -> 3508 bytes .../payment_failed/frame_01.png.import | 40 + .../animations/payment_failed/frame_02.png | Bin 0 -> 3415 bytes .../payment_failed/frame_02.png.import | 40 + .../animations/payment_failed/frame_03.png | Bin 0 -> 3355 bytes .../payment_failed/frame_03.png.import | 40 + .../animations/payment_success/frame_01.png | Bin 0 -> 3500 bytes .../payment_success/frame_01.png.import | 40 + .../animations/payment_success/frame_02.png | Bin 0 -> 3479 bytes .../payment_success/frame_02.png.import | 40 + .../animations/payment_success/frame_03.png | Bin 0 -> 3522 bytes .../payment_success/frame_03.png.import | 40 + .../animations/payment_success/frame_04.png | Bin 0 -> 3513 bytes .../payment_success/frame_04.png.import | 40 + .../animations/payment_success/frame_05.png | Bin 0 -> 3522 bytes .../payment_success/frame_05.png.import | 40 + .../assets/animations/ufo_large/frame_01.png | Bin 0 -> 26589 bytes .../animations/ufo_large/frame_01.png.import | 40 + .../assets/animations/ufo_large/frame_02.png | Bin 0 -> 28665 bytes .../animations/ufo_large/frame_02.png.import | 40 + .../assets/animations/ufo_small/frame_01.png | Bin 0 -> 1890 bytes .../animations/ufo_small/frame_01.png.import | 40 + .../assets/animations/ufo_small/frame_02.png | Bin 0 -> 2634 bytes .../animations/ufo_small/frame_02.png.import | 40 + .../package/assets/background/background.png | Bin 0 -> 96063 bytes .../assets/background/background.png.import | 40 + .../package/assets/decorations/alien1.png | Bin 0 -> 31719 bytes .../assets/decorations/alien1.png.import | 40 + .../package/assets/decorations/alien2.png | Bin 0 -> 31086 bytes .../assets/decorations/alien2.png.import | 40 + .../package/assets/decorations/alien3.png | Bin 0 -> 26969 bytes .../assets/decorations/alien3.png.import | 40 + .../package/assets/decorations/stars_1.png | Bin 0 -> 16919 bytes .../assets/decorations/stars_1.png.import | 40 + .../package/assets/decorations/stars_2.png | Bin 0 -> 15935 bytes .../assets/decorations/stars_2.png.import | 40 + .../package/assets/fonts/vcr_osd_mono_cyr.ttf | Bin 0 -> 30764 bytes .../assets/fonts/vcr_osd_mono_cyr.ttf.import | 36 + .../package/assets/ui/back_button.png | Bin 0 -> 757 bytes .../package/assets/ui/back_button.png.import | 40 + .../package/assets/ui/billboard_ads.png | Bin 0 -> 8086 bytes .../assets/ui/billboard_ads.png.import | 40 + .../package/assets/ui/bubble_large.png | Bin 0 -> 1401 bytes .../package/assets/ui/bubble_large.png.import | 40 + .../package/assets/ui/bubble_small.png | Bin 0 -> 838 bytes .../package/assets/ui/bubble_small.png.import | 40 + .../package/assets/ui/bubble_text.png | Bin 0 -> 805 bytes .../package/assets/ui/bubble_text.png.import | 40 + .../package/assets/ui/button_big.png | Bin 0 -> 6175 bytes .../package/assets/ui/button_big.png.import | 40 + .../package/assets/ui/button_cancel.png | Bin 0 -> 3586 bytes .../assets/ui/button_cancel.png.import | 40 + .../package/assets/ui/button_down.png | Bin 0 -> 314 bytes .../package/assets/ui/button_down.png.import | 40 + .../package/assets/ui/button_long.png | Bin 0 -> 3952 bytes .../package/assets/ui/button_long.png.import | 40 + .../package/assets/ui/button_square.png | Bin 0 -> 555 bytes .../assets/ui/button_square.png.import | 40 + .../package/assets/ui/button_up.png | Bin 0 -> 310 bytes .../package/assets/ui/button_up.png.import | 40 + .../assets/ui/interactive_pet/cross.png | Bin 0 -> 228 bytes .../ui/interactive_pet/cross.png.import | 40 + .../assets/ui/interactive_pet/home.png | Bin 0 -> 259 bytes .../assets/ui/interactive_pet/home.png.import | 40 + themes/space-pixel/package/assets/ui/logo.png | Bin 0 -> 10030 bytes .../package/assets/ui/logo.png.import | 40 + .../package/assets/ui/panel_card.png | Bin 0 -> 7111 bytes .../package/assets/ui/panel_card.png.import | 40 + .../package/assets/ui/panel_dispense.png | Bin 0 -> 2314 bytes .../assets/ui/panel_dispense.png.import | 40 + .../package/assets/ui/panel_large.png | Bin 0 -> 7111 bytes .../package/assets/ui/panel_large.png.import | 40 + .../package/assets/ui/panel_medium.png | Bin 0 -> 1728 bytes .../package/assets/ui/panel_medium.png.import | 40 + .../package/assets/ui/panel_wide.png | Bin 0 -> 2310 bytes .../package/assets/ui/panel_wide.png.import | 40 + .../package/assets/ui/stock_low.png | Bin 0 -> 368 bytes .../package/assets/ui/stock_low.png.import | 40 + .../package/assets/ui/stock_many.png | Bin 0 -> 355 bytes .../package/assets/ui/stock_many.png.import | 40 + .../space-pixel/package/assets/ui/sum_bar.png | Bin 0 -> 456 bytes .../package/assets/ui/sum_bar.png.import | 40 + .../package/assets/ui/tumbler_off.png | Bin 0 -> 713 bytes .../package/assets/ui/tumbler_off.png.import | 40 + .../package/assets/ui/tumbler_on.png | Bin 0 -> 717 bytes .../package/assets/ui/tumbler_on.png.import | 40 + .../package/background_decoration.tscn | 58 + .../package/components/footer.tscn | 52 + .../package/components/interactive_pet.tscn | 3485 ++++++++++++++ .../components/on_screen_keyboards.tscn | 595 +++ .../package/contracts/screen_bindings.v2.json | 3929 ++++++++++++++++ themes/space-pixel/package/manifest.json | 33 + .../package/scenes/screen_card_amount.tscn | 873 ++++ .../scenes/screen_card_custom_amount.tscn | 725 +++ .../package/scenes/screen_card_terminal.tscn | 311 ++ .../package/scenes/screen_cash_payment.tscn | 586 +++ .../package/scenes/screen_error.tscn | 212 + .../package/scenes/screen_home.tscn | 902 ++++ .../package/scenes/screen_service_access.tscn | 408 ++ .../package/scenes/screen_settings.tscn | 3992 +++++++++++++++++ .../package/scenes/screen_success.tscn | 210 + .../package/scripts/home_reference_label.gd | 31 + .../scripts/home_reference_label.gd.uid | 1 + .../package/scripts/home_stock_presenter.gd | 30 + .../scripts/home_stock_presenter.gd.uid | 1 + .../package/scripts/home_ufo_bobbing.gd | 37 + .../package/scripts/home_ufo_bobbing.gd.uid | 1 + .../package/scripts/interactive_pet.gd | 743 +++ .../package/scripts/interactive_pet.gd.uid | 1 + .../scripts/stable_banner_animation.gd | 30 + .../scripts/stable_banner_animation.gd.uid | 1 + .../package/scripts/ufo_flight_controller.gd | 67 + .../scripts/ufo_flight_controller.gd.uid | 1 + themes/space-pixel/package/ui_theme.tres | 755 ++++ .../package/visuals/card_terminal.tscn | 18 + .../package/visuals/cash_instructions.tscn | 33 + .../space-pixel/package/visuals/cash_tip.tscn | 57 + .../package/visuals/home_advertisement.tscn | 18 + .../space-pixel/package/visuals/home_top.tscn | 49 + .../package/visuals/result_error.tscn | 19 + .../package/visuals/result_success.tscn | 21 + themes/space-pixel/source/Bubble_addtext.png | Bin 0 -> 805 bytes .../source/Bubble_addtext.png.import | 40 + themes/space-pixel/source/README.md | 53 + .../space-pixel/source/Window_k_vidache.png | Bin 0 -> 2314 bytes .../source/Window_k_vidache.png.import | 40 + themes/space-pixel/source/Window_paycard.png | Bin 0 -> 7111 bytes .../source/Window_paycard.png.import | 40 + .../source/Window_paynal_balance.png | Bin 0 -> 2310 bytes .../source/Window_paynal_balance.png.import | 40 + .../source/Window_paynal_balance_money.png | Bin 0 -> 1728 bytes .../Window_paynal_balance_money.png.import | 40 + .../source/Window_paynal_instruction.png | Bin 0 -> 7111 bytes .../Window_paynal_instruction.png.import | 40 + themes/space-pixel/source/alien1.png | Bin 0 -> 31719 bytes themes/space-pixel/source/alien1.png.import | 40 + themes/space-pixel/source/alien2.png | Bin 0 -> 31086 bytes themes/space-pixel/source/alien2.png.import | 40 + themes/space-pixel/source/alien3.png | Bin 0 -> 26969 bytes themes/space-pixel/source/alien3.png.import | 40 + .../source/alien_animation/action.png | Bin 0 -> 19253 bytes .../source/alien_animation/action.png.import | 40 + .../alien_animation/climbing_action.png | Bin 0 -> 18604 bytes .../climbing_action.png.import | 40 + .../alien_animation/climbing_action_start.png | Bin 0 -> 27008 bytes .../climbing_action_start.png.import | 40 + .../alien_animation/climbing_action_stop.png | Bin 0 -> 24552 bytes .../climbing_action_stop.png.import | 40 + .../source/alien_animation/climbing_down.png | Bin 0 -> 30360 bytes .../alien_animation/climbing_down.png.import | 40 + .../source/alien_animation/climbing_start.png | Bin 0 -> 56946 bytes .../alien_animation/climbing_start.png.import | 40 + .../source/alien_animation/climbing_up.png | Bin 0 -> 31496 bytes .../alien_animation/climbing_up.png.import | 40 + .../source/alien_animation/come_closer.png | Bin 0 -> 104115 bytes .../alien_animation/come_closer.png.import | 40 + .../source/alien_animation/dancing.png | Bin 0 -> 260710 bytes .../source/alien_animation/dancing.png.import | 40 + .../source/alien_animation/falling.png | Bin 0 -> 72722 bytes .../source/alien_animation/falling.png.import | 40 + .../source/alien_animation/hanging.png | Bin 0 -> 45827 bytes .../source/alien_animation/hanging.png.import | 40 + .../source/alien_animation/idle.png | Bin 0 -> 38795 bytes .../source/alien_animation/idle.png.import | 40 + .../source/alien_animation/landing.png | Bin 0 -> 37776 bytes .../source/alien_animation/landing.png.import | 40 + .../source/alien_animation/sitting.png | Bin 0 -> 91909 bytes .../source/alien_animation/sitting.png.import | 40 + .../source/alien_animation/turn_left.png | Bin 0 -> 31428 bytes .../alien_animation/turn_left.png.import | 40 + .../source/alien_animation/turn_right.png | Bin 0 -> 32120 bytes .../alien_animation/turn_right.png.import | 40 + .../source/alien_animation/walking_left.png | Bin 0 -> 75838 bytes .../alien_animation/walking_left.png.import | 40 + .../alien_animation/walking_left_start.png | Bin 0 -> 21102 bytes .../walking_left_start.png.import | 40 + .../alien_animation/walking_left_stop.png | Bin 0 -> 16114 bytes .../walking_left_stop.png.import | 40 + .../source/alien_animation/walking_right.png | Bin 0 -> 75986 bytes .../alien_animation/walking_right.png.import | 40 + .../alien_animation/walking_right_stop.png | Bin 0 -> 16122 bytes .../walking_right_stop.png.import | 40 + .../alien_animation/walking_start_right.png | Bin 0 -> 21122 bytes .../walking_start_right.png.import | 40 + themes/space-pixel/source/back_button.png | Bin 0 -> 757 bytes .../space-pixel/source/back_button.png.import | 40 + themes/space-pixel/source/background.png | Bin 0 -> 96063 bytes .../space-pixel/source/background.png.import | 40 + themes/space-pixel/source/billboard_ads.png | Bin 0 -> 8086 bytes .../source/billboard_ads.png.import | 40 + themes/space-pixel/source/bubble1.png | Bin 0 -> 1401 bytes themes/space-pixel/source/bubble1.png.import | 40 + themes/space-pixel/source/bubble2.png | Bin 0 -> 838 bytes themes/space-pixel/source/bubble2.png.import | 40 + themes/space-pixel/source/button_big.png | Bin 0 -> 6175 bytes .../space-pixel/source/button_big.png.import | 40 + themes/space-pixel/source/button_down.png | Bin 0 -> 679 bytes .../space-pixel/source/button_down.png.import | 40 + themes/space-pixel/source/button_long.png | Bin 0 -> 3952 bytes .../space-pixel/source/button_long.png.import | 40 + themes/space-pixel/source/button_square.png | Bin 0 -> 555 bytes .../source/button_square.png.import | 40 + themes/space-pixel/source/button_up.png | Bin 0 -> 668 bytes .../space-pixel/source/button_up.png.import | 40 + themes/space-pixel/source/climbing_action.png | Bin 0 -> 18604 bytes .../source/climbing_action.png.import | 40 + .../source/climbing_action_start.png | Bin 0 -> 27008 bytes .../source/climbing_action_start.png.import | 40 + .../source/climbing_action_stop.png | Bin 0 -> 24552 bytes .../source/climbing_action_stop.png.import | 40 + themes/space-pixel/source/cross.png | Bin 0 -> 228 bytes themes/space-pixel/source/cross.png.import | 40 + themes/space-pixel/source/home.png | Bin 0 -> 259 bytes themes/space-pixel/source/home.png.import | 40 + themes/space-pixel/source/less_bar.png | Bin 0 -> 368 bytes themes/space-pixel/source/less_bar.png.import | 40 + themes/space-pixel/source/logo.png | Bin 0 -> 10030 bytes themes/space-pixel/source/logo.png.import | 40 + themes/space-pixel/source/many_bar.png | Bin 0 -> 355 bytes themes/space-pixel/source/many_bar.png.import | 40 + themes/space-pixel/source/star_frame1.png | Bin 0 -> 16919 bytes .../space-pixel/source/star_frame1.png.import | 40 + themes/space-pixel/source/star_frame2.png | Bin 0 -> 15935 bytes .../space-pixel/source/star_frame2.png.import | 40 + themes/space-pixel/source/summa_bar.png | Bin 0 -> 456 bytes .../space-pixel/source/summa_bar.png.import | 40 + themes/space-pixel/source/tumbler_off.png | Bin 0 -> 713 bytes .../space-pixel/source/tumbler_off.png.import | 40 + themes/space-pixel/source/tumbler_on.png | Bin 0 -> 717 bytes .../space-pixel/source/tumbler_on.png.import | 40 + .../source/Анимация_баннер/frame1.png | Bin 0 -> 11491 bytes .../source/Анимация_баннер/frame1.png.import | 40 + .../source/Анимация_баннер/frame2.png | Bin 0 -> 11294 bytes .../source/Анимация_баннер/frame2.png.import | 40 + .../source/Анимация_купюры/frame1.png | Bin 0 -> 2754 bytes .../source/Анимация_купюры/frame1.png.import | 40 + .../source/Анимация_купюры/frame2.png | Bin 0 -> 2588 bytes .../source/Анимация_купюры/frame2.png.import | 40 + .../source/Анимация_купюры/frame3.png | Bin 0 -> 2596 bytes .../source/Анимация_купюры/frame3.png.import | 40 + .../source/Анимация_купюры/frame4.png | Bin 0 -> 2338 bytes .../source/Анимация_купюры/frame4.png.import | 40 + .../source/Анимация_монеты/frame1.png | Bin 0 -> 2624 bytes .../source/Анимация_монеты/frame1.png.import | 40 + .../source/Анимация_монеты/frame2.png | Bin 0 -> 2592 bytes .../source/Анимация_монеты/frame2.png.import | 40 + .../source/Анимация_монеты/frame3.png | Bin 0 -> 2441 bytes .../source/Анимация_монеты/frame3.png.import | 40 + .../source/Анимация_оплата_картой/Frame1.png | Bin 0 -> 3895 bytes .../Анимация_оплата_картой/Frame1.png.import | 40 + .../source/Анимация_оплата_картой/Frame2.png | Bin 0 -> 4068 bytes .../Анимация_оплата_картой/Frame2.png.import | 40 + .../Анимация_оплата_непрошла/frame1.png | Bin 0 -> 3508 bytes .../frame1.png.import | 40 + .../Анимация_оплата_непрошла/frame2.png | Bin 0 -> 3415 bytes .../frame2.png.import | 40 + .../Анимация_оплата_непрошла/frame3.png | Bin 0 -> 3355 bytes .../frame3.png.import | 40 + .../source/Анимация_оплата_прошла/frame1.png | Bin 0 -> 3500 bytes .../Анимация_оплата_прошла/frame1.png.import | 40 + .../source/Анимация_оплата_прошла/frame2.png | Bin 0 -> 3479 bytes .../Анимация_оплата_прошла/frame2.png.import | 40 + .../source/Анимация_оплата_прошла/frame3.png | Bin 0 -> 3522 bytes .../Анимация_оплата_прошла/frame3.png.import | 40 + .../source/Анимация_оплата_прошла/frame4.png | Bin 0 -> 3513 bytes .../Анимация_оплата_прошла/frame4.png.import | 40 + .../source/Анимация_оплата_прошла/frame5.png | Bin 0 -> 3522 bytes .../Анимация_оплата_прошла/frame5.png.import | 40 + .../source/Пролетающие_нло/frame1.png | Bin 0 -> 1890 bytes .../source/Пролетающие_нло/frame1.png.import | 40 + .../source/Пролетающие_нло/frame2.png | Bin 0 -> 2634 bytes .../source/Пролетающие_нло/frame2.png.import | 40 + .../source/Пролетающие_нло_большие/frame1.png | Bin 0 -> 26589 bytes .../Пролетающие_нло_большие/frame1.png.import | 40 + .../source/Пролетающие_нло_большие/frame2.png | Bin 0 -> 28665 bytes .../Пролетающие_нло_большие/frame2.png.import | 40 + themes/space-pixel/source/Цвета.txt | 0 .../source/Шрифты/VCR OSD Mono Cyr.ttf | Bin 0 -> 30764 bytes .../source/Шрифты/VCR OSD Mono Cyr.ttf.import | 36 + themes_src/space_pixel/Bubble_addtext.png | Bin 0 -> 805 bytes .../space_pixel/Bubble_addtext.png.import | 40 + themes_src/space_pixel/README.md | 29 + themes_src/space_pixel/Window_k_vidache.png | Bin 0 -> 2314 bytes .../space_pixel/Window_k_vidache.png.import | 40 + themes_src/space_pixel/Window_paycard.png | Bin 0 -> 7111 bytes .../space_pixel/Window_paycard.png.import | 40 + .../space_pixel/Window_paynal_balance.png | Bin 0 -> 2310 bytes .../Window_paynal_balance.png.import | 40 + .../Window_paynal_balance_money.png | Bin 0 -> 1728 bytes .../Window_paynal_balance_money.png.import | 40 + .../space_pixel/Window_paynal_instruction.png | Bin 0 -> 7111 bytes .../Window_paynal_instruction.png.import | 40 + themes_src/space_pixel/alien1.png | Bin 0 -> 31719 bytes themes_src/space_pixel/alien1.png.import | 40 + themes_src/space_pixel/alien2.png | Bin 0 -> 31086 bytes themes_src/space_pixel/alien2.png.import | 40 + themes_src/space_pixel/alien3.png | Bin 0 -> 26969 bytes themes_src/space_pixel/alien3.png.import | 40 + .../space_pixel/alien_animation/action.png | Bin 0 -> 19253 bytes .../alien_animation/action.png.import | 40 + .../alien_animation/climbing_action.png | Bin 0 -> 18604 bytes .../climbing_action.png.import | 40 + .../alien_animation/climbing_action_start.png | Bin 0 -> 27008 bytes .../climbing_action_start.png.import | 40 + .../alien_animation/climbing_action_stop.png | Bin 0 -> 24552 bytes .../climbing_action_stop.png.import | 40 + .../alien_animation/climbing_down.png | Bin 0 -> 30360 bytes .../alien_animation/climbing_down.png.import | 40 + .../alien_animation/climbing_start.png | Bin 0 -> 56946 bytes .../alien_animation/climbing_start.png.import | 40 + .../alien_animation/climbing_up.png | Bin 0 -> 31496 bytes .../alien_animation/climbing_up.png.import | 40 + .../alien_animation/come_closer.png | Bin 0 -> 104115 bytes .../alien_animation/come_closer.png.import | 40 + .../space_pixel/alien_animation/dancing.png | Bin 0 -> 260710 bytes .../alien_animation/dancing.png.import | 40 + .../space_pixel/alien_animation/falling.png | Bin 0 -> 72722 bytes .../alien_animation/falling.png.import | 40 + .../space_pixel/alien_animation/hanging.png | Bin 0 -> 45827 bytes .../alien_animation/hanging.png.import | 40 + .../space_pixel/alien_animation/idle.png | Bin 0 -> 38795 bytes .../alien_animation/idle.png.import | 40 + .../space_pixel/alien_animation/landing.png | Bin 0 -> 37776 bytes .../alien_animation/landing.png.import | 40 + .../space_pixel/alien_animation/sitting.png | Bin 0 -> 91909 bytes .../alien_animation/sitting.png.import | 40 + .../space_pixel/alien_animation/turn_left.png | Bin 0 -> 31428 bytes .../alien_animation/turn_left.png.import | 40 + .../alien_animation/turn_right.png | Bin 0 -> 32120 bytes .../alien_animation/turn_right.png.import | 40 + .../alien_animation/walking_left.png | Bin 0 -> 75838 bytes .../alien_animation/walking_left.png.import | 40 + .../alien_animation/walking_left_start.png | Bin 0 -> 21102 bytes .../walking_left_start.png.import | 40 + .../alien_animation/walking_left_stop.png | Bin 0 -> 16114 bytes .../walking_left_stop.png.import | 40 + .../alien_animation/walking_right.png | Bin 0 -> 75986 bytes .../alien_animation/walking_right.png.import | 40 + .../alien_animation/walking_right_stop.png | Bin 0 -> 16122 bytes .../walking_right_stop.png.import | 40 + .../alien_animation/walking_start_right.png | Bin 0 -> 21122 bytes .../walking_start_right.png.import | 40 + themes_src/space_pixel/back_button.png | Bin 0 -> 757 bytes themes_src/space_pixel/back_button.png.import | 40 + themes_src/space_pixel/background.png | Bin 0 -> 96063 bytes themes_src/space_pixel/background.png.import | 40 + themes_src/space_pixel/billboard_ads.png | Bin 0 -> 8086 bytes .../space_pixel/billboard_ads.png.import | 40 + themes_src/space_pixel/bubble1.png | Bin 0 -> 1401 bytes themes_src/space_pixel/bubble1.png.import | 40 + themes_src/space_pixel/bubble2.png | Bin 0 -> 838 bytes themes_src/space_pixel/bubble2.png.import | 40 + themes_src/space_pixel/button_big.png | Bin 0 -> 6175 bytes themes_src/space_pixel/button_big.png.import | 40 + themes_src/space_pixel/button_cancel.png | Bin 0 -> 3586 bytes .../space_pixel/button_cancel.png.import | 40 + themes_src/space_pixel/button_down.png | Bin 0 -> 679 bytes themes_src/space_pixel/button_down.png.import | 40 + themes_src/space_pixel/button_long.png | Bin 0 -> 3952 bytes themes_src/space_pixel/button_long.png.import | 40 + themes_src/space_pixel/button_square.png | Bin 0 -> 555 bytes .../space_pixel/button_square.png.import | 40 + themes_src/space_pixel/button_up.png | Bin 0 -> 668 bytes themes_src/space_pixel/button_up.png.import | 40 + themes_src/space_pixel/climbing_action.png | Bin 0 -> 18604 bytes .../space_pixel/climbing_action.png.import | 40 + .../space_pixel/climbing_action_start.png | Bin 0 -> 27008 bytes .../climbing_action_start.png.import | 40 + .../space_pixel/climbing_action_stop.png | Bin 0 -> 24552 bytes .../climbing_action_stop.png.import | 40 + themes_src/space_pixel/cross.png | Bin 0 -> 228 bytes themes_src/space_pixel/cross.png.import | 40 + themes_src/space_pixel/home.png | Bin 0 -> 259 bytes themes_src/space_pixel/home.png.import | 40 + themes_src/space_pixel/icon.svg | 69 + themes_src/space_pixel/icon.svg.import | 43 + themes_src/space_pixel/less_bar.png | Bin 0 -> 368 bytes themes_src/space_pixel/less_bar.png.import | 40 + themes_src/space_pixel/logo.png | Bin 0 -> 10030 bytes themes_src/space_pixel/logo.png.import | 40 + themes_src/space_pixel/many_bar.png | Bin 0 -> 355 bytes themes_src/space_pixel/many_bar.png.import | 40 + themes_src/space_pixel/star_frame1.png | Bin 0 -> 16919 bytes themes_src/space_pixel/star_frame1.png.import | 40 + themes_src/space_pixel/star_frame2.png | Bin 0 -> 15935 bytes themes_src/space_pixel/star_frame2.png.import | 40 + themes_src/space_pixel/summa_bar.png | Bin 0 -> 456 bytes themes_src/space_pixel/summa_bar.png.import | 40 + themes_src/space_pixel/tumbler_off.png | Bin 0 -> 713 bytes themes_src/space_pixel/tumbler_off.png.import | 40 + themes_src/space_pixel/tumbler_on.png | Bin 0 -> 717 bytes themes_src/space_pixel/tumbler_on.png.import | 40 + .../space_pixel/Анимация_баннер/frame1.png | Bin 0 -> 11491 bytes .../Анимация_баннер/frame1.png.import | 40 + .../space_pixel/Анимация_баннер/frame2.png | Bin 0 -> 11294 bytes .../Анимация_баннер/frame2.png.import | 40 + .../space_pixel/Анимация_купюры/frame1.png | Bin 0 -> 2754 bytes .../Анимация_купюры/frame1.png.import | 40 + .../space_pixel/Анимация_купюры/frame2.png | Bin 0 -> 2588 bytes .../Анимация_купюры/frame2.png.import | 40 + .../space_pixel/Анимация_купюры/frame3.png | Bin 0 -> 2596 bytes .../Анимация_купюры/frame3.png.import | 40 + .../space_pixel/Анимация_купюры/frame4.png | Bin 0 -> 2338 bytes .../Анимация_купюры/frame4.png.import | 40 + .../space_pixel/Анимация_монеты/frame1.png | Bin 0 -> 2624 bytes .../Анимация_монеты/frame1.png.import | 40 + .../space_pixel/Анимация_монеты/frame2.png | Bin 0 -> 2592 bytes .../Анимация_монеты/frame2.png.import | 40 + .../space_pixel/Анимация_монеты/frame3.png | Bin 0 -> 2441 bytes .../Анимация_монеты/frame3.png.import | 40 + .../Анимация_оплата_картой/Frame1.png | Bin 0 -> 3895 bytes .../Анимация_оплата_картой/Frame1.png.import | 40 + .../Анимация_оплата_картой/Frame2.png | Bin 0 -> 4068 bytes .../Анимация_оплата_картой/Frame2.png.import | 40 + .../Анимация_оплата_непрошла/frame1.png | Bin 0 -> 3508 bytes .../frame1.png.import | 40 + .../Анимация_оплата_непрошла/frame2.png | Bin 0 -> 3415 bytes .../frame2.png.import | 40 + .../Анимация_оплата_непрошла/frame3.png | Bin 0 -> 3355 bytes .../frame3.png.import | 40 + .../Анимация_оплата_прошла/frame1.png | Bin 0 -> 3500 bytes .../Анимация_оплата_прошла/frame1.png.import | 40 + .../Анимация_оплата_прошла/frame2.png | Bin 0 -> 3479 bytes .../Анимация_оплата_прошла/frame2.png.import | 40 + .../Анимация_оплата_прошла/frame3.png | Bin 0 -> 3522 bytes .../Анимация_оплата_прошла/frame3.png.import | 40 + .../Анимация_оплата_прошла/frame4.png | Bin 0 -> 3513 bytes .../Анимация_оплата_прошла/frame4.png.import | 40 + .../Анимация_оплата_прошла/frame5.png | Bin 0 -> 3522 bytes .../Анимация_оплата_прошла/frame5.png.import | 40 + .../space_pixel/Пролетающие_нло/frame1.png | Bin 0 -> 1890 bytes .../Пролетающие_нло/frame1.png.import | 40 + .../space_pixel/Пролетающие_нло/frame2.png | Bin 0 -> 2634 bytes .../Пролетающие_нло/frame2.png.import | 40 + .../Пролетающие_нло_большие/frame1.png | Bin 0 -> 26589 bytes .../Пролетающие_нло_большие/frame1.png.import | 40 + .../Пролетающие_нло_большие/frame2.png | Bin 0 -> 28665 bytes .../Пролетающие_нло_большие/frame2.png.import | 40 + themes_src/space_pixel/Цвета.txt | 0 .../space_pixel/Шрифты/VCR OSD Mono Cyr.ttf | Bin 0 -> 30764 bytes .../Шрифты/VCR OSD Mono Cyr.ttf.import | 36 + tools/Import-HostSceneTemplates.ps1 | 115 + tools/Prepare-ThemeWorkspace.ps1 | 86 + tools/Resolve-GodotExecutable.ps1 | 50 + tools/Select-Theme.ps1 | 67 + tools/Sync-HostBindingContract.ps1 | 305 ++ tools/Test-PackagedBindingContract.ps1 | 147 + tools/preview/BindingOverlay.gd | 76 + tools/preview/BindingOverlay.gd.uid | 1 + tools/preview/InteractivePetPreview.gd | 504 +++ tools/preview/InteractivePetPreview.gd.uid | 1 + tools/preview/PetCompositePreviewRuntime.gd | 132 + .../preview/PetCompositePreviewRuntime.gd.uid | 1 + tools/preview/ThemeGallery.gd | 308 ++ tools/preview/ThemeGallery.gd.uid | 1 + tools/preview/interactive_pet_preview.tscn | 284 ++ tools/preview/preview.tscn | 270 ++ tools/probe_pet_approach.gd.uid | 1 + tools/qa_theme_manager_dialogs.gd.uid | 1 + tools/qa_theme_manager_plugin.gd.uid | 1 + tools/validate_theme.gd | 909 ++++ tools/validate_theme.gd.uid | 1 + tools/verify_interactive_pet.gd | 601 +++ tools/verify_interactive_pet.gd.uid | 1 + tools/verify_theme_pck.gd | 80 + tools/verify_theme_pck.gd.uid | 1 + 869 files changed, 98964 insertions(+) create mode 100644 .agents/AGENTS.md create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 AGENTS.md create mode 100644 CONTRIBUTING.md create mode 100644 README.md create mode 100644 activate-theme.ps1 create mode 100644 addons/exchanger_theme_manager/plugin.cfg create mode 100644 addons/exchanger_theme_manager/theme_manager_plugin.gd create mode 100644 addons/exchanger_theme_manager/theme_manager_plugin.gd.uid create mode 100644 addons/godot_ai/LICENSE create mode 100644 addons/godot_ai/README.md create mode 100644 addons/godot_ai/client_configurator.gd create mode 100644 addons/godot_ai/client_configurator.gd.uid create mode 100644 addons/godot_ai/clients/_atomic_write.gd create mode 100644 addons/godot_ai/clients/_atomic_write.gd.uid create mode 100644 addons/godot_ai/clients/_base.gd create mode 100644 addons/godot_ai/clients/_base.gd.uid create mode 100644 addons/godot_ai/clients/_cli_exec.gd create mode 100644 addons/godot_ai/clients/_cli_exec.gd.uid create mode 100644 addons/godot_ai/clients/_cli_finder.gd create mode 100644 addons/godot_ai/clients/_cli_finder.gd.uid create mode 100644 addons/godot_ai/clients/_cli_strategy.gd create mode 100644 addons/godot_ai/clients/_cli_strategy.gd.uid create mode 100644 addons/godot_ai/clients/_dsh_strategy.gd create mode 100644 addons/godot_ai/clients/_dsh_strategy.gd.uid create mode 100644 addons/godot_ai/clients/_json_strategy.gd create mode 100644 addons/godot_ai/clients/_json_strategy.gd.uid create mode 100644 addons/godot_ai/clients/_manual_command.gd create mode 100644 addons/godot_ai/clients/_manual_command.gd.uid create mode 100644 addons/godot_ai/clients/_path_template.gd create mode 100644 addons/godot_ai/clients/_path_template.gd.uid create mode 100644 addons/godot_ai/clients/_registry.gd create mode 100644 addons/godot_ai/clients/_registry.gd.uid create mode 100644 addons/godot_ai/clients/_toml_strategy.gd create mode 100644 addons/godot_ai/clients/_toml_strategy.gd.uid create mode 100644 addons/godot_ai/clients/_yaml_strategy.gd create mode 100644 addons/godot_ai/clients/_yaml_strategy.gd.uid create mode 100644 addons/godot_ai/clients/antigravity.gd create mode 100644 addons/godot_ai/clients/antigravity.gd.uid create mode 100644 addons/godot_ai/clients/cherry_studio.gd create mode 100644 addons/godot_ai/clients/cherry_studio.gd.uid create mode 100644 addons/godot_ai/clients/claude_code.gd create mode 100644 addons/godot_ai/clients/claude_code.gd.uid create mode 100644 addons/godot_ai/clients/claude_desktop.gd create mode 100644 addons/godot_ai/clients/claude_desktop.gd.uid create mode 100644 addons/godot_ai/clients/cline.gd create mode 100644 addons/godot_ai/clients/cline.gd.uid create mode 100644 addons/godot_ai/clients/codex.gd create mode 100644 addons/godot_ai/clients/codex.gd.uid create mode 100644 addons/godot_ai/clients/cursor.gd create mode 100644 addons/godot_ai/clients/cursor.gd.uid create mode 100644 addons/godot_ai/clients/deepseek_harness.gd create mode 100644 addons/godot_ai/clients/deepseek_harness.gd.uid create mode 100644 addons/godot_ai/clients/gemini_cli.gd create mode 100644 addons/godot_ai/clients/gemini_cli.gd.uid create mode 100644 addons/godot_ai/clients/grok.gd create mode 100644 addons/godot_ai/clients/grok.gd.uid create mode 100644 addons/godot_ai/clients/hermes.gd create mode 100644 addons/godot_ai/clients/hermes.gd.uid create mode 100644 addons/godot_ai/clients/kilo_code.gd create mode 100644 addons/godot_ai/clients/kilo_code.gd.uid create mode 100644 addons/godot_ai/clients/kimi_code.gd create mode 100644 addons/godot_ai/clients/kimi_code.gd.uid create mode 100644 addons/godot_ai/clients/kiro.gd create mode 100644 addons/godot_ai/clients/kiro.gd.uid create mode 100644 addons/godot_ai/clients/opencode.gd create mode 100644 addons/godot_ai/clients/opencode.gd.uid create mode 100644 addons/godot_ai/clients/pi.gd create mode 100644 addons/godot_ai/clients/pi.gd.uid create mode 100644 addons/godot_ai/clients/qwen_code.gd create mode 100644 addons/godot_ai/clients/qwen_code.gd.uid create mode 100644 addons/godot_ai/clients/roo_code.gd create mode 100644 addons/godot_ai/clients/roo_code.gd.uid create mode 100644 addons/godot_ai/clients/trae.gd create mode 100644 addons/godot_ai/clients/trae.gd.uid create mode 100644 addons/godot_ai/clients/vscode.gd create mode 100644 addons/godot_ai/clients/vscode.gd.uid create mode 100644 addons/godot_ai/clients/vscode_insiders.gd create mode 100644 addons/godot_ai/clients/vscode_insiders.gd.uid create mode 100644 addons/godot_ai/clients/windsurf.gd create mode 100644 addons/godot_ai/clients/windsurf.gd.uid create mode 100644 addons/godot_ai/clients/zed.gd create mode 100644 addons/godot_ai/clients/zed.gd.uid create mode 100644 addons/godot_ai/clients/zoo_code.gd create mode 100644 addons/godot_ai/clients/zoo_code.gd.uid create mode 100644 addons/godot_ai/connection.gd create mode 100644 addons/godot_ai/connection.gd.uid create mode 100644 addons/godot_ai/custom_tools/custom_tool_wrapper.gd create mode 100644 addons/godot_ai/custom_tools/custom_tool_wrapper.gd.uid create mode 100644 addons/godot_ai/custom_tools/mcp_call_context.gd create mode 100644 addons/godot_ai/custom_tools/mcp_call_context.gd.uid create mode 100644 addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd create mode 100644 addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd.uid create mode 100644 addons/godot_ai/custom_tools/mcp_service_locator.gd create mode 100644 addons/godot_ai/custom_tools/mcp_service_locator.gd.uid create mode 100644 addons/godot_ai/custom_tools/mcp_tool_registry.gd create mode 100644 addons/godot_ai/custom_tools/mcp_tool_registry.gd.uid create mode 100644 addons/godot_ai/debugger/mcp_debugger_plugin.gd create mode 100644 addons/godot_ai/debugger/mcp_debugger_plugin.gd.uid create mode 100644 addons/godot_ai/dispatcher.gd create mode 100644 addons/godot_ai/dispatcher.gd.uid create mode 100644 addons/godot_ai/dock_panels/log_viewer.gd create mode 100644 addons/godot_ai/dock_panels/log_viewer.gd.uid create mode 100644 addons/godot_ai/dock_panels/port_picker_panel.gd create mode 100644 addons/godot_ai/dock_panels/port_picker_panel.gd.uid create mode 100644 addons/godot_ai/export/mcp_export_plugin.gd create mode 100644 addons/godot_ai/export/mcp_export_plugin.gd.uid create mode 100644 addons/godot_ai/handlers/_node_validator.gd create mode 100644 addons/godot_ai/handlers/_node_validator.gd.uid create mode 100644 addons/godot_ai/handlers/_param_validators.gd create mode 100644 addons/godot_ai/handlers/_param_validators.gd.uid create mode 100644 addons/godot_ai/handlers/_property_errors.gd create mode 100644 addons/godot_ai/handlers/_property_errors.gd.uid create mode 100644 addons/godot_ai/handlers/animation_handler.gd create mode 100644 addons/godot_ai/handlers/animation_handler.gd.uid create mode 100644 addons/godot_ai/handlers/animation_presets.gd create mode 100644 addons/godot_ai/handlers/animation_presets.gd.uid create mode 100644 addons/godot_ai/handlers/animation_values.gd create mode 100644 addons/godot_ai/handlers/animation_values.gd.uid create mode 100644 addons/godot_ai/handlers/api_handler.gd create mode 100644 addons/godot_ai/handlers/api_handler.gd.uid create mode 100644 addons/godot_ai/handlers/audio_handler.gd create mode 100644 addons/godot_ai/handlers/audio_handler.gd.uid create mode 100644 addons/godot_ai/handlers/autoload_handler.gd create mode 100644 addons/godot_ai/handlers/autoload_handler.gd.uid create mode 100644 addons/godot_ai/handlers/batch_handler.gd create mode 100644 addons/godot_ai/handlers/batch_handler.gd.uid create mode 100644 addons/godot_ai/handlers/camera_handler.gd create mode 100644 addons/godot_ai/handlers/camera_handler.gd.uid create mode 100644 addons/godot_ai/handlers/camera_presets.gd create mode 100644 addons/godot_ai/handlers/camera_presets.gd.uid create mode 100644 addons/godot_ai/handlers/camera_values.gd create mode 100644 addons/godot_ai/handlers/camera_values.gd.uid create mode 100644 addons/godot_ai/handlers/client_handler.gd create mode 100644 addons/godot_ai/handlers/client_handler.gd.uid create mode 100644 addons/godot_ai/handlers/control_draw_recipe_handler.gd create mode 100644 addons/godot_ai/handlers/control_draw_recipe_handler.gd.uid create mode 100644 addons/godot_ai/handlers/csg_handler.gd create mode 100644 addons/godot_ai/handlers/csg_handler.gd.uid create mode 100644 addons/godot_ai/handlers/curve_handler.gd create mode 100644 addons/godot_ai/handlers/curve_handler.gd.uid create mode 100644 addons/godot_ai/handlers/editor_handler.gd create mode 100644 addons/godot_ai/handlers/editor_handler.gd.uid create mode 100644 addons/godot_ai/handlers/environment_handler.gd create mode 100644 addons/godot_ai/handlers/environment_handler.gd.uid create mode 100644 addons/godot_ai/handlers/filesystem_handler.gd create mode 100644 addons/godot_ai/handlers/filesystem_handler.gd.uid create mode 100644 addons/godot_ai/handlers/gridmap_handler.gd create mode 100644 addons/godot_ai/handlers/gridmap_handler.gd.uid create mode 100644 addons/godot_ai/handlers/input_handler.gd create mode 100644 addons/godot_ai/handlers/input_handler.gd.uid create mode 100644 addons/godot_ai/handlers/material_handler.gd create mode 100644 addons/godot_ai/handlers/material_handler.gd.uid create mode 100644 addons/godot_ai/handlers/material_presets.gd create mode 100644 addons/godot_ai/handlers/material_presets.gd.uid create mode 100644 addons/godot_ai/handlers/material_values.gd create mode 100644 addons/godot_ai/handlers/material_values.gd.uid create mode 100644 addons/godot_ai/handlers/node_handler.gd create mode 100644 addons/godot_ai/handlers/node_handler.gd.uid create mode 100644 addons/godot_ai/handlers/particle_handler.gd create mode 100644 addons/godot_ai/handlers/particle_handler.gd.uid create mode 100644 addons/godot_ai/handlers/particle_presets.gd create mode 100644 addons/godot_ai/handlers/particle_presets.gd.uid create mode 100644 addons/godot_ai/handlers/particle_values.gd create mode 100644 addons/godot_ai/handlers/particle_values.gd.uid create mode 100644 addons/godot_ai/handlers/physics_shape_handler.gd create mode 100644 addons/godot_ai/handlers/physics_shape_handler.gd.uid create mode 100644 addons/godot_ai/handlers/project_handler.gd create mode 100644 addons/godot_ai/handlers/project_handler.gd.uid create mode 100644 addons/godot_ai/handlers/resource_handler.gd create mode 100644 addons/godot_ai/handlers/resource_handler.gd.uid create mode 100644 addons/godot_ai/handlers/scene_handler.gd create mode 100644 addons/godot_ai/handlers/scene_handler.gd.uid create mode 100644 addons/godot_ai/handlers/script_handler.gd create mode 100644 addons/godot_ai/handlers/script_handler.gd.uid create mode 100644 addons/godot_ai/handlers/signal_handler.gd create mode 100644 addons/godot_ai/handlers/signal_handler.gd.uid create mode 100644 addons/godot_ai/handlers/test_handler.gd create mode 100644 addons/godot_ai/handlers/test_handler.gd.uid create mode 100644 addons/godot_ai/handlers/texture_handler.gd create mode 100644 addons/godot_ai/handlers/texture_handler.gd.uid create mode 100644 addons/godot_ai/handlers/theme_handler.gd create mode 100644 addons/godot_ai/handlers/theme_handler.gd.uid create mode 100644 addons/godot_ai/handlers/tilemap_handler.gd create mode 100644 addons/godot_ai/handlers/tilemap_handler.gd.uid create mode 100644 addons/godot_ai/handlers/tileset_handler.gd create mode 100644 addons/godot_ai/handlers/tileset_handler.gd.uid create mode 100644 addons/godot_ai/handlers/ui_handler.gd create mode 100644 addons/godot_ai/handlers/ui_handler.gd.uid create mode 100644 addons/godot_ai/mcp_dock.gd create mode 100644 addons/godot_ai/mcp_dock.gd.uid create mode 100644 addons/godot_ai/plugin.cfg create mode 100644 addons/godot_ai/plugin.gd create mode 100644 addons/godot_ai/plugin.gd.uid create mode 100644 addons/godot_ai/runtime/draw_recipe.gd create mode 100644 addons/godot_ai/runtime/draw_recipe.gd.uid create mode 100644 addons/godot_ai/runtime/editor_logger.gd create mode 100644 addons/godot_ai/runtime/editor_logger.gd.uid create mode 100644 addons/godot_ai/runtime/game_helper.gd create mode 100644 addons/godot_ai/runtime/game_helper.gd.uid create mode 100644 addons/godot_ai/runtime/game_logger.gd create mode 100644 addons/godot_ai/runtime/game_logger.gd.uid create mode 100644 addons/godot_ai/runtime/validation_logger.gd create mode 100644 addons/godot_ai/runtime/validation_logger.gd.uid create mode 100644 addons/godot_ai/telemetry.gd create mode 100644 addons/godot_ai/telemetry.gd.uid create mode 100644 addons/godot_ai/testing/script_error_capture.gd create mode 100644 addons/godot_ai/testing/script_error_capture.gd.uid create mode 100644 addons/godot_ai/testing/test_runner.gd create mode 100644 addons/godot_ai/testing/test_runner.gd.uid create mode 100644 addons/godot_ai/testing/test_suite.gd create mode 100644 addons/godot_ai/testing/test_suite.gd.uid create mode 100644 addons/godot_ai/tool_catalog.gd create mode 100644 addons/godot_ai/tool_catalog.gd.uid create mode 100644 addons/godot_ai/update_reload_runner.gd create mode 100644 addons/godot_ai/update_reload_runner.gd.uid create mode 100644 addons/godot_ai/utils/allow_hosts.gd create mode 100644 addons/godot_ai/utils/allow_hosts.gd.uid create mode 100644 addons/godot_ai/utils/class_introspection.gd create mode 100644 addons/godot_ai/utils/class_introspection.gd.uid create mode 100644 addons/godot_ai/utils/diagnostics_capture.gd create mode 100644 addons/godot_ai/utils/diagnostics_capture.gd.uid create mode 100644 addons/godot_ai/utils/editor_log_buffer.gd create mode 100644 addons/godot_ai/utils/editor_log_buffer.gd.uid create mode 100644 addons/godot_ai/utils/error_codes.gd create mode 100644 addons/godot_ai/utils/error_codes.gd.uid create mode 100644 addons/godot_ai/utils/fuzzy_suggestions.gd create mode 100644 addons/godot_ai/utils/fuzzy_suggestions.gd.uid create mode 100644 addons/godot_ai/utils/game_log_buffer.gd create mode 100644 addons/godot_ai/utils/game_log_buffer.gd.uid create mode 100644 addons/godot_ai/utils/json_values.gd create mode 100644 addons/godot_ai/utils/json_values.gd.uid create mode 100644 addons/godot_ai/utils/log_backtrace.gd create mode 100644 addons/godot_ai/utils/log_backtrace.gd.uid create mode 100644 addons/godot_ai/utils/log_buffer.gd create mode 100644 addons/godot_ai/utils/log_buffer.gd.uid create mode 100644 addons/godot_ai/utils/mcp_adoption_label.gd create mode 100644 addons/godot_ai/utils/mcp_adoption_label.gd.uid create mode 100644 addons/godot_ai/utils/mcp_client_refresh_state.gd create mode 100644 addons/godot_ai/utils/mcp_client_refresh_state.gd.uid create mode 100644 addons/godot_ai/utils/mcp_server_state.gd create mode 100644 addons/godot_ai/utils/mcp_server_state.gd.uid create mode 100644 addons/godot_ai/utils/mcp_startup_path.gd create mode 100644 addons/godot_ai/utils/mcp_startup_path.gd.uid create mode 100644 addons/godot_ai/utils/path_validator.gd create mode 100644 addons/godot_ai/utils/path_validator.gd.uid create mode 100644 addons/godot_ai/utils/port_resolver.gd create mode 100644 addons/godot_ai/utils/port_resolver.gd.uid create mode 100644 addons/godot_ai/utils/resource_io.gd create mode 100644 addons/godot_ai/utils/resource_io.gd.uid create mode 100644 addons/godot_ai/utils/scene_path.gd create mode 100644 addons/godot_ai/utils/scene_path.gd.uid create mode 100644 addons/godot_ai/utils/screenshot_encode.gd create mode 100644 addons/godot_ai/utils/screenshot_encode.gd.uid create mode 100644 addons/godot_ai/utils/server_lifecycle.gd create mode 100644 addons/godot_ai/utils/server_lifecycle.gd.uid create mode 100644 addons/godot_ai/utils/server_version_check.gd create mode 100644 addons/godot_ai/utils/server_version_check.gd.uid create mode 100644 addons/godot_ai/utils/settings.gd create mode 100644 addons/godot_ai/utils/settings.gd.uid create mode 100644 addons/godot_ai/utils/structured_log_ring.gd create mode 100644 addons/godot_ai/utils/structured_log_ring.gd.uid create mode 100644 addons/godot_ai/utils/surfaced_error_tracker.gd create mode 100644 addons/godot_ai/utils/surfaced_error_tracker.gd.uid create mode 100644 addons/godot_ai/utils/update_manager.gd create mode 100644 addons/godot_ai/utils/update_manager.gd.uid create mode 100644 addons/godot_ai/utils/update_mixed_state.gd create mode 100644 addons/godot_ai/utils/update_mixed_state.gd.uid create mode 100644 addons/godot_ai/utils/uv_cache_cleanup.gd create mode 100644 addons/godot_ai/utils/uv_cache_cleanup.gd.uid create mode 100644 addons/godot_ai/utils/variant_serializer.gd create mode 100644 addons/godot_ai/utils/variant_serializer.gd.uid create mode 100644 addons/godot_ai/utils/windows_port_reservation.gd create mode 100644 addons/godot_ai/utils/windows_port_reservation.gd.uid create mode 100644 addons/godot_ai/vision_routing.gd create mode 100644 addons/godot_ai/vision_routing.gd.uid create mode 100644 build-theme.ps1 create mode 100644 contracts/screen_bindings.v2.json create mode 100644 docs/APPLY_THEME.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/BINDING_CONTRACT.md create mode 100644 docs/COMPOSITE_PET_ANIMATIONS.md create mode 100644 docs/PROJECT_CONTEXT.md create mode 100644 docs/QA_AND_TROUBLESHOOTING.md create mode 100644 docs/QUICK_START.md create mode 100644 docs/README.md create mode 100644 docs/SCRIPTING.md create mode 100644 docs/SPACE_PIXEL.md create mode 100644 docs/THEME_AUTHORING.md create mode 100644 docs/THEME_INTEGRATION.md create mode 100644 docs/WORKFLOW.md create mode 100644 export_presets.cfg create mode 100644 godot-ai-LICENSE.txt create mode 100644 preview-theme.ps1 create mode 100644 preview.tscn create mode 100644 preview_scenes/.gdignore create mode 100644 preview_scenes/CardAmountPreview.tscn create mode 100644 preview_scenes/CardCustomPreview.tscn create mode 100644 preview_scenes/CardTerminalPreview.tscn create mode 100644 preview_scenes/CashPreview.tscn create mode 100644 preview_scenes/ErrorPreview.tscn create mode 100644 preview_scenes/HomePreview.tscn create mode 100644 preview_scenes/PreviewFooter.tscn create mode 100644 preview_scenes/PreviewLiveReload.gd create mode 100644 preview_scenes/ServiceAccessPreview.tscn create mode 100644 preview_scenes/SettingsPreview.gd create mode 100644 preview_scenes/SettingsPreview.tscn create mode 100644 preview_scenes/SuccessPreview.tscn create mode 100644 project.godot create mode 100644 test-theme.ps1 create mode 100644 themes/example/README.md create mode 100644 themes/example/package/assets/background/background.png create mode 100644 themes/example/package/assets/background/background.png.import create mode 100644 themes/example/package/assets/ui/keyboard_hide.svg create mode 100644 themes/example/package/assets/ui/keyboard_hide.svg.import create mode 100644 themes/example/package/background_decoration.tscn create mode 100644 themes/example/package/components/footer.tscn create mode 100644 themes/example/package/components/on_screen_keyboards.tscn create mode 100644 themes/example/package/contracts/screen_bindings.v2.json create mode 100644 themes/example/package/manifest.json create mode 100644 themes/example/package/scenes/screen_card_amount.tscn create mode 100644 themes/example/package/scenes/screen_card_custom_amount.tscn create mode 100644 themes/example/package/scenes/screen_card_terminal.tscn create mode 100644 themes/example/package/scenes/screen_cash_payment.tscn create mode 100644 themes/example/package/scenes/screen_error.tscn create mode 100644 themes/example/package/scenes/screen_home.tscn create mode 100644 themes/example/package/scenes/screen_service_access.tscn create mode 100644 themes/example/package/scenes/screen_settings.tscn create mode 100644 themes/example/package/scenes/screen_success.tscn create mode 100644 themes/example/package/scripts/decoration_controller.gd create mode 100644 themes/example/package/scripts/decoration_controller.gd.uid create mode 100644 themes/example/package/ui_theme.tres create mode 100644 themes/example/source/README.md create mode 100644 themes/example/source/interactive_pet/README.md create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/action.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/action.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_down.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_down.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_start.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_start.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_up.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/climbing_up.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/come_closer.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/come_closer.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/dancing.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/dancing.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/falling.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/falling.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/hanging.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/hanging.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/idle.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/idle.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/landing.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/landing.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/sitting.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/sitting.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/turn_left.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/turn_left.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/turn_right.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/turn_right.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left_stop.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_left_stop.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_right.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_right.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png.import create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png create mode 100644 themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png.import create mode 100644 themes/space-pixel/package/assets/animations/banner/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/banner/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/banner/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/banner/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_03.png create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_03.png.import create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_04.png create mode 100644 themes/space-pixel/package/assets/animations/bill/frame_04.png.import create mode 100644 themes/space-pixel/package/assets/animations/card/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/card/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/card/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/card/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_03.png create mode 100644 themes/space-pixel/package/assets/animations/coin/frame_03.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_03.png create mode 100644 themes/space-pixel/package/assets/animations/payment_failed/frame_03.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_03.png create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_03.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_04.png create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_04.png.import create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_05.png create mode 100644 themes/space-pixel/package/assets/animations/payment_success/frame_05.png.import create mode 100644 themes/space-pixel/package/assets/animations/ufo_large/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/ufo_large/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/ufo_large/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/ufo_large/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/animations/ufo_small/frame_01.png create mode 100644 themes/space-pixel/package/assets/animations/ufo_small/frame_01.png.import create mode 100644 themes/space-pixel/package/assets/animations/ufo_small/frame_02.png create mode 100644 themes/space-pixel/package/assets/animations/ufo_small/frame_02.png.import create mode 100644 themes/space-pixel/package/assets/background/background.png create mode 100644 themes/space-pixel/package/assets/background/background.png.import create mode 100644 themes/space-pixel/package/assets/decorations/alien1.png create mode 100644 themes/space-pixel/package/assets/decorations/alien1.png.import create mode 100644 themes/space-pixel/package/assets/decorations/alien2.png create mode 100644 themes/space-pixel/package/assets/decorations/alien2.png.import create mode 100644 themes/space-pixel/package/assets/decorations/alien3.png create mode 100644 themes/space-pixel/package/assets/decorations/alien3.png.import create mode 100644 themes/space-pixel/package/assets/decorations/stars_1.png create mode 100644 themes/space-pixel/package/assets/decorations/stars_1.png.import create mode 100644 themes/space-pixel/package/assets/decorations/stars_2.png create mode 100644 themes/space-pixel/package/assets/decorations/stars_2.png.import create mode 100644 themes/space-pixel/package/assets/fonts/vcr_osd_mono_cyr.ttf create mode 100644 themes/space-pixel/package/assets/fonts/vcr_osd_mono_cyr.ttf.import create mode 100644 themes/space-pixel/package/assets/ui/back_button.png create mode 100644 themes/space-pixel/package/assets/ui/back_button.png.import create mode 100644 themes/space-pixel/package/assets/ui/billboard_ads.png create mode 100644 themes/space-pixel/package/assets/ui/billboard_ads.png.import create mode 100644 themes/space-pixel/package/assets/ui/bubble_large.png create mode 100644 themes/space-pixel/package/assets/ui/bubble_large.png.import create mode 100644 themes/space-pixel/package/assets/ui/bubble_small.png create mode 100644 themes/space-pixel/package/assets/ui/bubble_small.png.import create mode 100644 themes/space-pixel/package/assets/ui/bubble_text.png create mode 100644 themes/space-pixel/package/assets/ui/bubble_text.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_big.png create mode 100644 themes/space-pixel/package/assets/ui/button_big.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_cancel.png create mode 100644 themes/space-pixel/package/assets/ui/button_cancel.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_down.png create mode 100644 themes/space-pixel/package/assets/ui/button_down.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_long.png create mode 100644 themes/space-pixel/package/assets/ui/button_long.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_square.png create mode 100644 themes/space-pixel/package/assets/ui/button_square.png.import create mode 100644 themes/space-pixel/package/assets/ui/button_up.png create mode 100644 themes/space-pixel/package/assets/ui/button_up.png.import create mode 100644 themes/space-pixel/package/assets/ui/interactive_pet/cross.png create mode 100644 themes/space-pixel/package/assets/ui/interactive_pet/cross.png.import create mode 100644 themes/space-pixel/package/assets/ui/interactive_pet/home.png create mode 100644 themes/space-pixel/package/assets/ui/interactive_pet/home.png.import create mode 100644 themes/space-pixel/package/assets/ui/logo.png create mode 100644 themes/space-pixel/package/assets/ui/logo.png.import create mode 100644 themes/space-pixel/package/assets/ui/panel_card.png create mode 100644 themes/space-pixel/package/assets/ui/panel_card.png.import create mode 100644 themes/space-pixel/package/assets/ui/panel_dispense.png create mode 100644 themes/space-pixel/package/assets/ui/panel_dispense.png.import create mode 100644 themes/space-pixel/package/assets/ui/panel_large.png create mode 100644 themes/space-pixel/package/assets/ui/panel_large.png.import create mode 100644 themes/space-pixel/package/assets/ui/panel_medium.png create mode 100644 themes/space-pixel/package/assets/ui/panel_medium.png.import create mode 100644 themes/space-pixel/package/assets/ui/panel_wide.png create mode 100644 themes/space-pixel/package/assets/ui/panel_wide.png.import create mode 100644 themes/space-pixel/package/assets/ui/stock_low.png create mode 100644 themes/space-pixel/package/assets/ui/stock_low.png.import create mode 100644 themes/space-pixel/package/assets/ui/stock_many.png create mode 100644 themes/space-pixel/package/assets/ui/stock_many.png.import create mode 100644 themes/space-pixel/package/assets/ui/sum_bar.png create mode 100644 themes/space-pixel/package/assets/ui/sum_bar.png.import create mode 100644 themes/space-pixel/package/assets/ui/tumbler_off.png create mode 100644 themes/space-pixel/package/assets/ui/tumbler_off.png.import create mode 100644 themes/space-pixel/package/assets/ui/tumbler_on.png create mode 100644 themes/space-pixel/package/assets/ui/tumbler_on.png.import create mode 100644 themes/space-pixel/package/background_decoration.tscn create mode 100644 themes/space-pixel/package/components/footer.tscn create mode 100644 themes/space-pixel/package/components/interactive_pet.tscn create mode 100644 themes/space-pixel/package/components/on_screen_keyboards.tscn create mode 100644 themes/space-pixel/package/contracts/screen_bindings.v2.json create mode 100644 themes/space-pixel/package/manifest.json create mode 100644 themes/space-pixel/package/scenes/screen_card_amount.tscn create mode 100644 themes/space-pixel/package/scenes/screen_card_custom_amount.tscn create mode 100644 themes/space-pixel/package/scenes/screen_card_terminal.tscn create mode 100644 themes/space-pixel/package/scenes/screen_cash_payment.tscn create mode 100644 themes/space-pixel/package/scenes/screen_error.tscn create mode 100644 themes/space-pixel/package/scenes/screen_home.tscn create mode 100644 themes/space-pixel/package/scenes/screen_service_access.tscn create mode 100644 themes/space-pixel/package/scenes/screen_settings.tscn create mode 100644 themes/space-pixel/package/scenes/screen_success.tscn create mode 100644 themes/space-pixel/package/scripts/home_reference_label.gd create mode 100644 themes/space-pixel/package/scripts/home_reference_label.gd.uid create mode 100644 themes/space-pixel/package/scripts/home_stock_presenter.gd create mode 100644 themes/space-pixel/package/scripts/home_stock_presenter.gd.uid create mode 100644 themes/space-pixel/package/scripts/home_ufo_bobbing.gd create mode 100644 themes/space-pixel/package/scripts/home_ufo_bobbing.gd.uid create mode 100644 themes/space-pixel/package/scripts/interactive_pet.gd create mode 100644 themes/space-pixel/package/scripts/interactive_pet.gd.uid create mode 100644 themes/space-pixel/package/scripts/stable_banner_animation.gd create mode 100644 themes/space-pixel/package/scripts/stable_banner_animation.gd.uid create mode 100644 themes/space-pixel/package/scripts/ufo_flight_controller.gd create mode 100644 themes/space-pixel/package/scripts/ufo_flight_controller.gd.uid create mode 100644 themes/space-pixel/package/ui_theme.tres create mode 100644 themes/space-pixel/package/visuals/card_terminal.tscn create mode 100644 themes/space-pixel/package/visuals/cash_instructions.tscn create mode 100644 themes/space-pixel/package/visuals/cash_tip.tscn create mode 100644 themes/space-pixel/package/visuals/home_advertisement.tscn create mode 100644 themes/space-pixel/package/visuals/home_top.tscn create mode 100644 themes/space-pixel/package/visuals/result_error.tscn create mode 100644 themes/space-pixel/package/visuals/result_success.tscn create mode 100644 themes/space-pixel/source/Bubble_addtext.png create mode 100644 themes/space-pixel/source/Bubble_addtext.png.import create mode 100644 themes/space-pixel/source/README.md create mode 100644 themes/space-pixel/source/Window_k_vidache.png create mode 100644 themes/space-pixel/source/Window_k_vidache.png.import create mode 100644 themes/space-pixel/source/Window_paycard.png create mode 100644 themes/space-pixel/source/Window_paycard.png.import create mode 100644 themes/space-pixel/source/Window_paynal_balance.png create mode 100644 themes/space-pixel/source/Window_paynal_balance.png.import create mode 100644 themes/space-pixel/source/Window_paynal_balance_money.png create mode 100644 themes/space-pixel/source/Window_paynal_balance_money.png.import create mode 100644 themes/space-pixel/source/Window_paynal_instruction.png create mode 100644 themes/space-pixel/source/Window_paynal_instruction.png.import create mode 100644 themes/space-pixel/source/alien1.png create mode 100644 themes/space-pixel/source/alien1.png.import create mode 100644 themes/space-pixel/source/alien2.png create mode 100644 themes/space-pixel/source/alien2.png.import create mode 100644 themes/space-pixel/source/alien3.png create mode 100644 themes/space-pixel/source/alien3.png.import create mode 100644 themes/space-pixel/source/alien_animation/action.png create mode 100644 themes/space-pixel/source/alien_animation/action.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_action.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_action.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_action_start.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_action_start.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_action_stop.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_action_stop.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_down.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_down.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_start.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_start.png.import create mode 100644 themes/space-pixel/source/alien_animation/climbing_up.png create mode 100644 themes/space-pixel/source/alien_animation/climbing_up.png.import create mode 100644 themes/space-pixel/source/alien_animation/come_closer.png create mode 100644 themes/space-pixel/source/alien_animation/come_closer.png.import create mode 100644 themes/space-pixel/source/alien_animation/dancing.png create mode 100644 themes/space-pixel/source/alien_animation/dancing.png.import create mode 100644 themes/space-pixel/source/alien_animation/falling.png create mode 100644 themes/space-pixel/source/alien_animation/falling.png.import create mode 100644 themes/space-pixel/source/alien_animation/hanging.png create mode 100644 themes/space-pixel/source/alien_animation/hanging.png.import create mode 100644 themes/space-pixel/source/alien_animation/idle.png create mode 100644 themes/space-pixel/source/alien_animation/idle.png.import create mode 100644 themes/space-pixel/source/alien_animation/landing.png create mode 100644 themes/space-pixel/source/alien_animation/landing.png.import create mode 100644 themes/space-pixel/source/alien_animation/sitting.png create mode 100644 themes/space-pixel/source/alien_animation/sitting.png.import create mode 100644 themes/space-pixel/source/alien_animation/turn_left.png create mode 100644 themes/space-pixel/source/alien_animation/turn_left.png.import create mode 100644 themes/space-pixel/source/alien_animation/turn_right.png create mode 100644 themes/space-pixel/source/alien_animation/turn_right.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_left.png create mode 100644 themes/space-pixel/source/alien_animation/walking_left.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_left_start.png create mode 100644 themes/space-pixel/source/alien_animation/walking_left_start.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_left_stop.png create mode 100644 themes/space-pixel/source/alien_animation/walking_left_stop.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_right.png create mode 100644 themes/space-pixel/source/alien_animation/walking_right.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_right_stop.png create mode 100644 themes/space-pixel/source/alien_animation/walking_right_stop.png.import create mode 100644 themes/space-pixel/source/alien_animation/walking_start_right.png create mode 100644 themes/space-pixel/source/alien_animation/walking_start_right.png.import create mode 100644 themes/space-pixel/source/back_button.png create mode 100644 themes/space-pixel/source/back_button.png.import create mode 100644 themes/space-pixel/source/background.png create mode 100644 themes/space-pixel/source/background.png.import create mode 100644 themes/space-pixel/source/billboard_ads.png create mode 100644 themes/space-pixel/source/billboard_ads.png.import create mode 100644 themes/space-pixel/source/bubble1.png create mode 100644 themes/space-pixel/source/bubble1.png.import create mode 100644 themes/space-pixel/source/bubble2.png create mode 100644 themes/space-pixel/source/bubble2.png.import create mode 100644 themes/space-pixel/source/button_big.png create mode 100644 themes/space-pixel/source/button_big.png.import create mode 100644 themes/space-pixel/source/button_down.png create mode 100644 themes/space-pixel/source/button_down.png.import create mode 100644 themes/space-pixel/source/button_long.png create mode 100644 themes/space-pixel/source/button_long.png.import create mode 100644 themes/space-pixel/source/button_square.png create mode 100644 themes/space-pixel/source/button_square.png.import create mode 100644 themes/space-pixel/source/button_up.png create mode 100644 themes/space-pixel/source/button_up.png.import create mode 100644 themes/space-pixel/source/climbing_action.png create mode 100644 themes/space-pixel/source/climbing_action.png.import create mode 100644 themes/space-pixel/source/climbing_action_start.png create mode 100644 themes/space-pixel/source/climbing_action_start.png.import create mode 100644 themes/space-pixel/source/climbing_action_stop.png create mode 100644 themes/space-pixel/source/climbing_action_stop.png.import create mode 100644 themes/space-pixel/source/cross.png create mode 100644 themes/space-pixel/source/cross.png.import create mode 100644 themes/space-pixel/source/home.png create mode 100644 themes/space-pixel/source/home.png.import create mode 100644 themes/space-pixel/source/less_bar.png create mode 100644 themes/space-pixel/source/less_bar.png.import create mode 100644 themes/space-pixel/source/logo.png create mode 100644 themes/space-pixel/source/logo.png.import create mode 100644 themes/space-pixel/source/many_bar.png create mode 100644 themes/space-pixel/source/many_bar.png.import create mode 100644 themes/space-pixel/source/star_frame1.png create mode 100644 themes/space-pixel/source/star_frame1.png.import create mode 100644 themes/space-pixel/source/star_frame2.png create mode 100644 themes/space-pixel/source/star_frame2.png.import create mode 100644 themes/space-pixel/source/summa_bar.png create mode 100644 themes/space-pixel/source/summa_bar.png.import create mode 100644 themes/space-pixel/source/tumbler_off.png create mode 100644 themes/space-pixel/source/tumbler_off.png.import create mode 100644 themes/space-pixel/source/tumbler_on.png create mode 100644 themes/space-pixel/source/tumbler_on.png.import create mode 100644 themes/space-pixel/source/Анимация_баннер/frame1.png create mode 100644 themes/space-pixel/source/Анимация_баннер/frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_баннер/frame2.png create mode 100644 themes/space-pixel/source/Анимация_баннер/frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_купюры/frame1.png create mode 100644 themes/space-pixel/source/Анимация_купюры/frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_купюры/frame2.png create mode 100644 themes/space-pixel/source/Анимация_купюры/frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_купюры/frame3.png create mode 100644 themes/space-pixel/source/Анимация_купюры/frame3.png.import create mode 100644 themes/space-pixel/source/Анимация_купюры/frame4.png create mode 100644 themes/space-pixel/source/Анимация_купюры/frame4.png.import create mode 100644 themes/space-pixel/source/Анимация_монеты/frame1.png create mode 100644 themes/space-pixel/source/Анимация_монеты/frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_монеты/frame2.png create mode 100644 themes/space-pixel/source/Анимация_монеты/frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_монеты/frame3.png create mode 100644 themes/space-pixel/source/Анимация_монеты/frame3.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_картой/Frame1.png create mode 100644 themes/space-pixel/source/Анимация_оплата_картой/Frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_картой/Frame2.png create mode 100644 themes/space-pixel/source/Анимация_оплата_картой/Frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png create mode 100644 themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame1.png create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame1.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame2.png create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame2.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame3.png create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame3.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame4.png create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame4.png.import create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame5.png create mode 100644 themes/space-pixel/source/Анимация_оплата_прошла/frame5.png.import create mode 100644 themes/space-pixel/source/Пролетающие_нло/frame1.png create mode 100644 themes/space-pixel/source/Пролетающие_нло/frame1.png.import create mode 100644 themes/space-pixel/source/Пролетающие_нло/frame2.png create mode 100644 themes/space-pixel/source/Пролетающие_нло/frame2.png.import create mode 100644 themes/space-pixel/source/Пролетающие_нло_большие/frame1.png create mode 100644 themes/space-pixel/source/Пролетающие_нло_большие/frame1.png.import create mode 100644 themes/space-pixel/source/Пролетающие_нло_большие/frame2.png create mode 100644 themes/space-pixel/source/Пролетающие_нло_большие/frame2.png.import create mode 100644 themes/space-pixel/source/Цвета.txt create mode 100644 themes/space-pixel/source/Шрифты/VCR OSD Mono Cyr.ttf create mode 100644 themes/space-pixel/source/Шрифты/VCR OSD Mono Cyr.ttf.import create mode 100644 themes_src/space_pixel/Bubble_addtext.png create mode 100644 themes_src/space_pixel/Bubble_addtext.png.import create mode 100644 themes_src/space_pixel/README.md create mode 100644 themes_src/space_pixel/Window_k_vidache.png create mode 100644 themes_src/space_pixel/Window_k_vidache.png.import create mode 100644 themes_src/space_pixel/Window_paycard.png create mode 100644 themes_src/space_pixel/Window_paycard.png.import create mode 100644 themes_src/space_pixel/Window_paynal_balance.png create mode 100644 themes_src/space_pixel/Window_paynal_balance.png.import create mode 100644 themes_src/space_pixel/Window_paynal_balance_money.png create mode 100644 themes_src/space_pixel/Window_paynal_balance_money.png.import create mode 100644 themes_src/space_pixel/Window_paynal_instruction.png create mode 100644 themes_src/space_pixel/Window_paynal_instruction.png.import create mode 100644 themes_src/space_pixel/alien1.png create mode 100644 themes_src/space_pixel/alien1.png.import create mode 100644 themes_src/space_pixel/alien2.png create mode 100644 themes_src/space_pixel/alien2.png.import create mode 100644 themes_src/space_pixel/alien3.png create mode 100644 themes_src/space_pixel/alien3.png.import create mode 100644 themes_src/space_pixel/alien_animation/action.png create mode 100644 themes_src/space_pixel/alien_animation/action.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_action.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_action.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_action_start.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_action_start.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_action_stop.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_action_stop.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_down.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_down.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_start.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_start.png.import create mode 100644 themes_src/space_pixel/alien_animation/climbing_up.png create mode 100644 themes_src/space_pixel/alien_animation/climbing_up.png.import create mode 100644 themes_src/space_pixel/alien_animation/come_closer.png create mode 100644 themes_src/space_pixel/alien_animation/come_closer.png.import create mode 100644 themes_src/space_pixel/alien_animation/dancing.png create mode 100644 themes_src/space_pixel/alien_animation/dancing.png.import create mode 100644 themes_src/space_pixel/alien_animation/falling.png create mode 100644 themes_src/space_pixel/alien_animation/falling.png.import create mode 100644 themes_src/space_pixel/alien_animation/hanging.png create mode 100644 themes_src/space_pixel/alien_animation/hanging.png.import create mode 100644 themes_src/space_pixel/alien_animation/idle.png create mode 100644 themes_src/space_pixel/alien_animation/idle.png.import create mode 100644 themes_src/space_pixel/alien_animation/landing.png create mode 100644 themes_src/space_pixel/alien_animation/landing.png.import create mode 100644 themes_src/space_pixel/alien_animation/sitting.png create mode 100644 themes_src/space_pixel/alien_animation/sitting.png.import create mode 100644 themes_src/space_pixel/alien_animation/turn_left.png create mode 100644 themes_src/space_pixel/alien_animation/turn_left.png.import create mode 100644 themes_src/space_pixel/alien_animation/turn_right.png create mode 100644 themes_src/space_pixel/alien_animation/turn_right.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_left.png create mode 100644 themes_src/space_pixel/alien_animation/walking_left.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_left_start.png create mode 100644 themes_src/space_pixel/alien_animation/walking_left_start.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_left_stop.png create mode 100644 themes_src/space_pixel/alien_animation/walking_left_stop.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_right.png create mode 100644 themes_src/space_pixel/alien_animation/walking_right.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_right_stop.png create mode 100644 themes_src/space_pixel/alien_animation/walking_right_stop.png.import create mode 100644 themes_src/space_pixel/alien_animation/walking_start_right.png create mode 100644 themes_src/space_pixel/alien_animation/walking_start_right.png.import create mode 100644 themes_src/space_pixel/back_button.png create mode 100644 themes_src/space_pixel/back_button.png.import create mode 100644 themes_src/space_pixel/background.png create mode 100644 themes_src/space_pixel/background.png.import create mode 100644 themes_src/space_pixel/billboard_ads.png create mode 100644 themes_src/space_pixel/billboard_ads.png.import create mode 100644 themes_src/space_pixel/bubble1.png create mode 100644 themes_src/space_pixel/bubble1.png.import create mode 100644 themes_src/space_pixel/bubble2.png create mode 100644 themes_src/space_pixel/bubble2.png.import create mode 100644 themes_src/space_pixel/button_big.png create mode 100644 themes_src/space_pixel/button_big.png.import create mode 100644 themes_src/space_pixel/button_cancel.png create mode 100644 themes_src/space_pixel/button_cancel.png.import create mode 100644 themes_src/space_pixel/button_down.png create mode 100644 themes_src/space_pixel/button_down.png.import create mode 100644 themes_src/space_pixel/button_long.png create mode 100644 themes_src/space_pixel/button_long.png.import create mode 100644 themes_src/space_pixel/button_square.png create mode 100644 themes_src/space_pixel/button_square.png.import create mode 100644 themes_src/space_pixel/button_up.png create mode 100644 themes_src/space_pixel/button_up.png.import create mode 100644 themes_src/space_pixel/climbing_action.png create mode 100644 themes_src/space_pixel/climbing_action.png.import create mode 100644 themes_src/space_pixel/climbing_action_start.png create mode 100644 themes_src/space_pixel/climbing_action_start.png.import create mode 100644 themes_src/space_pixel/climbing_action_stop.png create mode 100644 themes_src/space_pixel/climbing_action_stop.png.import create mode 100644 themes_src/space_pixel/cross.png create mode 100644 themes_src/space_pixel/cross.png.import create mode 100644 themes_src/space_pixel/home.png create mode 100644 themes_src/space_pixel/home.png.import create mode 100644 themes_src/space_pixel/icon.svg create mode 100644 themes_src/space_pixel/icon.svg.import create mode 100644 themes_src/space_pixel/less_bar.png create mode 100644 themes_src/space_pixel/less_bar.png.import create mode 100644 themes_src/space_pixel/logo.png create mode 100644 themes_src/space_pixel/logo.png.import create mode 100644 themes_src/space_pixel/many_bar.png create mode 100644 themes_src/space_pixel/many_bar.png.import create mode 100644 themes_src/space_pixel/star_frame1.png create mode 100644 themes_src/space_pixel/star_frame1.png.import create mode 100644 themes_src/space_pixel/star_frame2.png create mode 100644 themes_src/space_pixel/star_frame2.png.import create mode 100644 themes_src/space_pixel/summa_bar.png create mode 100644 themes_src/space_pixel/summa_bar.png.import create mode 100644 themes_src/space_pixel/tumbler_off.png create mode 100644 themes_src/space_pixel/tumbler_off.png.import create mode 100644 themes_src/space_pixel/tumbler_on.png create mode 100644 themes_src/space_pixel/tumbler_on.png.import create mode 100644 themes_src/space_pixel/Анимация_баннер/frame1.png create mode 100644 themes_src/space_pixel/Анимация_баннер/frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_баннер/frame2.png create mode 100644 themes_src/space_pixel/Анимация_баннер/frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_купюры/frame1.png create mode 100644 themes_src/space_pixel/Анимация_купюры/frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_купюры/frame2.png create mode 100644 themes_src/space_pixel/Анимация_купюры/frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_купюры/frame3.png create mode 100644 themes_src/space_pixel/Анимация_купюры/frame3.png.import create mode 100644 themes_src/space_pixel/Анимация_купюры/frame4.png create mode 100644 themes_src/space_pixel/Анимация_купюры/frame4.png.import create mode 100644 themes_src/space_pixel/Анимация_монеты/frame1.png create mode 100644 themes_src/space_pixel/Анимация_монеты/frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_монеты/frame2.png create mode 100644 themes_src/space_pixel/Анимация_монеты/frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_монеты/frame3.png create mode 100644 themes_src/space_pixel/Анимация_монеты/frame3.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_картой/Frame1.png create mode 100644 themes_src/space_pixel/Анимация_оплата_картой/Frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_картой/Frame2.png create mode 100644 themes_src/space_pixel/Анимация_оплата_картой/Frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png create mode 100644 themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame1.png create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame1.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame2.png create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame2.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame3.png create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame3.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame4.png create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame4.png.import create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame5.png create mode 100644 themes_src/space_pixel/Анимация_оплата_прошла/frame5.png.import create mode 100644 themes_src/space_pixel/Пролетающие_нло/frame1.png create mode 100644 themes_src/space_pixel/Пролетающие_нло/frame1.png.import create mode 100644 themes_src/space_pixel/Пролетающие_нло/frame2.png create mode 100644 themes_src/space_pixel/Пролетающие_нло/frame2.png.import create mode 100644 themes_src/space_pixel/Пролетающие_нло_большие/frame1.png create mode 100644 themes_src/space_pixel/Пролетающие_нло_большие/frame1.png.import create mode 100644 themes_src/space_pixel/Пролетающие_нло_большие/frame2.png create mode 100644 themes_src/space_pixel/Пролетающие_нло_большие/frame2.png.import create mode 100644 themes_src/space_pixel/Цвета.txt create mode 100644 themes_src/space_pixel/Шрифты/VCR OSD Mono Cyr.ttf create mode 100644 themes_src/space_pixel/Шрифты/VCR OSD Mono Cyr.ttf.import create mode 100644 tools/Import-HostSceneTemplates.ps1 create mode 100644 tools/Prepare-ThemeWorkspace.ps1 create mode 100644 tools/Resolve-GodotExecutable.ps1 create mode 100644 tools/Select-Theme.ps1 create mode 100644 tools/Sync-HostBindingContract.ps1 create mode 100644 tools/Test-PackagedBindingContract.ps1 create mode 100644 tools/preview/BindingOverlay.gd create mode 100644 tools/preview/BindingOverlay.gd.uid create mode 100644 tools/preview/InteractivePetPreview.gd create mode 100644 tools/preview/InteractivePetPreview.gd.uid create mode 100644 tools/preview/PetCompositePreviewRuntime.gd create mode 100644 tools/preview/PetCompositePreviewRuntime.gd.uid create mode 100644 tools/preview/ThemeGallery.gd create mode 100644 tools/preview/ThemeGallery.gd.uid create mode 100644 tools/preview/interactive_pet_preview.tscn create mode 100644 tools/preview/preview.tscn create mode 100644 tools/probe_pet_approach.gd.uid create mode 100644 tools/qa_theme_manager_dialogs.gd.uid create mode 100644 tools/qa_theme_manager_plugin.gd.uid create mode 100644 tools/validate_theme.gd create mode 100644 tools/validate_theme.gd.uid create mode 100644 tools/verify_interactive_pet.gd create mode 100644 tools/verify_interactive_pet.gd.uid create mode 100644 tools/verify_theme_pck.gd create mode 100644 tools/verify_theme_pck.gd.uid diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md new file mode 100644 index 0000000..52d6dde --- /dev/null +++ b/.agents/AGENTS.md @@ -0,0 +1,5 @@ +# Указатель + +Единственные актуальные инструкции агентов находятся в корневом [AGENTS.md](../AGENTS.md). +Перед работой прочитайте его полностью; этот файл не содержит отдельного набора правил. + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ec6790 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Godot и локальные результаты сборки +.godot/ +build/ +*.pck + +# Локальные визуальные референсы не входят в поставку +themes_src/**/references/ +themes/**/source/references/ + +# Метаданные ОС +Thumbs.db +.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..8b0fcbb --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "geequlim.godot-tools", + "ms-vscode.powershell" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2fe8bd5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.exclude": { + ".godot": true + }, + "search.exclude": { + ".godot": true, + "build": true, + "themes_src": true, + "preview_scenes": true + }, + "godotTools.editorPath.godot4": "d:\\Applications\\Godot\\Godot_v4.7.1-stable_mono_win64\\Godot_v4.7.1-stable_mono_win64.exe" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..6a81280 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,164 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Theme: активировать", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\activate-theme.ps1", + "-ThemeId", + "${input:themeId}" + ], + "problemMatcher": [] + }, + { + "label": "Theme: запустить preview", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\preview-theme.ps1", + "-ThemeId", + "${input:themeId}" + ], + "problemMatcher": [] + }, + { + "label": "Theme: проверить validator и preview smoke", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\test-theme.ps1", + "-ThemeId", + "${input:themeId}" + ], + "group": "test", + "problemMatcher": [] + }, + { + "label": "Theme: проверить только validator", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\test-theme.ps1", + "-ThemeId", + "${input:themeId}", + "-SkipPreviewSmoke" + ], + "group": "test", + "problemMatcher": [] + }, + { + "label": "Theme: проверить копии контракта", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\tools\\Test-PackagedBindingContract.ps1" + ], + "group": "test", + "problemMatcher": [] + }, + { + "label": "Theme: сверить контракт с Exchanger", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\tools\\Sync-HostBindingContract.ps1", + "-HostProject", + "${input:hostProject}", + "-Check" + ], + "group": "test", + "problemMatcher": [] + }, + { + "label": "Theme: собрать PCK", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\build-theme.ps1", + "-ThemeId", + "${input:themeId}" + ], + "group": "build", + "problemMatcher": [] + }, + { + "label": "Theme: собрать и установить PCK (заменяет установленную тему)", + "detail": "Перезаписывает active_theme.pck в пользовательском каталоге Exchanger.", + "type": "process", + "command": "powershell.exe", + "args": [ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + "${workspaceFolder}\\build-theme.ps1", + "-ThemeId", + "${input:themeId}", + "-InstallToDefaultUserPath" + ], + "problemMatcher": [] + }, + { + "label": "Theme: полный локальный QA", + "dependsOrder": "sequence", + "dependsOn": [ + "Theme: проверить копии контракта", + "Theme: проверить validator и preview smoke", + "Theme: собрать PCK" + ], + "problemMatcher": [] + } + ], + "inputs": [ + { + "id": "themeId", + "type": "promptString", + "description": "ID каталога темы внутри themes/", + "default": "space-pixel" + }, + { + "id": "hostProject", + "type": "promptString", + "description": "Полный или относительный путь к совместимому проекту Exchanger", + "default": "..\\exchanger" + } + ] +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4fc742b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,101 @@ +# Инструкции для ИИ-агентов + +Этот файл — единственный авторитетный набор агентских правил для проекта +`ExchangerThemeDlcBuilder`. Перед любым изменением прочитайте его полностью. + +## Назначение и границы проекта + +- Проект создаёт, проверяет, показывает и собирает внешние PCK-темы Exchanger. +- Рабочая область агента по умолчанию ограничена этой папкой. Соседний проект Exchanger можно + читать для сверки host-контракта, но нельзя менять без отдельного явного поручения пользователя. +- Код бизнес-логики, оплаты, COM-контроллера и настроек автомата принадлежит Exchanger. Темы + считаются доверенными и могут содержать собственную GDScript-логику визуальных и вспомогательных + runtime-компонентов, но прямые зависимости от внутренних узлов host нужно документировать. +- Перед изменениями прочитайте [README.md](README.md), [docs/PROJECT_CONTEXT.md](docs/PROJECT_CONTEXT.md) + и профильный документ из [docs/README.md](docs/README.md). Для сцен обязательно прочитайте + [docs/BINDING_CONTRACT.md](docs/BINDING_CONTRACT.md). + +## Обязательная долговременная память + +- MCP-сервер `agentmemory` используется постоянно. Канонический project id: + `exchanger-theme-dlc-builder`. +- Первое действие с инструментами в каждой задаче — `memory_recall` или `memory_smart_search` по + затрагиваемой подсистеме. Повторите поиск перед работой с незнакомой частью проекта или при + противоречии памяти и файлов. +- После каждого устойчивого открытия, решения, изменения архитектуры/контракта/структуры, + найденной ошибки и законченного блока QA сохраняйте атомарную запись через `memory_save`. +- Записывайте назначение файлов, связи, команды и фактические результаты проверок, а не сырые логи. + Репозиторий и свежий запуск имеют приоритет над устаревшей памятью. +- Перед финальным ответом обязательно сохраните итоговое состояние, изменённые файлы, проверки и + незакрытые вопросы. При делегировании передайте подагенту эти же требования. + +## Godot и инструменты + +- **Ziva-Godot категорически запрещён без исключений.** Нельзя использовать сервер, tools, + plugins, skills, ресурсы или документацию с этим именем даже для чтения и диагностики. +- Для Godot Editor разрешён только MCP-сервер `godot-ai`. Перед работой со сценами проверьте + сессию, сведения о проекте, открытую иерархию и журнал. Если `godot-ai` недоступен, используйте + безопасные shell-команды и файловое редактирование, но не Ziva-Godot. +- Текстовые файлы меняйте точечно через `apply_patch`. Не перезаписывайте пользовательские файлы + shell-трюками и не запускайте форматирование всего проекта без необходимости. +- Сохраняйте чужие и незавершённые изменения. Перед удалением, переносом или массовой генерацией + точно проверьте цель. `themes//package/` является единственным исходником и не должен + очищаться неявно. Постоянного корневого staging-каталога нет. + +## Неподвижные правила темы + +- Целевой формат preview: `720×1280`, портретная ориентация. +- Внутри тематических сцен разрешены обычные возможности Godot: GDScript, сигналы, анимации, + шейдеры, частицы, аудио, видео и процедурные визуальные эффекты. +- Production-содержимое — только `themes//package/`. `source/`, references и preview tooling + не должны попадать в PCK. Канонический namespace `res://exchanger_theme_dlc/` создаётся только + внутри изолированного временного build-workspace и готового PCK. +- Все девять production-сцен имеют канонические пути/имена/root metadata из manifest v2. +- Production-сцены и их вложенные сцены могут содержать доверенный GDScript и любые необходимые + Godot-узлы, включая `Timer`, `AudioStreamPlayer*` и `HTTPRequest`. Скрипты темы исполняются и в + preview, и после инстанцирования PCK в Exchanger. +- Каждый обязательный элемент содержит уникальный `exchanger_binding_id`, точный тип и ID из + `contracts/screen_bindings.v2.json`. Каталог v2 содержит 9 экранов и 481 биндинг; его + package-копия должна совпадать байт-в-байт. +- При любом добавлении, удалении, переименовании или изменении binding ID, пути, типа, fallback, + структуры binding-каталога либо правил разрешения биндингов обязательно в рамках той же задачи + обновите `E:\Danil\Projects\Godot\ExchangerThemeDlcBuilder\docs\BINDING_CONTRACT.md`. Изменение + биндингов не считается завершённым, пока документ не соответствует фактическому контракту и не + проверен вместе с `contracts/screen_bindings.v2.json` и host-контрактом Exchanger. +- Production-сцена владеет каждым визуальным узлом, включая состояния Home, кнопки готовых сумм + и фиксированные строки настроек. Exchanger не должен добавлять, удалять, переносить или + стилизовать `Control` внутри внешнего ThemeView: host только находит существующие узлы, + подключает сигналы и обновляет значения/видимость/доступность. +- SETTINGS содержит заранее созданные скрытые панели текстовой и цифровой экранных клавиатур. + Host может менять подписи/видимость/доступность клавиш и подключать сигналы, но не создаёт и не + перестраивает их визуальное дерево. +- SETTINGS также содержит theme-owned раздел «Сервис» и скрытый диалог учёта жетонов. Заголовки + обоих хопперов имеют отдельные binding-id для точных остатков. Host меняет только остатки, + тексты, видимость/доступность и подписывает кнопки; создавать или перестраивать + эти элементы в runtime запрещено. +- Видимый русский текст должен быть естественным и понятным владельцу автомата. Используйте + «промо» и «промо-ролик», не «реклама». Внутренние English identifiers не переименовывайте. + +## Рабочий цикл + +1. Восстановите контекст из agentmemory и документов. +2. Активируйте нужную тему: `./activate-theme.ps1 -ThemeId `. +3. Меняйте `themes//package/` напрямую; preview загружает эти же файлы без промежуточной копии. +4. Проверяйте binding overlay и все девять вкладок preview в `720×1280`; сохраняйте статический + фон и центрирование содержимого. +5. Выполните `./tools/Test-PackagedBindingContract.ps1`, затем + `./test-theme.ps1 -ThemeId `. +6. Соберите `./build-theme.ps1 -ThemeId `. Установка в пользовательский каталог Exchanger — + отдельное внешнее изменение и выполняется только когда оно входит в поручение. +7. Через `godot-ai` проверьте preview и runtime-журнал. При изменении host-контракта отдельно + проверьте PCK в Exchanger. +8. Обновите относящиеся к изменению docs и agentmemory. + +## Делегирование и критерии готовности + +- Делегируйте только независимые, чётко ограниченные задачи. Укажите рабочую папку, запрет + Ziva-Godot, обязательную память, допустимые файлы и проверки. Не позволяйте нескольким агентам + одновременно править одни и те же файлы. +- Задача готова, когда исходники находятся в правильной теме, contract check и validator проходят, + preview smoke и визуальная проверка девяти экранов не выявляют ошибок, production PCK не содержит + builder tooling/референсов, документация соответствует фактам, а результат сохранён в памяти. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7b98b3c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,36 @@ +# Участие в разработке + +## Перед началом + +1. Прочитайте [быстрый старт](docs/QUICK_START.md) и + [контракт биндингов](docs/BINDING_CONTRACT.md). +2. Убедитесь, что установлен Godot 4.7.x и доступен PowerShell 7 или Windows PowerShell 5.1. +3. Выберите тему через `Редактор → Выбрать тему` и редактируйте только её + `themes//package/`. +4. Если работает ИИ-агент, он обязан следовать [AGENTS.md](AGENTS.md). + +## Внесение изменений + +- Одна задача должна менять один понятный аспект темы или tooling. +- Не меняйте binding-id, канонические имена сцен и package-копию контракта вручную. +- Скрипты и runtime-узлы темы разрешены. Не переносите в тему код оплаты, COM-контроллер и + остальные app-owned подсистемы без отдельного изменения host-контракта. +- Исходные материалы, лицензии и референсы храните в `source/`; оптимизированные runtime-копии — + только в `package/`. +- Новый видимый текст пишите по-русски, понятно для владельца автомата. Используйте «промо» и + «промо-ролик». + +## Проверка изменения + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId space-pixel +.\build-theme.ps1 -ThemeId space-pixel +``` + +После автоматических проверок просмотрите все девять вкладок preview при `720×1280`, сначала без +overlay, затем с `BINDINGS: ON`. Полный checklist находится в +[документе QA](docs/QA_AND_TROUBLESHOOTING.md). + +Команда сборки с `-InstallToDefaultUserPath` заменяет установленный PCK Exchanger. Запускайте её +только осознанно. diff --git a/README.md b/README.md new file mode 100644 index 0000000..366ee4d --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Exchanger Theme DLC Builder + +Самостоятельный Godot 4.7-проект для разработки, визуального просмотра, проверки и сборки +полносценовых DLC-тем Exchanger. Тема полностью рисует девять экранов, а приложение подключает к +размеченным элементам бизнес-логику через binding-id. + +## Быстрый путь + +Требуется Godot 4.7.x. Откройте эту папку в VS Code, установите рекомендованное расширение и +запустите проект в Godot Editor. В меню `Редактор` доступны четыре команды: + +- `Выбрать тему` — выбирает существующую тему и открывает preview прямо из её `package/`; +- `Создать тему` — создаёт полную тему из `example`, задаёт её ID/название и сразу активирует; +- `Экспортировать тему` — предлагает выбрать любую найденную тему по ID, затем открывает + стандартный диалог сохранения и собирает выбранный `.pck` без установки в приложение; +- `Применить тему к Exchanger` — в фоне проверяет и собирает активную тему, затем устанавливает + `active_theme.pck` в пользовательский каталог приложения. + +Выбор, создание, экспорт и применение сопровождаются окном прогресса: в нём видны текущий этап, +процент выполнения и итоговый путь либо диагностическое сообщение. + +Для автоматизации и CI те же операции доступны через VS Code tasks или PowerShell: + +```powershell +.\activate-theme.ps1 -ThemeId space-pixel +.\preview-theme.ps1 -ThemeId space-pixel +.\test-theme.ps1 -ThemeId space-pixel +.\build-theme.ps1 -ThemeId space-pixel -InstallToDefaultUserPath +``` + +После активации preview показывает реальные production-сцены всех девяти экранов в `720×1280`. +Кнопка `BINDINGS: ON/OFF` слева в верхней панели показывает, к какому binding-id подключится +каждый элемент. Изменения `themes/space-pixel/package/` подхватываются live reload. +На вкладке SETTINGS дополнительная кнопка `KEYBOARD: OFF/TEXT/NUM` показывает оба скрытых +состояния экранной клавиатуры и их биндинги. +Кнопка `INVENTORY: OFF/PANEL/DIALOG` рядом показывает theme-owned раздел «Сервис» и его диалог +пересчёта/ручного добавления, не создавая runtime-узлов. +Кнопка `PET` в правой части верхней панели открывает отдельную сцену просмотра интерактивного +питомца активной темы. В ней доступны все состояния, счётчик кадров, пауза, повтор, ручное +переключение и автоматический последовательный показ. Кнопка «СОСТАВНОЕ ДЕЙСТВИЕ: INTERACT» +запускает theme-owned сценарий через тестовый host-runtime с границами и верхней опорой; +`Esc` или «← ГАЛЕРЕЯ» возвращают к экранам. +Viewer берёт компонент из необязательного поля manifest `InteractivePetScene` и строит список +анимаций через публичный API сцены. Папки текстур и их имена определяет сама тема: builder не +сканирует и не требует каталог `alien_pet`. + +Preview не добавляет к сценам тему, фон, декорации или демонстрационные узлы: он только собирает +девять `.tscn` во вкладки и рисует отдельный диагностический overlay. Поэтому production-сцена, +открытая прямо из `themes//package/scenes/`, выглядит так же, как в preview и в Exchanger. +Home, CardAmount и Settings уже содержат все визуальные состояния и фиксированные строки; host +только подключает логику к существующим binding-id и не перестраивает ThemeView. + +Новую тему создавайте через `Редактор → Создать тему`. Ручное копирование `themes/example` +остаётся только скриптовым fallback. Подробности — в [быстром старте](docs/QUICK_START.md). + +Все каталоги внутри `themes/` всегда видны в Godot FileSystem. Открывайте и редактируйте +`themes//package/` напрямую; `.gdignore` в темах не используется и при создании новых тем не +появляется. При открытии проекта аддон автоматически удаляет такие файлы, оставшиеся от старой +структуры. + +## Что где находится + +```text +themes/example/ самодостаточная тема-шаблон со всеми сценами и биндингами +themes/space-pixel/ текущая оформленная тема для preview и сборки +themes//source/ оригиналы, лицензии и локальные references +themes//package/ единственный источник production PCK +contracts/ авторитетный binding-контракт builder +tools/preview/ галерея, просмотрщик питомца и binding overlay, не входят в PCK +addons/exchanger_theme_manager/ EditorPlugin выбора, создания, экспорта и применения тем +build/ PCK, active-theme.json и временный скрытый workspace сборки +``` + +В format v2 обязательны ровно девять канонических сцен, 481 immutable element-binding из JSON и +24 обязательных supplemental runtime-binding, проверяемых Builder Validator отдельно, и четыре +совместимых optional supplemental binding для новых текстов баннеров, выбора промо-изображения и +переключателя интерактивного питомца. Тема считается +доверенной: её GDScript и runtime-узлы входят в PCK и исполняются в preview и Exchanger. `source/`, +references и builder preview tooling в production PCK не экспортируются. + +## Документация + +- [Быстрый старт из VS Code](docs/QUICK_START.md) +- [Как применить тему в Exchanger](docs/APPLY_THEME.md) +- [Архитектура и границы проектов](docs/ARCHITECTURE.md) +- [Полный жизненный цикл темы](docs/WORKFLOW.md) +- [Manifest v2 и binding-контракт](docs/BINDING_CONTRACT.md) +- [Создание и оформление темы](docs/THEME_AUTHORING.md) +- [Скрипты и runtime-логика темы](docs/SCRIPTING.md) +- [Композитные анимации питомца: гайд для дизайнера](docs/COMPOSITE_PET_ANIMATIONS.md) +- [Установка и интеграция](docs/THEME_INTEGRATION.md) +- [QA и решение проблем](docs/QA_AND_TROUBLESHOOTING.md) +- [Текущее состояние и handoff для ИИ](docs/PROJECT_CONTEXT.md) +- [Особенности `space-pixel`](docs/SPACE_PIXEL.md) +- [Правила участия](CONTRIBUTING.md) + +Для этого проекта категорически запрещён Ziva-Godot. Godot-автоматизация выполняется только через +`godot-ai` или штатные безопасные команды Godot. ИИ-агент начинает с [AGENTS.md](AGENTS.md). diff --git a/activate-theme.ps1 b/activate-theme.ps1 new file mode 100644 index 0000000..cb908d3 --- /dev/null +++ b/activate-theme.ps1 @@ -0,0 +1,7 @@ +param( + [string]$ThemeId = "space-pixel", + [string]$ThemeSource = "" +) + +$ErrorActionPreference = "Stop" +& (Join-Path $PSScriptRoot "tools\Select-Theme.ps1") -ThemeId $ThemeId -ThemeSource $ThemeSource diff --git a/addons/exchanger_theme_manager/plugin.cfg b/addons/exchanger_theme_manager/plugin.cfg new file mode 100644 index 0000000..40c15e6 --- /dev/null +++ b/addons/exchanger_theme_manager/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Exchanger Theme Manager" +description="Выбор, создание, экспорт и установка полносценовых DLC-тем Exchanger из меню редактора." +author="Exchanger" +version="1.3.3" +script="theme_manager_plugin.gd" diff --git a/addons/exchanger_theme_manager/theme_manager_plugin.gd b/addons/exchanger_theme_manager/theme_manager_plugin.gd new file mode 100644 index 0000000..4bde900 --- /dev/null +++ b/addons/exchanger_theme_manager/theme_manager_plugin.gd @@ -0,0 +1,1118 @@ +@tool +extends EditorPlugin + +const THEMES_ROOT := "res://themes" +const EXAMPLE_THEME_ID := "example" +const ACTIVE_STATE_PATH := "res://build/active-theme.json" +const ACTIVATE_SCRIPT_PATH := "res://activate-theme.ps1" +const BUILD_SCRIPT_PATH := "res://build-theme.ps1" +const PREVIEW_SCENE_PATH := "res://tools/preview/preview.tscn" + +const MENU_SEPARATOR_ID := 1_947_300_100 +const MENU_SELECT_ID := 1_947_300_101 +const MENU_CREATE_ID := 1_947_300_102 +const MENU_APPLY_ID := 1_947_300_103 +const MENU_EXPORT_ID := 1_947_300_104 +const SELECT_MENU_TEXT := "Выбрать тему" +const CREATE_MENU_TEXT := "Создать тему" +const EXPORT_MENU_TEXT := "Экспортировать тему" +const APPLY_MENU_TEXT := "Применить тему к Exchanger" +const SELECT_DIALOG_SIZE := Vector2i(700, 390) +const CREATE_DIALOG_SIZE := Vector2i(700, 470) +const EXPORT_THEME_DIALOG_SIZE := Vector2i(720, 430) +const EXPORT_FILE_DIALOG_SIZE := Vector2i(900, 620) +const APPLY_DIALOG_SIZE := Vector2i(720, 430) +const PROGRESS_DIALOG_SIZE := Vector2i(700, 330) +const MESSAGE_DIALOG_SIZE := Vector2i(680, 260) +const BUILD_PROGRESS_POLL_INTERVAL := 0.1 +const BUILD_STAGE_LABELS := { + "select": "Выбор исходников темы…", + "prepare": "Подготовка пространства сборки…", + "import": "Импорт ресурсов темы в Godot…", + "validate": "Проверка manifest, сцен и биндингов…", + "export": "Экспорт production-ресурсов в PCK…", + "verify": "Проверка готового PCK…", + "finalize": "Завершение локальной сборки…", + "install": "Установка темы для Exchanger…", + "complete": "Тема успешно собрана", + "error": "Сборка завершилась с ошибкой", +} + +var _editor_menu: PopupMenu +var _uses_standard_tools_menu := false +var _select_dialog: ConfirmationDialog +var _theme_options: OptionButton +var _select_details: RichTextLabel +var _create_dialog: ConfirmationDialog +var _theme_id_input: LineEdit +var _display_name_input: LineEdit +var _create_validation: Label +var _create_details: RichTextLabel +var _export_theme_dialog: ConfirmationDialog +var _export_theme_options: OptionButton +var _export_theme_details: RichTextLabel +var _export_file_dialog: FileDialog +var _apply_dialog: ConfirmationDialog +var _apply_details: RichTextLabel +var _progress_dialog: AcceptDialog +var _progress_bar: ProgressBar +var _progress_stage: Label +var _progress_details: RichTextLabel +var _message_dialog: AcceptDialog +var _theme_id_regex := RegEx.new() +var _busy := false +var _pending_export_theme_id := "" +var _pending_apply_theme_id := "" +var _build_thread: Thread +var _active_build_theme_id := "" +var _active_build_output_path := "" +var _active_build_installs := false +var _active_progress_path := "" +var _progress_poll_elapsed := 0.0 + + +func _enter_tree() -> void: + set_process(false) + _theme_id_regex.compile("^[a-z0-9]+(?:-[a-z0-9]+)*$") + _remove_legacy_theme_ignores() + _create_dialogs() + call_deferred("_install_menu_items") + + +func _exit_tree() -> void: + _remove_menu_items() + if _build_thread != null and _build_thread.is_started(): + _build_thread.wait_to_finish() + _free_dialog(_select_dialog) + _free_dialog(_create_dialog) + _free_dialog(_export_theme_dialog) + _free_dialog(_export_file_dialog) + _free_dialog(_apply_dialog) + _free_dialog(_progress_dialog) + _free_dialog(_message_dialog) + + +func _install_menu_items() -> void: + _editor_menu = _find_editor_menu(EditorInterface.get_base_control()) + if _editor_menu != null: + _remove_direct_menu_item(MENU_SELECT_ID) + _remove_direct_menu_item(MENU_CREATE_ID) + _remove_direct_menu_item(MENU_EXPORT_ID) + _remove_direct_menu_item(MENU_APPLY_ID) + _remove_direct_menu_item(MENU_SEPARATOR_ID) + _editor_menu.add_separator("Темы Exchanger", MENU_SEPARATOR_ID) + _editor_menu.add_item(SELECT_MENU_TEXT, MENU_SELECT_ID) + _editor_menu.add_item(CREATE_MENU_TEXT, MENU_CREATE_ID) + _editor_menu.add_item(EXPORT_MENU_TEXT, MENU_EXPORT_ID) + _editor_menu.add_item(APPLY_MENU_TEXT, MENU_APPLY_ID) + if not _editor_menu.id_pressed.is_connected(_on_editor_menu_id_pressed): + _editor_menu.id_pressed.connect(_on_editor_menu_id_pressed) + print("[Theme Manager] Commands added to the Editor menu.") + return + + _uses_standard_tools_menu = true + add_tool_menu_item(SELECT_MENU_TEXT, _show_select_dialog) + add_tool_menu_item(CREATE_MENU_TEXT, _show_create_dialog) + add_tool_menu_item(EXPORT_MENU_TEXT, _show_export_dialog) + add_tool_menu_item(APPLY_MENU_TEXT, _show_apply_dialog) + push_warning("[Theme Manager] Editor menu was not found; commands were added to Project > Tools.") + + +func _remove_menu_items() -> void: + if _editor_menu != null and is_instance_valid(_editor_menu): + _remove_direct_menu_item(MENU_SELECT_ID) + _remove_direct_menu_item(MENU_CREATE_ID) + _remove_direct_menu_item(MENU_EXPORT_ID) + _remove_direct_menu_item(MENU_APPLY_ID) + _remove_direct_menu_item(MENU_SEPARATOR_ID) + if _editor_menu.id_pressed.is_connected(_on_editor_menu_id_pressed): + _editor_menu.id_pressed.disconnect(_on_editor_menu_id_pressed) + if _uses_standard_tools_menu: + remove_tool_menu_item(SELECT_MENU_TEXT) + remove_tool_menu_item(CREATE_MENU_TEXT) + remove_tool_menu_item(EXPORT_MENU_TEXT) + remove_tool_menu_item(APPLY_MENU_TEXT) + _uses_standard_tools_menu = false + _editor_menu = null + + +func _remove_direct_menu_item(item_id: int) -> void: + if _editor_menu == null or not is_instance_valid(_editor_menu): + return + var item_index := _editor_menu.get_item_index(item_id) + if item_index >= 0: + _editor_menu.remove_item(item_index) + + +func _find_editor_menu(root: Node) -> PopupMenu: + var pending: Array[Node] = [root] + while not pending.is_empty(): + var node := pending.pop_back() as Node + if node is MenuBar: + var menu_bar := node as MenuBar + for menu_index in range(menu_bar.get_menu_count()): + var title := menu_bar.get_menu_title(menu_index).replace("&", "").strip_edges().to_lower() + if title == "editor" or title == "редактор": + return menu_bar.get_menu_popup(menu_index) + for child in node.get_children(): + pending.push_back(child) + return null + + +func _remove_legacy_theme_ignores() -> void: + var themes_directory := DirAccess.open(THEMES_ROOT) + if themes_directory == null: + return + var removed_count := 0 + themes_directory.list_dir_begin() + while true: + var directory_name := themes_directory.get_next() + if directory_name.is_empty(): + break + if not themes_directory.current_is_dir() or directory_name.begins_with("."): + continue + var ignore_path := THEMES_ROOT.path_join(directory_name).path_join(".gdignore") + if not FileAccess.file_exists(ignore_path): + continue + var remove_error := DirAccess.remove_absolute(ProjectSettings.globalize_path(ignore_path)) + if remove_error == OK: + removed_count += 1 + else: + push_warning("[Theme Manager] Не удалось удалить %s: %s" % [ignore_path, error_string(remove_error)]) + themes_directory.list_dir_end() + if removed_count > 0: + print("[Theme Manager] Removed %d legacy .gdignore file(s); themes are visible in FileSystem." % removed_count) + EditorInterface.get_resource_filesystem().scan() + + +func _on_editor_menu_id_pressed(item_id: int) -> void: + match item_id: + MENU_SELECT_ID: + _show_select_dialog() + MENU_CREATE_ID: + _show_create_dialog() + MENU_EXPORT_ID: + _show_export_dialog() + MENU_APPLY_ID: + _show_apply_dialog() + + +func _create_dialogs() -> void: + var editor_root := EditorInterface.get_base_control() + + _select_dialog = ConfirmationDialog.new() + _select_dialog.title = "Выбрать тему Exchanger" + _configure_compact_dialog(_select_dialog, SELECT_DIALOG_SIZE) + _select_dialog.get_ok_button().text = "Выбрать" + _select_dialog.confirmed.connect(_on_select_confirmed) + editor_root.add_child(_select_dialog) + + var select_content := VBoxContainer.new() + select_content.custom_minimum_size = Vector2(620, 280) + select_content.add_theme_constant_override("separation", 10) + _select_dialog.add_child(select_content) + var select_hint := Label.new() + select_hint.text = "Выберите тему, с которой будет работать preview и команды редактора." + select_content.add_child(select_hint) + _theme_options = OptionButton.new() + _theme_options.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _theme_options.item_selected.connect(_on_select_theme_changed) + select_content.add_child(_theme_options) + _select_details = _make_details_panel(150) + select_content.add_child(_select_details) + select_content.add_child(_make_steps_label([ + "Остановка запущенного preview", + "Обновление active-theme.json", + "Сканирование ресурсов и открытие preview", + ])) + + _create_dialog = ConfirmationDialog.new() + _create_dialog.title = "Создать тему Exchanger" + _configure_compact_dialog(_create_dialog, CREATE_DIALOG_SIZE) + _create_dialog.get_ok_button().text = "Создать и выбрать" + _create_dialog.confirmed.connect(_on_create_confirmed) + editor_root.add_child(_create_dialog) + + var create_content := VBoxContainer.new() + create_content.custom_minimum_size = Vector2(620, 360) + create_content.add_theme_constant_override("separation", 7) + _create_dialog.add_child(create_content) + var create_hint := Label.new() + create_hint.text = "Новая тема будет копией example: 9 полностью оформленных сцен и 481 биндинг." + create_content.add_child(create_hint) + create_content.add_child(_make_field_label("ID темы")) + _theme_id_input = LineEdit.new() + _theme_id_input.placeholder_text = "например, my-theme" + _theme_id_input.text_changed.connect(_on_create_field_changed) + create_content.add_child(_theme_id_input) + create_content.add_child(_make_field_label("Название темы")) + _display_name_input = LineEdit.new() + _display_name_input.placeholder_text = "Например, Моя тема" + _display_name_input.text_changed.connect(_on_create_field_changed) + create_content.add_child(_display_name_input) + _create_validation = Label.new() + create_content.add_child(_create_validation) + _create_details = _make_details_panel(105) + _create_details.text = ( + "Этапы: проверка ID → копирование example → запись manifest.json → " + + "активация темы → открытие preview.\nИсходники будут созданы в themes//package/." + ) + create_content.add_child(_create_details) + + _export_theme_dialog = ConfirmationDialog.new() + _export_theme_dialog.title = "Экспортировать тему Exchanger" + _configure_compact_dialog(_export_theme_dialog, EXPORT_THEME_DIALOG_SIZE) + _export_theme_dialog.get_ok_button().text = "Выбрать файл…" + _export_theme_dialog.confirmed.connect(_on_export_theme_confirmed) + editor_root.add_child(_export_theme_dialog) + + var export_content := VBoxContainer.new() + export_content.custom_minimum_size = Vector2(640, 320) + export_content.add_theme_constant_override("separation", 10) + _export_theme_dialog.add_child(export_content) + var export_hint := Label.new() + export_hint.text = "Можно экспортировать любую тему из themes/, независимо от активной темы preview." + export_content.add_child(export_hint) + _export_theme_options = OptionButton.new() + _export_theme_options.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _export_theme_options.item_selected.connect(_on_export_theme_changed) + export_content.add_child(_export_theme_options) + _export_theme_details = _make_details_panel(155) + export_content.add_child(_export_theme_details) + export_content.add_child(_make_steps_label([ + "Изолированный импорт ресурсов", + "Проверка manifest, 9 сцен и 481 биндинга", + "Сборка и проверка готового PCK", + ])) + + _export_file_dialog = FileDialog.new() + _export_file_dialog.title = "Сохранить тему как PCK" + _export_file_dialog.file_mode = FileDialog.FILE_MODE_SAVE_FILE + _export_file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _export_file_dialog.filters = PackedStringArray(["*.pck ; Exchanger Theme PCK"]) + _export_file_dialog.file_selected.connect(_on_export_file_selected) + _export_file_dialog.canceled.connect(_on_export_canceled) + editor_root.add_child(_export_file_dialog) + + _apply_dialog = ConfirmationDialog.new() + _apply_dialog.title = "Применить тему к Exchanger" + _configure_compact_dialog(_apply_dialog, APPLY_DIALOG_SIZE) + _apply_dialog.get_ok_button().text = "Собрать и применить" + _apply_dialog.confirmed.connect(_on_apply_confirmed) + editor_root.add_child(_apply_dialog) + var apply_content := VBoxContainer.new() + apply_content.custom_minimum_size = Vector2(640, 320) + apply_content.add_theme_constant_override("separation", 10) + _apply_dialog.add_child(apply_content) + var apply_hint := Label.new() + apply_hint.text = "Активная тема будет полностью проверена, собрана и установлена для Exchanger." + apply_content.add_child(apply_hint) + _apply_details = _make_details_panel(170) + apply_content.add_child(_apply_details) + apply_content.add_child(_make_steps_label([ + "Проверка и сборка PCK", + "Проверка содержимого готового пакета", + "Установка active_theme.pck в каталог Exchanger", + ])) + + _progress_dialog = AcceptDialog.new() + _progress_dialog.title = "Операция с темой" + _configure_compact_dialog(_progress_dialog, PROGRESS_DIALOG_SIZE) + _progress_dialog.get_ok_button().text = "Закрыть" + editor_root.add_child(_progress_dialog) + var progress_content := VBoxContainer.new() + progress_content.custom_minimum_size = Vector2(620, 220) + progress_content.add_theme_constant_override("separation", 12) + _progress_dialog.add_child(progress_content) + _progress_stage = Label.new() + _progress_stage.text = "Подготовка…" + progress_content.add_child(_progress_stage) + _progress_bar = ProgressBar.new() + _progress_bar.custom_minimum_size = Vector2(0, 28) + _progress_bar.min_value = 0.0 + _progress_bar.max_value = 100.0 + _progress_bar.show_percentage = true + progress_content.add_child(_progress_bar) + _progress_details = _make_details_panel(120) + progress_content.add_child(_progress_details) + + _message_dialog = AcceptDialog.new() + _message_dialog.title = "Темы Exchanger" + _configure_compact_dialog(_message_dialog, MESSAGE_DIALOG_SIZE) + editor_root.add_child(_message_dialog) + + +func _configure_compact_dialog(dialog: Window, maximum_size: Vector2i) -> void: + # Godot 4.7 can calculate a huge first-popup minimum for an unlaid-out + # autowrapped Label. Keep plugin dialogs explicitly bounded instead. + dialog.wrap_controls = false + dialog.unresizable = true + dialog.max_size = maximum_size + + +func _make_field_label(text: String) -> Label: + var label := Label.new() + label.text = text + return label + + +func _make_details_panel(minimum_height: float) -> RichTextLabel: + var details := RichTextLabel.new() + details.custom_minimum_size = Vector2(0, minimum_height) + details.size_flags_horizontal = Control.SIZE_EXPAND_FILL + details.bbcode_enabled = true + details.fit_content = false + details.scroll_active = false + return details + + +func _make_steps_label(steps: Array[String]) -> Label: + var label := Label.new() + var lines: Array[String] = ["Этапы операции:"] + for step_index in range(steps.size()): + lines.append("%d. %s" % [step_index + 1, steps[step_index]]) + label.text = "\n".join(lines) + return label + + +func _free_dialog(dialog: Window) -> void: + if dialog != null and is_instance_valid(dialog): + dialog.queue_free() + + +func _show_select_dialog() -> void: + if _busy: + _show_message("Операция уже выполняется.", true) + return + _refresh_theme_options() + if _theme_options.item_count == 0: + _show_message("В themes/ не найдено ни одной валидной темы manifest v2.", true) + return + _select_dialog.popup_centered_clamped(SELECT_DIALOG_SIZE, 0.9) + + +func _refresh_theme_options() -> void: + _theme_options.clear() + var active_theme_id := _read_active_theme_id() + var selected_index := 0 + for theme in _list_themes(): + var item_index := _theme_options.item_count + var theme_id: String = theme["id"] + var display_name: String = theme["display_name"] + _theme_options.add_item("%s — %s" % [display_name, theme_id]) + _theme_options.set_item_metadata(item_index, theme_id) + if theme_id == active_theme_id: + selected_index = item_index + _theme_options.select(selected_index) + _on_select_theme_changed(selected_index) + + +func _on_select_theme_changed(selected_index: int) -> void: + if selected_index < 0 or selected_index >= _theme_options.item_count: + _select_details.text = "" + return + var theme_id := str(_theme_options.get_item_metadata(selected_index)) + _select_details.text = _format_theme_details(theme_id, theme_id == _read_active_theme_id()) + + +func _list_themes() -> Array[Dictionary]: + var result: Array[Dictionary] = [] + var themes_directory := DirAccess.open(THEMES_ROOT) + if themes_directory == null: + return result + themes_directory.list_dir_begin() + while true: + var directory_name := themes_directory.get_next() + if directory_name.is_empty(): + break + if not themes_directory.current_is_dir() or directory_name.begins_with("."): + continue + var manifest_path := THEMES_ROOT.path_join(directory_name).path_join("package/manifest.json") + var manifest := _read_json_dictionary(manifest_path) + if manifest.is_empty(): + continue + if manifest.get("Format", "") != "ExchangerThemeDlc" or int(manifest.get("FormatVersion", 0)) != 2: + continue + if str(manifest.get("ThemeId", "")) != directory_name: + continue + result.append({ + "id": directory_name, + "display_name": str(manifest.get("DisplayName", directory_name)), + "format_version": int(manifest.get("FormatVersion", 0)), + }) + themes_directory.list_dir_end() + result.sort_custom(_sort_theme_records) + return result + + +func _sort_theme_records(left: Dictionary, right: Dictionary) -> bool: + return str(left["id"]) < str(right["id"]) + + +func _read_active_theme_id() -> String: + var state := _read_json_dictionary(ACTIVE_STATE_PATH) + return str(state.get("ThemeId", "")) + + +func _find_theme_record(theme_id: String) -> Dictionary: + for theme in _list_themes(): + if str(theme["id"]) == theme_id: + return theme + return {} + + +func _format_theme_details(theme_id: String, is_active: bool) -> String: + var theme := _find_theme_record(theme_id) + if theme.is_empty(): + return "[color=#ff8877]Тема с ID %s больше не найдена.[/color]" % theme_id + var status := "[color=#83e69a]активна в preview[/color]" if is_active else "не активна в preview" + return ( + "[b]%s[/b]\nID: [code]%s[/code]\nФормат: ExchangerThemeDlc v%d\nСтатус: %s\n" + + "Production-исходники: [code]themes/%s/package/[/code]" + ) % [theme["display_name"], theme_id, theme["format_version"], status, theme_id] + + +func _on_select_confirmed() -> void: + var selected_index := _theme_options.selected + if selected_index < 0: + return + var theme_id := str(_theme_options.get_item_metadata(selected_index)) + _activate_theme(theme_id) + + +func _show_create_dialog() -> void: + if _busy: + _show_message("Операция уже выполняется.", true) + return + _theme_id_input.clear() + _display_name_input.clear() + _update_create_validation() + _create_dialog.popup_centered_clamped(CREATE_DIALOG_SIZE, 0.9) + _theme_id_input.grab_focus() + + +func _on_create_field_changed(_new_text: String) -> void: + _update_create_validation() + + +func _update_create_validation() -> void: + var theme_id := _theme_id_input.text.strip_edges() + var display_name := _display_name_input.text.strip_edges() + var validation_message := "" + if theme_id.is_empty(): + validation_message = "Введите ID темы." + elif _theme_id_regex.search(theme_id) == null: + validation_message = "ID: строчные латинские буквы, цифры и одиночные дефисы." + elif DirAccess.dir_exists_absolute(ProjectSettings.globalize_path(THEMES_ROOT.path_join(theme_id))): + validation_message = "Тема с таким ID уже существует." + elif display_name.is_empty(): + validation_message = "Введите название темы." + + _create_validation.text = validation_message if not validation_message.is_empty() else "Будет создан themes/%s." % theme_id + _create_validation.modulate = Color(1.0, 0.55, 0.45) if not validation_message.is_empty() else Color(0.55, 0.9, 0.6) + _create_dialog.get_ok_button().disabled = not validation_message.is_empty() + if validation_message.is_empty(): + _create_details.text = ( + "Будет создана тема [b]%s[/b] с ID [code]%s[/code].\n" + + "Источник: [code]themes/example/[/code]\nНазначение: [code]themes/%s/[/code]\n" + + "После копирования тема сразу станет активной и откроется в preview." + ) % [display_name, theme_id, theme_id] + else: + _create_details.text = ( + "Этапы: проверка ID → копирование example → запись manifest.json → " + + "активация темы → открытие preview.\nИсходники будут созданы в themes//package/." + ) + + +func _on_create_confirmed() -> void: + var theme_id := _theme_id_input.text.strip_edges() + var display_name := _display_name_input.text.strip_edges() + if _busy: + return + _create_and_activate_theme(theme_id, display_name) + + +func _show_export_dialog() -> void: + if _busy: + _show_message("Операция уже выполняется.", true) + return + _refresh_export_theme_options() + if _export_theme_options.item_count == 0: + _show_message("В themes/ не найдено ни одной валидной темы manifest v2.", true) + return + _export_theme_dialog.popup_centered_clamped(EXPORT_THEME_DIALOG_SIZE, 0.9) + + +func _refresh_export_theme_options() -> void: + _export_theme_options.clear() + var active_theme_id := _read_active_theme_id() + var selected_index := 0 + for theme in _list_themes(): + var item_index := _export_theme_options.item_count + var theme_id := str(theme["id"]) + _export_theme_options.add_item("%s — ID: %s" % [theme["display_name"], theme_id]) + _export_theme_options.set_item_metadata(item_index, theme_id) + if theme_id == active_theme_id: + selected_index = item_index + _export_theme_options.select(selected_index) + _on_export_theme_changed(selected_index) + + +func _on_export_theme_changed(selected_index: int) -> void: + if selected_index < 0 or selected_index >= _export_theme_options.item_count: + _export_theme_details.text = "" + return + var theme_id := str(_export_theme_options.get_item_metadata(selected_index)) + _export_theme_details.text = ( + _format_theme_details(theme_id, theme_id == _read_active_theme_id()) + + "\n\nЭкспорт этой темы не переключит текущий preview." + ) + + +func _on_export_theme_confirmed() -> void: + var selected_index := _export_theme_options.selected + if selected_index < 0: + return + _pending_export_theme_id = str(_export_theme_options.get_item_metadata(selected_index)) + var theme := _find_theme_record(_pending_export_theme_id) + if theme.is_empty(): + _pending_export_theme_id = "" + _show_message("Выбранная тема больше не найдена. Обновите список и повторите экспорт.", true) + return + _export_file_dialog.title = "Экспортировать «%s» — %s" % [theme["display_name"], _pending_export_theme_id] + _export_file_dialog.current_dir = ProjectSettings.globalize_path("res://build") + _export_file_dialog.current_file = "%s.pck" % _pending_export_theme_id + _export_file_dialog.popup_centered_clamped(EXPORT_FILE_DIALOG_SIZE, 0.9) + + +func _on_export_file_selected(selected_path: String) -> void: + if _pending_export_theme_id.is_empty(): + return + var theme_id := _pending_export_theme_id + _pending_export_theme_id = "" + var output_path := selected_path.simplify_path() + if output_path.get_extension().to_lower() != "pck": + output_path += ".pck" + _start_theme_build(theme_id, output_path, false) + + +func _on_export_canceled() -> void: + _pending_export_theme_id = "" + + +func _show_apply_dialog() -> void: + if _busy: + _show_message("Операция уже выполняется.", true) + return + + var active_theme := _get_active_theme_record() + if active_theme.is_empty(): + _show_message("Сначала выберите тему через «Редактор → Выбрать тему».", true) + return + + var active_theme_id := str(active_theme["id"]) + _pending_apply_theme_id = active_theme_id + _apply_details.text = ( + "[b]%s[/b]\nID: [code]%s[/code]\n\n" + + "Файл назначения:\n[code]%s[/code]\n\n" + + "[color=#ffd27d]Перед применением закройте Exchanger. После установки запустите его заново.[/color]" + ) % [active_theme["display_name"], active_theme_id, _get_default_install_path()] + _apply_dialog.popup_centered_clamped(APPLY_DIALOG_SIZE, 0.9) + + +func _on_apply_confirmed() -> void: + if _busy or _pending_apply_theme_id.is_empty(): + return + var theme_id := _pending_apply_theme_id + _pending_apply_theme_id = "" + _start_theme_build(theme_id, "", true) + + +func _get_active_theme_record() -> Dictionary: + var active_theme_id := _read_active_theme_id() + for theme in _list_themes(): + if str(theme["id"]) == active_theme_id: + return theme + return {} + + +func _start_theme_build(theme_id: String, output_path: String, install_to_exchanger: bool) -> void: + if _busy: + return + _busy = true + _active_build_theme_id = theme_id + _active_build_output_path = output_path + _active_build_installs = install_to_exchanger + _active_progress_path = ProjectSettings.globalize_path( + "res://build/theme-manager-progress-%d.json" % OS.get_process_id() + ).simplify_path() + if FileAccess.file_exists(_active_progress_path): + DirAccess.remove_absolute(_active_progress_path) + _progress_poll_elapsed = 0.0 + var operation_title := "Сборка и применение темы" if install_to_exchanger else "Экспорт темы" + var destination := _get_default_install_path() if install_to_exchanger else output_path + _begin_operation_progress( + operation_title, + "Подготовка запуска…", + "Тема: %s\nНазначение: %s\nОжидание запуска PowerShell-сценария." + % [theme_id, destination], + 2, + ) + + var script_path := ProjectSettings.globalize_path(BUILD_SCRIPT_PATH) + _build_thread = Thread.new() + var start_error := _build_thread.start( + _build_theme_in_thread.bind( + theme_id, + script_path, + output_path, + install_to_exchanger, + _active_progress_path, + ) + ) + if start_error != OK: + _build_thread = null + _busy = false + _clear_active_build() + _finish_operation_progress( + "Не удалось запустить сборку", + "Ошибка запуска фоновой задачи: %s." % error_string(start_error), + true, + ) + return + set_process(true) + + +func _process(delta: float) -> void: + if _build_thread == null: + return + _progress_poll_elapsed += delta + if _progress_poll_elapsed >= BUILD_PROGRESS_POLL_INTERVAL: + _progress_poll_elapsed = 0.0 + _poll_build_progress() + if _build_thread.is_alive(): + return + _poll_build_progress() + var thread_result: Variant = _build_thread.wait_to_finish() + _build_thread = null + set_process(false) + _busy = false + + var result: Dictionary = {} + if thread_result is Dictionary: + result = thread_result + var exit_code := int(result.get("exit_code", -1)) + var output := str(result.get("output", "")) + if exit_code != 0: + var failure_heading := "Применение темы не выполнено" if _active_build_installs else "Экспорт темы не выполнен" + _finish_operation_progress( + failure_heading, + "Код ошибки: %d\n\n%s" % [exit_code, _format_output_tail(output)], + true, + ) + _clear_active_build() + return + + EditorInterface.get_resource_filesystem().scan() + if _active_build_installs: + _finish_operation_progress( + "Тема собрана и применена", + "ID: %s\nФайл: %s\n\nТеперь запустите Exchanger заново." + % [_active_build_theme_id, _get_default_install_path()], + ) + else: + if not FileAccess.file_exists(_active_build_output_path): + _finish_operation_progress( + "Экспорт не подтверждён", + "Сборка завершилась, но экспортированный PCK не найден:\n%s" + % _active_build_output_path, + true, + ) + else: + _finish_operation_progress( + "Тема успешно экспортирована", + "ID: %s\nГотовый PCK:\n%s" + % [_active_build_theme_id, _active_build_output_path], + ) + _clear_active_build() + + +func _build_theme_in_thread( + theme_id: String, + script_path: String, + output_path: String, + install_to_exchanger: bool, + progress_path: String, +) -> Dictionary: + var output: Array = [] + var arguments := PackedStringArray([ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + script_path, + "-ThemeId", + theme_id, + "-ProgressPath", + progress_path, + ]) + if not output_path.is_empty(): + arguments.append("-OutputPath") + arguments.append(output_path) + if not install_to_exchanger: + arguments.append("-PreserveActiveTheme") + if install_to_exchanger: + arguments.append("-InstallToDefaultUserPath") + var exit_code := OS.execute( + "powershell.exe", + arguments, + output, + true, + false, + ) + var combined_output := "" + for line in output: + combined_output += str(line) + return { + "exit_code": exit_code, + "output": combined_output.strip_edges(), + } + + +func _clear_active_build() -> void: + if not _active_progress_path.is_empty() and FileAccess.file_exists(_active_progress_path): + DirAccess.remove_absolute(_active_progress_path) + _active_build_theme_id = "" + _active_build_output_path = "" + _active_build_installs = false + _active_progress_path = "" + _progress_poll_elapsed = 0.0 + + +func _get_default_install_path() -> String: + var app_data := OS.get_environment("APPDATA") + if app_data.is_empty(): + return "%APPDATA%\\Godot\\app_userdata\\Exchanger\\theme_dlc\\active_theme.pck" + return app_data.path_join("Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck") + + +func _format_output_tail(output: String, maximum_lines := 10) -> String: + var stripped := output.strip_edges() + if stripped.is_empty(): + return "PowerShell не вернул диагностический вывод." + var lines := stripped.split("\n", false) + var first_line := maxi(0, lines.size() - maximum_lines) + return "\n".join(lines.slice(first_line)) + + +func _poll_build_progress() -> void: + if _active_progress_path.is_empty() or not FileAccess.file_exists(_active_progress_path): + return + var progress := _read_json_dictionary(_active_progress_path) + if progress.is_empty(): + return + var stage_id := str(progress.get("Stage", "build")) + # Windows PowerShell 5.1 читает UTF-8 scripts без BOM через системную + # code page. Поэтому пользовательский текст берём только из GDScript, + # а JSON сборщика используем как ASCII-протокол идентификаторов этапов. + var message := str(BUILD_STAGE_LABELS.get(stage_id, "Выполняется сборка…")) + var percent := int(progress.get("Percent", 0)) + var destination := str(progress.get("OutputPath", _active_build_output_path)) + if _active_build_installs: + destination = _get_default_install_path() + _update_operation_progress( + message, + "Тема: %s\nНазначение: %s\nПрогресс обновляется автоматически." + % [_active_build_theme_id, destination], + percent, + ) + + +func _begin_operation_progress( + title: String, + stage: String, + details: String, + percent: int = 0, +) -> void: + _message_dialog.hide() + _progress_dialog.hide() + _progress_dialog.title = title + _progress_dialog.get_ok_button().disabled = true + _progress_stage.modulate = Color.WHITE + _update_operation_progress(stage, details, percent) + _progress_dialog.popup_centered_clamped(PROGRESS_DIALOG_SIZE, 0.9) + + +func _update_operation_progress(stage: String, details: String, percent: int) -> void: + _progress_stage.text = stage + _progress_bar.value = clampi(percent, 0, 100) + _progress_details.text = details + + +func _finish_operation_progress(title: String, details: String, is_error := false) -> void: + _progress_dialog.title = "Ошибка управления темами" if is_error else title + _progress_stage.text = title + _progress_stage.modulate = Color(1.0, 0.55, 0.45) if is_error else Color(0.55, 0.9, 0.6) + _progress_bar.value = 100.0 + _progress_details.text = details + _progress_dialog.get_ok_button().disabled = false + if not _progress_dialog.visible: + _progress_dialog.popup_centered_clamped(PROGRESS_DIALOG_SIZE, 0.9) + + +func _create_and_activate_theme(theme_id: String, display_name: String) -> void: + _busy = true + _begin_operation_progress( + "Создание темы", + "Проверка параметров новой темы…", + "ID: %s\nНазвание: %s" % [theme_id, display_name], + 5, + ) + var created: bool = await _create_theme(theme_id, display_name) + if not created: + _busy = false + return + await _activate_theme( + theme_id, + "Тема «%s» создана и выбрана." % display_name, + true, + ) + + +func _create_theme(theme_id: String, display_name: String) -> bool: + _update_operation_progress( + "Проверка ID и путей…", + "ID: %s\nПроверяется themes/%s/." % [theme_id, theme_id], + 10, + ) + await get_tree().process_frame + if _theme_id_regex.search(theme_id) == null or display_name.is_empty(): + _finish_operation_progress("Тема не создана", "Некорректные данные новой темы.", true) + return false + + var source_path := ProjectSettings.globalize_path(THEMES_ROOT.path_join(EXAMPLE_THEME_ID)).simplify_path() + var themes_path := ProjectSettings.globalize_path(THEMES_ROOT).simplify_path() + var destination_path := themes_path.path_join(theme_id).simplify_path() + if not DirAccess.dir_exists_absolute(source_path): + _finish_operation_progress("Тема не создана", "Не найдена тема-шаблон themes/example.", true) + return false + if destination_path.get_base_dir() != themes_path or DirAccess.dir_exists_absolute(destination_path): + _finish_operation_progress( + "Тема не создана", + "Небезопасный или уже существующий путь новой темы.", + true, + ) + return false + + _update_operation_progress( + "Копирование темы-шаблона…", + "Источник: themes/example/\nНазначение: themes/%s/" % theme_id, + 30, + ) + await get_tree().process_frame + var copy_error := _copy_directory_recursive(source_path, destination_path) + if copy_error != OK: + _remove_created_theme(destination_path, themes_path) + _finish_operation_progress( + "Тема не создана", + "Не удалось скопировать example: ошибка %s." % error_string(copy_error), + true, + ) + return false + + _update_operation_progress( + "Запись manifest.json…", + "Назначаются ThemeId и DisplayName новой темы.", + 55, + ) + await get_tree().process_frame + var manifest_path := destination_path.path_join("package/manifest.json") + var manifest := _read_json_dictionary(manifest_path) + if manifest.is_empty(): + _remove_created_theme(destination_path, themes_path) + _finish_operation_progress( + "Тема не создана", + "В example отсутствует корректный manifest.json.", + true, + ) + return false + manifest["ThemeId"] = theme_id + manifest["DisplayName"] = display_name + var manifest_file := FileAccess.open(manifest_path, FileAccess.WRITE) + if manifest_file == null: + _remove_created_theme(destination_path, themes_path) + _finish_operation_progress("Тема не создана", "Не удалось записать manifest новой темы.", true) + return false + manifest_file.store_string(JSON.stringify(manifest, " ", false) + "\n") + _update_operation_progress( + "Тема создана. Выполняется активация…", + "Исходники готовы: themes/%s/package/." % theme_id, + 65, + ) + return true + + +func _copy_directory_recursive(source_path: String, destination_path: String) -> Error: + var make_error := DirAccess.make_dir_recursive_absolute(destination_path) + if make_error != OK: + return make_error + var source_directory := DirAccess.open(source_path) + if source_directory == null: + return DirAccess.get_open_error() + source_directory.list_dir_begin() + while true: + var entry_name := source_directory.get_next() + if entry_name.is_empty(): + break + if ( + entry_name == "." + or entry_name == ".." + or entry_name == ".gdignore" + or entry_name.get_extension() == "import" + or entry_name.get_extension() == "uid" + ): + continue + var source_entry := source_path.path_join(entry_name) + var destination_entry := destination_path.path_join(entry_name) + var entry_error := OK + if source_directory.current_is_dir(): + entry_error = _copy_directory_recursive(source_entry, destination_entry) + else: + entry_error = DirAccess.copy_absolute(source_entry, destination_entry) + if entry_error != OK: + source_directory.list_dir_end() + return entry_error + source_directory.list_dir_end() + return OK + + +func _remove_created_theme(destination_path: String, themes_path: String) -> void: + if destination_path.get_base_dir() != themes_path: + return + _remove_directory_recursive(destination_path) + + +func _remove_directory_recursive(directory_path: String) -> void: + var directory := DirAccess.open(directory_path) + if directory == null: + return + directory.list_dir_begin() + while true: + var entry_name := directory.get_next() + if entry_name.is_empty(): + break + if entry_name == "." or entry_name == "..": + continue + var entry_path := directory_path.path_join(entry_name) + if directory.current_is_dir(): + _remove_directory_recursive(entry_path) + else: + DirAccess.remove_absolute(entry_path) + directory.list_dir_end() + DirAccess.remove_absolute(directory_path) + + +func _activate_theme( + theme_id: String, + success_message: String = "", + continuing_operation: bool = false, +) -> void: + if _busy and not continuing_operation: + return + _busy = true + if not continuing_operation: + _begin_operation_progress( + "Выбор темы", + "Подготовка preview…", + "Тема: %s" % theme_id, + 5, + ) + var was_playing := EditorInterface.is_playing_scene() + _update_operation_progress( + "Остановка запущенного preview…" if was_playing else "Подготовка редактора…", + "Тема: %s\nТекущее состояние preview сохранено." % theme_id, + 70 if continuing_operation else 15, + ) + await get_tree().process_frame + if was_playing: + EditorInterface.stop_playing_scene() + await get_tree().process_frame + + _update_operation_progress( + "Активация темы…", + "Обновляется build/active-theme.json для ID %s." % theme_id, + 78 if continuing_operation else 40, + ) + await get_tree().process_frame + var output: Array = [] + var script_path := ProjectSettings.globalize_path(ACTIVATE_SCRIPT_PATH) + var exit_code := OS.execute( + "powershell.exe", + PackedStringArray([ + "-NoLogo", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + script_path, + "-ThemeId", + theme_id, + ]), + output, + true, + false, + ) + if exit_code != 0: + _busy = false + _finish_operation_progress( + "Тема не выбрана", + "Не удалось выбрать тему «%s».\n\n%s" % [theme_id, _join_output(output)], + true, + ) + return + + _update_operation_progress( + "Обновление ресурсов редактора…", + "Godot сканирует package выбранной темы и открывает общую preview-сцену.", + 90 if continuing_operation else 75, + ) + EditorInterface.get_resource_filesystem().scan() + await get_tree().process_frame + EditorInterface.open_scene_from_path(PREVIEW_SCENE_PATH) + if was_playing: + _update_operation_progress( + "Повторный запуск preview…", + "Ожидание обновления импортированных ресурсов.", + 96 if continuing_operation else 90, + ) + await get_tree().create_timer(0.6).timeout + EditorInterface.play_main_scene() + + _busy = false + var message := success_message + if message.is_empty(): + message = "Тема «%s» выбрана и открыта напрямую из package." % theme_id + _finish_operation_progress("Тема выбрана", message) + + +func _join_output(output: Array) -> String: + var text := "" + for line in output: + text += str(line) + return text.strip_edges() + + +func _read_json_dictionary(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {} + var parsed: Variant = JSON.parse_string(FileAccess.get_file_as_string(path)) + return parsed if parsed is Dictionary else {} + + +func _show_message(message: String, is_error := false) -> void: + _message_dialog.hide() + _message_dialog.get_ok_button().disabled = false + _message_dialog.title = "Ошибка управления темами" if is_error else "Темы Exchanger" + _message_dialog.dialog_text = message + _message_dialog.popup_centered_clamped(MESSAGE_DIALOG_SIZE, 0.9) diff --git a/addons/exchanger_theme_manager/theme_manager_plugin.gd.uid b/addons/exchanger_theme_manager/theme_manager_plugin.gd.uid new file mode 100644 index 0000000..9c64071 --- /dev/null +++ b/addons/exchanger_theme_manager/theme_manager_plugin.gd.uid @@ -0,0 +1 @@ +uid://bnfxnaqsoqeaa diff --git a/addons/godot_ai/LICENSE b/addons/godot_ai/LICENSE new file mode 100644 index 0000000..7806d22 --- /dev/null +++ b/addons/godot_ai/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Godot AI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/godot_ai/README.md b/addons/godot_ai/README.md new file mode 100644 index 0000000..f8a730d --- /dev/null +++ b/addons/godot_ai/README.md @@ -0,0 +1,53 @@ +# Godot AI + +Connect AI assistants to a live Godot editor via the [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP). + +Godot AI bridges Claude Code, Codex, Antigravity, DeepSeek Harness, and other MCP clients with your editor — inspect scenes, create nodes, modify properties, run tests, search project files, and more, all from a prompt. + +## Quick Start + +1. Copy `addons/godot_ai/` into your project's `addons/` folder +2. Enable the plugin: **Project > Project Settings > Plugins > Godot AI** +3. Pick your MCP client in the **Godot AI** dock and press **Configure** + +The plugin auto-starts the MCP server and connects over WebSocket. No manual configuration required. + +## Requirements + +- Godot 4.5+ (4.7+ recommended) +- [uv](https://docs.astral.sh/uv/) (used to install the Python server) +
+ Install uv + + **macOS / Linux:** + ```bash + curl -LsSf https://astral.sh/uv/install.sh | sh + ``` + + **Windows (PowerShell):** + ```powershell + powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" + ``` + + **Homebrew (macOS / Linux):** + ```bash + brew install uv + ``` + + **pipx:** + ```bash + pipx install uv + ``` + + See the [uv install docs](https://docs.astral.sh/uv/getting-started/installation/) for more options. + +
+- An MCP client ([Claude Code](https://docs.anthropic.com/en/docs/claude-code) | [Codex](https://openai.com/index/codex/) | [Antigravity](https://www.antigravity.dev/)) + +## Documentation + +Full documentation, contributing guide, and source code: [github.com/hi-godot/godot-ai](https://github.com/hi-godot/godot-ai) + +## License + +[MIT](LICENSE) diff --git a/addons/godot_ai/client_configurator.gd b/addons/godot_ai/client_configurator.gd new file mode 100644 index 0000000..58ae129 --- /dev/null +++ b/addons/godot_ai/client_configurator.gd @@ -0,0 +1,1879 @@ +@tool +class_name McpClientConfigurator +extends RefCounted + +## Public facade for the MCP client configuration system. +## +## Per-client logic lives in clients/*.gd (one descriptor per client) and is +## dispatched through clients/_registry.gd. This file: +## - owns server-side identifiers (SERVER_NAME, HTTP/WS port helpers) +## - registers the EditorSettings port overrides and resolves the live +## port/URL via `http_port()` / `ws_port()` / `http_url()` +## - keeps server-launch discovery (.venv → uvx → system godot-ai) +## - exposes string-id wrappers around configure / check_status / remove / +## manual_command so callers don't need to touch the registry directly +## +## To add a new client: drop a file in clients/, then preload it in +## clients/_registry.gd. No edits required here. + +const Client := preload("res://addons/godot_ai/clients/_base.gd") +const ClientRegistry := preload("res://addons/godot_ai/clients/_registry.gd") +const JsonStrategy := preload("res://addons/godot_ai/clients/_json_strategy.gd") +const TomlStrategy := preload("res://addons/godot_ai/clients/_toml_strategy.gd") +const YamlStrategy := preload("res://addons/godot_ai/clients/_yaml_strategy.gd") +const DshStrategy := preload("res://addons/godot_ai/clients/_dsh_strategy.gd") +const CliStrategy := preload("res://addons/godot_ai/clients/_cli_strategy.gd") +const ManualCommand := preload("res://addons/godot_ai/clients/_manual_command.gd") +const CliFinder := preload("res://addons/godot_ai/clients/_cli_finder.gd") +const WindowsPortReservation := preload("res://addons/godot_ai/utils/windows_port_reservation.gd") +const PortResolver := preload("res://addons/godot_ai/utils/port_resolver.gd") + +const SERVER_NAME := "godot-ai" + +## Fallback ports. Live port selection goes through `http_port()` / `ws_port()`, +## which read overrides from EditorSettings first. Users on Windows whose 8000 +## is grabbed by Hyper-V / WSL2 / Docker can pick a different port in +## Editor Settings > Plugins > godot_ai without touching code. See #146 for +## the Windows-reservation diagnostics this is the escape hatch for. +const DEFAULT_HTTP_PORT := 8000 +const DEFAULT_WS_PORT := 9500 +const STARTUP_TRACE_ENV := "GODOT_AI_STARTUP_TRACE" +const MIN_PORT := 1024 +const MAX_PORT := 65535 +## Cap on `can_bind_local_port` probes per `suggest_free_port` call so a +## pathological run of occupied ports can't stall the (cold-path) caller. +## 64 localhost binds are sub-millisecond; finding a free port realistically +## takes one or two probes, so this only bounds the worst case. +const SUGGEST_PORT_MAX_PROBES := 64 +const SETTING_WS_PORT := "godot_ai/ws_port" +const SETTING_STARTUP_TRACE := "godot_ai/log_startup_timing" +const SETTING_KEEP_SERVER_ON_EXIT := "godot_ai/keep_server_on_exit" +## External cwd the user can set when an MCP client (Pi, code-server, …) reads +## project-tier config files from a directory this editor can't see. The +## merge-tier strategies include it as an extra `_project_candidate_paths` root +## so project overrides there are detected instead of silently shadowed by a +## global-tier write. Codex-review finding F1. +const SETTING_EXTERNAL_CLIENT_CWD := "godot_ai/external_client_cwd" +const _DISCOVERY_TIMEOUT_MS := 3000 +## Codex launches Windows console-subsystem MCP commands in a visible terminal. +## A GUI-subsystem Python keeps the bridge attached to Codex's redirected MCP +## pipes without allocating a console, then starts console launchers such as +## uvx with CREATE_NO_WINDOW. Keep stdin/stdout/stderr explicit: pythonw can use +## its own inherited pipes, but subprocess defaults do not reliably forward +## them to a child when no console exists. +## This string is a wire format written verbatim into user config `args`. +## Whitespace or formatting changes make every existing Windows entry report +## CONFIGURED_MISMATCH, so changing it is a deliberate migration decision, not +## a refactor. The inline `-c` script is required because the uvx and system +## tiers resolve a system interpreter where `godot_ai` is not importable. +const _WINDOWS_STDIO_BOOTSTRAP := ( + "import subprocess,sys; " + + "raise SystemExit(subprocess.call(sys.argv[1:], stdin=sys.stdin, stdout=sys.stdout, " + + "stderr=sys.stderr, creationflags=0x08000000))" +) + + +## Active HTTP port: user override (if in range) or `DEFAULT_HTTP_PORT`. +static func http_port() -> int: + return _read_port_setting(McpSettings.SETTING_HTTP_PORT, DEFAULT_HTTP_PORT) + + +## Active WebSocket port: user override (if in range) or `DEFAULT_WS_PORT`. +static func ws_port() -> int: + return _read_port_setting(SETTING_WS_PORT, DEFAULT_WS_PORT) + + +static func http_url() -> String: + return "http://127.0.0.1:%d/mcp" % http_port() + + +## Read a URL already captured on the main thread without evaluating the +## EditorSettings-backed fallback unless the snapshot is genuinely incomplete. +static func server_url_from(launch_context: Dictionary) -> String: + if launch_context.has("server_url"): + return str(launch_context["server_url"]) + return http_url() + + +static func _read_port_setting(key: String, default_port: int) -> int: + var es := EditorInterface.get_editor_settings() + if es == null or not es.has_setting(key): + return default_port + var value: int = int(es.get_setting(key)) + if value < MIN_PORT or value > MAX_PORT: + return default_port + return value + + +## Register the port overrides in EditorSettings so they show up in the +## editor's Settings > Plugins section with a range hint. Called once from +## `plugin.gd._enter_tree` before `_start_server` so spawn args see the +## configured values. Safe to call repeatedly — `add_property_info` is +## idempotent and `set_initial_value` only seeds the default. +static func ensure_settings_registered() -> void: + var es := EditorInterface.get_editor_settings() + if es == null: + return + _register_port_setting(es, McpSettings.SETTING_HTTP_PORT, DEFAULT_HTTP_PORT) + _register_port_setting(es, SETTING_WS_PORT, DEFAULT_WS_PORT) + _register_bool_setting(es, SETTING_STARTUP_TRACE, false) + _register_bool_setting(es, SETTING_KEEP_SERVER_ON_EXIT, false) + _register_client_scope_setting(es) + _register_string_setting(es, SETTING_EXTERNAL_CLIENT_CWD, "") + + +static func _register_port_setting(es: EditorSettings, key: String, default_port: int) -> void: + if not es.has_setting(key): + es.set_setting(key, default_port) + es.set_initial_value(key, default_port, false) + es.add_property_info({ + "name": key, + "type": TYPE_INT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "%d,%d,1" % [MIN_PORT, MAX_PORT], + }) + + +## Surface the CLI registration scope as an enum in Settings > Plugins so it is +## discoverable without hand-editing editor_settings-4.tres. Kept at `user` by +## default; `project` writes the entry into /.mcp.json instead. +static func _register_client_scope_setting(es: EditorSettings) -> void: + var key := McpSettings.SETTING_CLIENT_SCOPE + if not es.has_setting(key): + es.set_setting(key, McpSettings.DEFAULT_CLIENT_SCOPE) + es.set_initial_value(key, McpSettings.DEFAULT_CLIENT_SCOPE, false) + es.add_property_info({ + "name": key, + "type": TYPE_STRING, + "hint": PROPERTY_HINT_ENUM, + "hint_string": ",".join(PackedStringArray(McpSettings.CLIENT_SCOPES)), + }) + + +static func _register_bool_setting(es: EditorSettings, key: String, default_value: bool) -> void: + if not es.has_setting(key): + es.set_setting(key, default_value) + es.set_initial_value(key, default_value, false) + es.add_property_info({ + "name": key, + "type": TYPE_BOOL, + }) + + +static func _register_string_setting(es: EditorSettings, key: String, default_value: String) -> void: + ## Same idempotent set-then-hint dance as the bool helper; `PROPERTY_HINT_NONE` + ## leaves the editor's plain text-input widget in place (the cwd string is + ## freeform). The hint-string slot is required by the API even when empty. + if not es.has_setting(key): + es.set_setting(key, default_value) + es.set_initial_value(key, default_value, false) + es.add_property_info({ + "name": key, + "type": TYPE_STRING, + "hint": PROPERTY_HINT_NONE, + "hint_string": "", + }) + + +static func startup_trace_enabled() -> bool: + ## env_lookup + _editor_setting_lookup for the same worker-thread + ## reason as mode_override (#691). + var raw := McpPathTemplate.env_lookup(STARTUP_TRACE_ENV).strip_edges().to_lower() + if raw == "1" or raw == "true" or raw == "yes" or raw == "on": + return true + var setting: Variant = _editor_setting_lookup(SETTING_STARTUP_TRACE) + if setting != null: + return bool(setting) + return false + + +## keep_server_on_exit (#800): when enabled, editor teardown detaches from +## the managed server instead of killing it, and the spawn env opts the +## server out of both self-reap paths (owner-PID watchdog, session-idle +## backstop) — so MCP clients connected over HTTP stay served across editor +## sessions, and the next editor start adopts the survivor. Off by default: +## "server dies with the editor" stays the shipped behavior. Read via +## _editor_setting_lookup for the same worker-thread reason as +## startup_trace_enabled (#691). +static func keep_server_on_exit() -> bool: + var setting: Variant = _editor_setting_lookup(SETTING_KEEP_SERVER_ON_EXIT) + if setting != null: + return bool(setting) + return false + + +## #691: EditorSettings counterpart of McpPathTemplate.env_lookup. The #678 +## startup walk's discovery worker reaches mode_override() (via +## get_server_command) and EditorInterface / EditorSettings are not +## thread-safe objects. Main thread: live read + mutex-guarded snapshot +## refresh. Worker thread: snapshot only — a never-warmed key reads as +## null (unset), never a live EditorInterface call. Warmed alongside the +## env snapshot in warm_env_snapshot(), which runs on the main thread +## before any worker dispatch. +static var _setting_snapshot := {} +static var _setting_snapshot_mutex := Mutex.new() +## The aggregate MCP status command runs on a worker thread. Keep the same +## main-thread-only LaunchContext contract used by dock workers by publishing a +## deep snapshot whenever capture_launch_context() runs on the main thread. +static var _launch_context_snapshot := {} +static var _launch_context_snapshot_mutex := Mutex.new() + + +static func _editor_setting_lookup(key: String) -> Variant: + if OS.get_thread_caller_id() == OS.get_main_thread_id(): + var live: Variant = null + if Engine.is_editor_hint(): + var es := EditorInterface.get_editor_settings() + if es != null and es.has_setting(key): + live = es.get_setting(key) + _setting_snapshot_mutex.lock() + _setting_snapshot[key] = live + _setting_snapshot_mutex.unlock() + return live + _setting_snapshot_mutex.lock() + var cached: Variant = _setting_snapshot.get(key, null) + _setting_snapshot_mutex.unlock() + return cached + + +## Read the `godot_ai/excluded_domains` EditorSetting as a canonicalized +## comma-separated list (sorted, deduplicated, whitespace-stripped). Returns +## "" when the setting is missing or resolves to an empty set — callers can +## skip appending the flag in that case so older servers that don't know +## `--exclude-domains` don't see an empty argument. +## +## Unknown domain names (e.g. a domain removed since the setting was last +## written) are dropped here, at the single chokepoint both the startup +## flag builder (plugin.gd) and the dock display read — the server's +## `parse_exclude_list` hard-fails on unknown names, so a stale setting +## would otherwise block server startup. +static func excluded_domains() -> String: + var es := EditorInterface.get_editor_settings() + if es == null or not es.has_setting(McpSettings.SETTING_EXCLUDED_DOMAINS): + return "" + return _canonicalize_excluded_domains(str(es.get_setting(McpSettings.SETTING_EXCLUDED_DOMAINS))) + + +## Pure canonicalizer shared by the main-thread LaunchContext capture and +## tests. Unknown domains are dropped for the same startup-safety reason as +## `excluded_domains()` above. +static func _canonicalize_excluded_domains(raw: String) -> String: + var parts := PackedStringArray() + for p in raw.split(","): + var t := p.strip_edges() + if t.is_empty() or parts.find(t) != -1: + continue + if not McpToolCatalog.is_excludable_domain(t): + continue + parts.append(t) + parts.sort() + return ",".join(parts) + + +## Snapshot every EditorSettings-backed value needed to render or verify an +## attach launch command. Main-thread calls refresh the snapshot; worker calls +## return that snapshot without touching EditorInterface (#691). Warm it on the +## main thread before dispatching a worker. +static func capture_launch_context() -> Dictionary: + if OS.get_thread_caller_id() != OS.get_main_thread_id(): + _launch_context_snapshot_mutex.lock() + var cached := _launch_context_snapshot.duplicate(true) + _launch_context_snapshot_mutex.unlock() + return cached + var captured_http_port := http_port() + var context := { + "http_port": captured_http_port, + "ws_port": ws_port(), + "excluded_domains": excluded_domains(), + "plugin_version": get_plugin_version(), + "allow_dev_venv": mode_override() != "user", + "platform": OS.get_name(), + "server_url": "http://127.0.0.1:%d/mcp" % captured_http_port, + "project_roots": capture_project_roots(), + ## The opt-out must ride the attach argv: the client spawns the bridge + ## (and the bridge its backend) with no editor in the loop, so the + ## env-injection path in server_lifecycle.gd never runs for them. + "telemetry_enabled": McpSettings.telemetry_enabled(), + } + _launch_context_snapshot_mutex.lock() + _launch_context_snapshot = context.duplicate(true) + _launch_context_snapshot_mutex.unlock() + return context + + +## Resolve roots used by cwd-relative client project config tiers while the +## engine singletons are safe to access. Workers receive this immutable snapshot. +static func capture_project_roots() -> PackedStringArray: + var current_access := DirAccess.open(".") + var current_root := "" if current_access == null else current_access.get_current_dir().simplify_path() + var project_root := ProjectSettings.globalize_path("res://").simplify_path() + # Codex F1: when the user sets `godot_ai/external_client_cwd` we probe that + # directory in addition to the two guessed roots. The setter / setter-snapshot + # pathway is the same as the existing EditorSettings (warm_env_snapshot + # pre-warms this key so worker-thread callers see the snapshot, not the live + # EditorInterface). Empty string is filtered out by `_canonicalize_roots_for_test`. + var external_cwd := str(_editor_setting_lookup(SETTING_EXTERNAL_CLIENT_CWD)) + return _canonicalize_roots_for_test(PackedStringArray([current_root, project_root, external_cwd])) + + +## Canonicalize a list of root paths to one filesystem representation per +## directory and deduplicate. `ProjectSettings.globalize_path` maps any +## `res://` / `user://` form to the absolute path and is idempotent on an +## already-absolute path, so a `res://`-form candidate and its absolute twin +## collapse to the same entry. Without this pass, `_project_candidate_paths` +## would probe `/.pi/mcp.json` against both representations of the same +## directory and `manual_target_details` would mis-report a single project +## override as multiple tiers (codex-review finding F4). Public-ish seam +## (named `_..._for_test`) so the clients suite can pin the behaviour without +## having to mock `DirAccess.open(".")`. +static func _canonicalize_roots_for_test(raws: PackedStringArray) -> PackedStringArray: + var seen := {} + var roots := PackedStringArray() + for raw in raws: + var s := str(raw).strip_edges() + if s.is_empty(): + continue + var canon := ProjectSettings.globalize_path(s).simplify_path() + if canon.is_empty() or seen.has(canon): + continue + seen[canon] = true + roots.append(canon) + return roots + + +static func _project_roots_from_context(context: Dictionary) -> PackedStringArray: + var roots = context.get("project_roots", PackedStringArray()) + return roots if roots is PackedStringArray else PackedStringArray() + + +## Read the `godot_ai/allow_remote_hosts` EditorSetting as a canonicalized +## comma-separated list of CIDRs / bare IPs (#507). Returns "" when the +## setting is missing or empty — callers skip appending `--allow-host` in +## that case so spawns stay byte-for-byte identical to the loopback-only +## default (and compatible with pre-#421 servers). Mirrors +## `excluded_domains()` above. +static func allow_hosts() -> String: + var es := EditorInterface.get_editor_settings() + if es == null or not es.has_setting(McpSettings.SETTING_ALLOW_HOSTS): + return "" + return McpAllowHosts.normalize(str(es.get_setting(McpSettings.SETTING_ALLOW_HOSTS))) + + +## Suggest a port the caller can actually switch to. Walks +## `candidate`..`candidate+span-1` and returns the first port that is both +## (a) NOT inside a Windows winnat reservation range (Hyper-V / WSL2 / Docker +## grab these; bind fails with WinError 10013 and netstat shows nothing) and +## (b) actually bindable right now on 127.0.0.1. The bind probe is what makes +## "free" honest on macOS/Linux, where the reservation table is empty but the +## next port up may still be occupied — the same suggestion feeds the dock +## crash body, the port-picker spinbox, and the non-recoverable INCOMPATIBLE +## log line. Falls back to the clamped candidate if nothing in the window +## clears both checks (caller surfaces it as a best-effort hint; the user can +## retry or pick another). Best-effort by nature: a TOCTOU window remains +## between the probe and the caller actually binding the port. The bind probe +## is bounded to `SUGGEST_PORT_MAX_PROBES` attempts so this cold path can't +## stall on a pathological run of occupied ports. +static func suggest_free_port(start: int, span: int = 2048) -> int: + var candidate := clampi(start, MIN_PORT, MAX_PORT - span + 1) + var limit := mini(candidate + span - 1, MAX_PORT) + var p := candidate + var probes := 0 + while p <= limit and probes < SUGGEST_PORT_MAX_PROBES: + ## Jump past a whole Windows-reserved range in one step (no-op on + ## POSIX: returns `p` unchanged), so we don't probe port-by-port + ## through the large adjacent ranges those services reserve. The + ## jump itself runs no bind probes, so it doesn't count against the cap. + var not_reserved := WindowsPortReservation.suggest_non_excluded_port(p, limit - p + 1, MAX_PORT) + if not_reserved < p or not_reserved > limit: + break + p = not_reserved + probes += 1 + if PortResolver.can_bind_local_port(p): + return p + p += 1 + return candidate + + +# --- Client operations (string id) --------------------------------------- + +static func client_ids() -> PackedStringArray: + return ClientRegistry.ids() + + +static func has_client(id: String) -> bool: + return ClientRegistry.has_id(id) + + +static func client_display_name(id: String) -> String: + var c := ClientRegistry.get_by_id(id) + return c.display_name if c != null else id + + +## Pass an explicit `url` when calling from a worker thread: `http_url()` +## reads `EditorInterface.get_editor_settings()`, which is main-thread-only. +## Empty defaults to the live server URL — appropriate for MCP-tool callers +## that always run on main. +static func configure(id: String, url: String = "", launch_context: Dictionary = {}) -> Dictionary: + if ClientRegistry.stale_session_detected(): + return {"status": "error", "message": ClientRegistry.RESTART_TO_FINISH_UPDATE} + var client := ClientRegistry.get_by_id(id) + if client == null: + return {"status": "error", "message": "Unknown client: %s" % id} + var path_error := _config_path_resolution_error(client) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + ## Capture `url` once so a port flip in EditorSettings between write and + ## verify can't trigger a spurious CONFIGURED_MISMATCH against an entry + ## that just landed correctly. + if url.is_empty(): + url = http_url() + var context := launch_context + if client.command_shape != Client.CommandShape.NONE and context.is_empty(): + if OS.get_thread_caller_id() != OS.get_main_thread_id(): + return { + "status": "error", + "message": "Cannot configure %s without a main-thread launch snapshot; retry from the dock." % client.display_name, + } + context = capture_launch_context() + var launch := ( + resolve_attach_launch(context) + if client.command_shape != Client.CommandShape.NONE + else {} + ) + var result := _dispatch_configure(client, url, launch, context) + ## Trust-but-verify: a strategy may report ok and have actually written the + ## file, yet the entry is missing/stale on the read-back path — most often + ## because the user's installed client is reading a different file than + ## `path_template` resolves to (issue #201). Re-read the live state and + ## surface a clear error before the dock reports a bogus green dot. + return _verify_post_state(client, result, Client.Status.CONFIGURED, url, "configure", launch, context) + + +static func check_status(id: String) -> Client.Status: + if ClientRegistry.stale_session_detected(): + return Client.Status.ERROR + var client := ClientRegistry.get_by_id(id) + if client == null: + return Client.Status.NOT_CONFIGURED + var context := capture_launch_context() if client.command_shape != Client.CommandShape.NONE else {} + return _dispatch_check_status(client, http_url(), context) + + +static func check_status_for_url_with_cli_path( + id: String, url: String, cli_path: String, launch_context: Dictionary = {} +) -> Client.Status: + return check_status_details_for_url_with_cli_path(id, url, cli_path, launch_context).get("status", Client.Status.NOT_CONFIGURED) + + +## True when 's stored entry verifies EXACTLY against the launch this +## editor would have rendered at `from_version` — same ports, exclusions, +## telemetry flag, command shape; nothing differs but the version pin. This +## is the post-update auto-repin gate: only such entries are provably "what +## Configure wrote before the update", so rewriting them to the current +## version restores the user's own prior intent. Anything else — entries +## pointing at another editor's ports (the smoke-fixture blast radius that +## motivated this gate), hand-edits, changed settings — stays untouched for +## the drift banner's human click. An empty `from_version` (marker written +## by a pre-gate runner) fails closed. +## +## The version-substituted context is safe to resolve and cache: +## `plugin_version` is part of both the attach-launch resolution +## (`_resolve_attach_launch_uncached`) and its cache key. +static func entry_drift_is_version_pin_only( + id: String, from_version: String, launch_context: Dictionary = {} +) -> bool: + var pinned_from := from_version.strip_edges() + if pinned_from.is_empty(): + return false + ## Never shell out from this gate — it runs on the MAIN thread from the + ## dock's sweep-completion callback (#890 review P2). The cli-descriptor + ## probe paths run a subprocess with a multi-second timeout (`claude mcp + ## get` is 6s), which would freeze the editor; those clients fail closed + ## to the drift banner's click flow, whose fan-out already runs on + ## worker threads. Every path left after these guards is a bounded + ## config-file read plus cached launch discovery (worst case one CLI + ## lookup on a cold CliFinder cache — the same bounded one-shot the + ## dock's `_reprobe_uv_if_negative` accepts on this thread). + var client := ClientRegistry.get_by_id(id) + if client == null: + return false + if client.config_type == "cli": + if client.command_shape == Client.CommandShape.NONE: + return false + if not client.has_json_fallback(): + return false + if _scope_diverges_from_json_fallback(client): + return false + var context := launch_context if not launch_context.is_empty() else capture_launch_context() + var old_context := context.duplicate(true) + old_context["plugin_version"] = pinned_from + ## Same URL under both versions: the URL carries the port, not the + ## version, so URL-mode entries can never be version-pin-only drift and + ## correctly fail this check. + var url := str(context.get("server_url", http_url())) + var status := check_status_for_url_with_cli_path(id, url, "", old_context) + return status == Client.Status.CONFIGURED + + +## Detailed variant used by the dock refresh worker. Returns +## `{"status": Status, "error_msg": String}` so the worker can surface +## "probe timed out" on the row instead of silently flipping it to +## NOT_CONFIGURED. Callers that only need the status can use the simpler +## helper above. +static func check_status_details_for_url_with_cli_path( + id: String, + url: String, + cli_path: String, + launch_context: Dictionary = {}, + resolved_launch: Dictionary = {}, +) -> Dictionary: + ## One comprehensible line per row beats a wall of per-field type errors — + ## the dock keeps painting, every row names the same repair (restart). + if ClientRegistry.stale_session_detected(): + return {"status": Client.Status.ERROR, "error_msg": ClientRegistry.RESTART_TO_FINISH_UPDATE} + var client := ClientRegistry.get_by_id(id) + if client == null: + return {"status": Client.Status.NOT_CONFIGURED, "error_msg": ""} + # A cli client with no resolved binary normally reads as NOT_CONFIGURED. + # Skip that shortcut when the client has a JSON fallback (#463): the + # dispatch below reads its config file directly so the status dot reflects + # a fallback-configured entry instead of always showing red. + if client.config_type == "cli" and cli_path.is_empty() and not client.has_json_fallback(): + return {"status": Client.Status.NOT_CONFIGURED, "error_msg": ""} + var path_error := _config_path_resolution_error(client) + if not path_error.is_empty(): + return {"status": Client.Status.ERROR, "error_msg": path_error} + if client.command_shape != Client.CommandShape.NONE and launch_context.is_empty(): + return { + "status": Client.Status.ERROR, + "error_msg": "Missing launch-context snapshot; retry the status refresh.", + } + return _dispatch_check_status_with_cli_path_details( + client, url, cli_path, launch_context, resolved_launch + ) + + +## #691: main-thread pre-warm of McpPathTemplate's env snapshot, covering +## the base vars plus every descriptor-declared config-file/config-home env +## (OPENCODE_CONFIG, CLAUDE_CONFIG_DIR, CODEX_HOME, …), so worker-thread config-path +## resolution never calls OS.get_environment concurrently with the spawn +## window's setenv/unsetenv. Also warms the EditorSettings snapshot for +## the mode/trace overrides so worker-thread mode_override() / +## startup_trace_enabled() never touch EditorInterface. Idempotent; +## called from plugin _enter_tree and before each dock worker dispatch. +static func warm_env_snapshot() -> void: + var extras := PackedStringArray() + for id in client_ids(): + var client := ClientRegistry.get_by_id(String(id)) + if client == null: + continue + ## Reflected get(): after an in-session self-update these fields can + ## read as Nil on stale instances, and String(Nil) is a hard error (#850). Skipping just degrades env-override + ## resolution until the restart the registry is already asking for. + for env_name in [client.get("config_file_env"), client.get("config_home_env")]: + if env_name is String and not env_name.is_empty() and not extras.has(env_name): + extras.append(env_name) + McpPathTemplate.warm_env_snapshot(extras) + _editor_setting_lookup(MODE_OVERRIDE_SETTING) + _editor_setting_lookup(SETTING_STARTUP_TRACE) + _editor_setting_lookup(SETTING_KEEP_SERVER_ON_EXIT) + _editor_setting_lookup(SETTING_EXTERNAL_CLIENT_CWD) + McpSettings.warm_client_scope() + # Publish the complete launch context while EditorInterface access is safe; + # worker callers of capture_launch_context() read this snapshot only. + capture_launch_context() + + +static func client_status_probe_snapshot(id: String) -> Dictionary: + var client := ClientRegistry.get_by_id(id) + if client == null: + return {} + var cli_path := "" + var installed := false + if client.config_type == "cli": + cli_path = CliStrategy.resolve_cli_path(client) + # #463: a JSON-fallback cli client (Claude Code as a VS Code extension) + # is "installed" when its fallback config exists, even with no binary. + installed = not cli_path.is_empty() or client.is_installed() + else: + installed = client.is_installed() + return {"id": id, "cli_path": cli_path, "installed": installed} + + +## Force lazy GDScript bytecode swaps to complete before a client-status +## worker reaches the registry and strategies. Pure-memory only: callers can +## run this on the handler thread without performing CLI or config probes. +static func warm_status_worker_bytecode() -> void: + var ids := client_ids() + if ids.is_empty(): + return + var any_client := ClientRegistry.get_by_id(String(ids[0])) + if any_client != null: + JsonStrategy.verify_entry(any_client, {}, "") + DshStrategy.command_launch_error(any_client, {}) + TomlStrategy.format_body(PackedStringArray(), "") + CliStrategy.format_args(PackedStringArray(), "", "") + # Compile the aggregate worker entry point on main as well. After a plugin + # reload, first-dereferencing this function from Thread can hang in Godot's + # lazy bytecode swap even when every strategy it calls was already warmed. + run_client_status_sweep({}, true) + + +## Worker entry point for the MCP aggregate status command. Every filesystem, +## CLI, and launch-discovery probe stays inside this function; the WebSocket +## handler only schedules it and returns the deferred sentinel. +static func run_client_status_sweep( + fallback_launch_context: Dictionary = {}, warm_only: bool = false +) -> Dictionary: + if warm_only: + return {} + var clients := [] + var launch_context := capture_launch_context() + if launch_context.is_empty(): + launch_context = fallback_launch_context.duplicate(true) + if launch_context.is_empty(): + return {"worker_error": "Client status launch context was not warmed on the main thread."} + var server_url := server_url_from(launch_context) + var resolved_launch := resolve_attach_launch(launch_context) + for client_id in client_ids(): + var probe := client_status_probe_snapshot(client_id) + var details := check_status_details_for_url_with_cli_path( + client_id, + server_url, + str(probe.get("cli_path", "")), + launch_context, + resolved_launch, + ) + clients.append(_client_status_sweep_entry( + client_id, details, bool(probe.get("installed", false)) + )) + return {"data": {"clients": clients}} + + +static func _client_status_sweep_entry( + client_id: String, details: Dictionary, installed: bool +) -> Dictionary: + var status = details.get("status", Client.Status.NOT_CONFIGURED) + var entry := { + "id": client_id, + "display_name": client_display_name(client_id), + "status": Client.status_label(status), + "installed": installed, + } + var error_msg := str(details.get("error_msg", "")) + if not error_msg.is_empty(): + entry["error"] = error_msg + return entry + + +## Pass an explicit `url` when calling from a worker thread — see +## `configure()` above for why. The url is only used to format the +## verify-after-write diagnostic message; the remove itself doesn't need it. +static func remove(id: String, url: String = "", launch_context: Dictionary = {}) -> Dictionary: + if ClientRegistry.stale_session_detected(): + return {"status": "error", "message": ClientRegistry.RESTART_TO_FINISH_UPDATE} + var client := ClientRegistry.get_by_id(id) + if client == null: + return {"status": "error", "message": "Unknown client: %s" % id} + var path_error := _config_path_resolution_error(client) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if url.is_empty(): + url = http_url() + var context := launch_context + if client.command_shape != Client.CommandShape.NONE and context.is_empty(): + if OS.get_thread_caller_id() != OS.get_main_thread_id(): + return { + "status": "error", + "message": "Cannot remove %s without a main-thread launch snapshot; retry from the dock." % client.display_name, + } + context = capture_launch_context() + var launch := ( + resolve_attach_launch(context) + if client.command_shape != Client.CommandShape.NONE + else {} + ) + var result := _dispatch_remove(client, context) + return _verify_post_state(client, result, Client.Status.NOT_CONFIGURED, url, "remove", launch, context) + + +## Resolve config-backed path errors before attach-launch discovery. This both +## gives ambiguity precedence over unrelated launcher failures and avoids +## spending the status worker's command budget on a Configure action that must +## fail closed regardless. CLI clients keep their existing CLI/fallback dispatch. +static func _config_path_resolution_error(client: Client) -> String: + if client.config_type == "cli": + return "" + return str(client.resolved_config_path_details().get("error", "")) + + +# --- Strategy dispatch + verify (testable seam) -------------------------- + +static func _dispatch_configure( + client: Client, url: String, launch: Dictionary = {}, launch_context: Dictionary = {} +) -> Dictionary: + launch = launch_for_client(client, launch) + match client.config_type: + "json": + return JsonStrategy.configure(client, SERVER_NAME, url, launch, _project_roots_from_context(launch_context)) + "toml": + return TomlStrategy.configure(client, SERVER_NAME, url, launch) + "yaml": + return YamlStrategy.configure(client, SERVER_NAME, url, launch) + "dsh": + return DshStrategy.configure(client, SERVER_NAME, url, launch) + "cli": + # #463: fall back to writing the config file directly when the CLI + # binary isn't on PATH (Claude Code as a VS Code/Cursor extension). + if client.has_json_fallback() and CliStrategy.resolve_cli_path(client).is_empty(): + return _note_unhonoured_scope( + client, JsonStrategy.configure(client, SERVER_NAME, url, launch, _project_roots_from_context(launch_context)) + ) + return CliStrategy.configure(client, SERVER_NAME, url, launch) + return {"status": "error", "message": "Unknown config_type for %s: %s" % [client.id, client.config_type]} + + +static func _dispatch_remove(client: Client, launch_context: Dictionary = {}) -> Dictionary: + match client.config_type: + "json": + return JsonStrategy.remove(client, SERVER_NAME, _project_roots_from_context(launch_context)) + "toml": + return TomlStrategy.remove(client, SERVER_NAME) + "yaml": + return YamlStrategy.remove(client, SERVER_NAME) + "dsh": + return DshStrategy.remove(client, SERVER_NAME) + "cli": + # #463: mirror the configure fallback so Remove also works without + # the CLI binary — otherwise a fallback-written entry is unremovable. + if client.has_json_fallback() and CliStrategy.resolve_cli_path(client).is_empty(): + return JsonStrategy.remove(client, SERVER_NAME, _project_roots_from_context(launch_context)) + return CliStrategy.remove(client, SERVER_NAME) + return {"status": "error", "message": "Unknown config_type for %s: %s" % [client.id, client.config_type]} + + +static func _dispatch_check_status( + client: Client, url: String, launch_context: Dictionary = {} +) -> Client.Status: + return _dispatch_check_status_with_cli_path(client, url, "", launch_context) + + +static func _dispatch_check_status_with_cli_path( + client: Client, url: String, cli_path: String, launch_context: Dictionary = {} +) -> Client.Status: + return _dispatch_check_status_with_cli_path_details(client, url, cli_path, launch_context).get("status", Client.Status.NOT_CONFIGURED) + + +static func _dispatch_check_status_with_cli_path_details( + client: Client, + url: String, + cli_path: String, + launch_context: Dictionary = {}, + resolved_launch: Dictionary = {}, +) -> Dictionary: + match client.config_type: + "json": + var launch := {} + if client.command_shape != Client.CommandShape.NONE: + launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return JsonStrategy.check_status_details(client, SERVER_NAME, url, launch, _project_roots_from_context(launch_context)) + "toml": + var launch := {} + if client.command_shape != Client.CommandShape.NONE: + launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return TomlStrategy.check_status_details(client, SERVER_NAME, url, launch) + "yaml": + var yaml_launch := {} + if client.command_shape != Client.CommandShape.NONE: + yaml_launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return YamlStrategy.check_status_details(client, SERVER_NAME, url, yaml_launch) + "dsh": + var dsh_launch := {} + if client.command_shape != Client.CommandShape.NONE: + dsh_launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return DshStrategy.check_status_details(client, SERVER_NAME, url, dsh_launch) + "cli": + # Command-shape CLI clients register through their CLI, but the entry + # lands in the same file the JSON fallback reads (`claude mcp add + # --scope user` writes mcpServers in ~/.claude.json). Reading that + # file gives exact launch-drift detection — a changed port, version + # pin, or exclusion list — which scanning `mcp list` stdout cannot, + # so it is preferred even when the CLI binary resolves. + # #872: ...but only while the selected scope is still the one + # `path_template` points at — see _scope_diverges_from_json_fallback. + if ( + client.command_shape != Client.CommandShape.NONE + and client.has_json_fallback() + and not _scope_diverges_from_json_fallback(client) + ): + var command_launch := _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return JsonStrategy.check_status_details(client, SERVER_NAME, url, command_launch, _project_roots_from_context(launch_context)) + var resolved_cli := cli_path if not cli_path.is_empty() else CliStrategy.resolve_cli_path(client) + # #463: with no CLI binary, read the JSON fallback config so a + # fallback-configured entry reports CONFIGURED instead of red. + if resolved_cli.is_empty() and client.has_json_fallback(): + var fallback_launch := {} + if client.command_shape != Client.CommandShape.NONE: + fallback_launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + return JsonStrategy.check_status_details(client, SERVER_NAME, url, fallback_launch, _project_roots_from_context(launch_context)) + var cli_launch := {} + if client.command_shape != Client.CommandShape.NONE: + cli_launch = _resolved_or_discovered_launch(client, resolved_launch, launch_context) + # #872: at a scope `path_template` can't see, a plain listing probe + # cannot tell our entry from a leftover one in another scope. When + # the descriptor offers a scope-aware probe, use it — same single + # subprocess, but it reports which scope actually resolved. + if ( + not client.cli_scope_status_template.is_empty() + and CliStrategy.uses_scope_token(client) + ): + return CliStrategy.check_scope_status_details( + client, SERVER_NAME, url, resolved_cli, cli_launch, McpSettings.client_scope() + ) + return CliStrategy.check_status_details(client, SERVER_NAME, url, resolved_cli, cli_launch) + return {"status": Client.Status.NOT_CONFIGURED, "error_msg": ""} + + +## #872: the #463 JSON fallback writes the user-scope file whatever +## `godot_ai/mcp_client_scope` says — that file IS `path_template`, and +## `clients/_path_template.gd` has no project-relative token to aim it +## elsewhere. Returning a bare "configured" would hide that the requested +## scope was not honoured, so say so in the message. +## +## Deliberately a message and not a status. `_verify_post_state` compares the +## post-write status against CONFIGURED and replaces the ok with an error on +## any mismatch (pinned by test_verify_post_state_treats_drift_as_failure_ +## after_configure), so reporting this write as NOT_CONFIGURED or MISMATCH +## would turn a *successful* configure into a user-facing failure — the same +## false-error class #872's blocker was about, just moved onto the fallback +## path. The entry is genuinely written and genuinely works; only its scope +## differs from the request, and that is a caveat, not a failure. +static func _note_unhonoured_scope(client: Client, result: Dictionary) -> Dictionary: + if result.get("status") != "ok": + return result + if not CliStrategy.uses_scope_token(client): + return result + var scope := McpSettings.client_scope() + if scope == McpSettings.DEFAULT_CLIENT_SCOPE: + return result + var noted := result.duplicate(true) + noted["message"] = ( + "%s — wrote %s scope, not %s: the %s CLI wasn't found, and the file fallback can only write %s" + % [ + str(result.get("message", "")), + McpSettings.DEFAULT_CLIENT_SCOPE, + scope, + client.display_name, + client.resolved_config_path(), + ] + ) + return noted + + +## True when this client's CLI writes its entry somewhere `path_template` +## cannot see, so reading that file would describe the wrong thing (#872). +## +## `claude mcp add --scope project` writes /.mcp.json and `--scope local` +## writes a per-project block inside ~/.claude.json — neither is the top-level +## `mcpServers` map `path_template` + `server_key_path` resolve to. Reading it +## anyway makes `_verify_post_state` turn every successful project-scope +## Configure into "configure ok but verification still reads Not configured", +## and pins the dock row red (or green, describing a stale user-scope entry). +## +## Diverging sends status down the CLI probe instead: `mcp list` is +## scope-agnostic and inherits the same cwd the register ran in, so read-back +## and write agree by construction. The cost is losing exact launch-drift +## detection — a stdout scan sees the command, not the full argv — which is the +## documented trade for a status that is merely coarse instead of wrong. +## +## Deliberately says nothing about whether the CLI resolves (#879). An earlier +## version walked PATH here and returned false for an unresolvable binary, on +## the reasoning that configure would then have taken the #463 JSON fallback — +## which writes user scope whatever the setting says — so the file was the +## right thing to read again. That extra clause could not change any outcome: +## this is only consulted from the one call site below, already guarded on +## `has_json_fallback()`, and when the CLI does not resolve the very next +## branch (`resolved_cli.is_empty() and client.has_json_fallback()`) takes the +## fallback read anyway. All it bought was a second full `McpCliFinder.find` +## sweep per status check, on top of the one that immediately follows. +static func _scope_diverges_from_json_fallback(client: Client) -> bool: + if not CliStrategy.uses_scope_token(client): + return false + return McpSettings.client_scope() != McpSettings.DEFAULT_CLIENT_SCOPE + + +static func _resolved_or_discovered_launch( + client: Client, resolved_launch: Dictionary, launch_context: Dictionary +) -> Dictionary: + var launch := ( + resolved_launch + if not resolved_launch.is_empty() + else resolve_attach_launch(launch_context) + ) + return launch_for_client(client, launch) + + +## After a configure/remove returns ok, re-read the live status. If it doesn't +## match `expected`, replace the result with an error that names the actual +## status and the resolved config path so the user can self-diagnose. The +## strategy's own error path is left untouched — already actionable. +static func _verify_post_state( + client: Client, + result: Dictionary, + expected: Client.Status, + url: String, + action: String, + resolved_launch: Dictionary = {}, + launch_context: Dictionary = {}, +) -> Dictionary: + if result.get("status") != "ok": + return result + var details := _dispatch_check_status_with_cli_path_details( + client, url, "", launch_context, resolved_launch + ) + var actual := details.get("status", Client.Status.NOT_CONFIGURED) + if actual == expected: + return result + var path_hint := _post_state_path_hint(client, str(details.get("resolved_scope", ""))) + return { + "status": "error", + "message": "%s reported %s ok but verification still reads %s (expected %s).%s" % [ + client.display_name, action, + Client.status_label(actual), Client.status_label(expected), + path_hint, + ], + } + + +## Where to send the user when verification finds an entry that should not be +## there. `resolved_config_path()` is `path_template` — right only for the +## default user scope. Naming ~/.claude.json for a project-scope survivor sends +## them to a file with nothing in it, which is worse than naming no file at all +## (#879). The scope probe supplies `resolved_scope`; `path_template` has no +## project-relative token (see `_note_unhonoured_scope`), so the project case is +## described rather than resolved to a path. +static func _post_state_path_hint(client: Client, resolved_scope: String) -> String: + match resolved_scope: + "project": + return ( + " The surviving entry is project-scoped: inspect the .mcp.json in the" + + " directory the editor was launched from and remove the godot-ai entry" + + " by hand if needed." + ) + "local": + var local_path := client.resolved_config_path() + if local_path.is_empty(): + return "" + return ( + " The surviving entry is local-scoped: inspect the block for the" + + " directory the editor was launched from in %s and remove the" + + " godot-ai entry by hand if needed." + ) % local_path + _: + var path := client.resolved_config_path() + if path.is_empty(): + return "" + return " Inspect %s and remove the godot-ai entry by hand if needed." % path + + +## #877: Configure's first act is the all-scope pre-cleanup — it deletes the +## `godot-ai` entry from every scope the descriptor can write to, including a +## `.mcp.json` resolved against the CLI's working directory, which need not be +## this project's folder. The manual-command panel that spells those removes +## out is only shown when Configure FAILS (`mcp_dock.gd`), so on the success +## path — the one where the sweep actually ran — this note is its only +## disclosure. Empty for descriptors without a scope token: their single +## implicit pass removes exactly the entry the register is about to rewrite, +## which needs no warning (the same rule `_sweep_caveat` applies). +## +## "attempted", not "cleared": `CliStrategy.configure` discards every +## pre-cleanup result, and `mcp remove` exits non-zero for an absent entry as +## well as for a real failure, so a timed-out or failed remove leaves the scope +## untouched while the register still returns ok. The note names what ran, +## not what it can prove. +static func configure_sweep_note(id: String) -> String: + var client := ClientRegistry.get_by_id(id) + if client == null or client.config_type != "cli": + return "" + if client.cli_unregister_template.is_empty() or not CliStrategy.uses_scope_token(client): + return "" + return "attempted to clear %s from %s" % [ + SERVER_NAME, ", ".join(CliStrategy.cleanup_scopes(client)), + ] + + +static func manual_command(id: String) -> String: + var client := ClientRegistry.get_by_id(id) + if client == null: + return "" + var path_resolution := client.resolved_config_path_details() + var path_error := str(path_resolution.get("error", "")) + if not path_error.is_empty(): + return "Config path unavailable: %s" % path_error + var context := capture_launch_context() if client.command_shape != Client.CommandShape.NONE else {} + var launch := ( + launch_for_client(client, resolve_attach_launch(context)) + if client.command_shape != Client.CommandShape.NONE + else {} + ) + var cmd := ManualCommand.build( + client, + SERVER_NAME, + server_url_from(context), + str(path_resolution.get("path", "")), + launch, + _project_roots_from_context(context), + ) + if cmd.is_empty(): + return cmd + ## #507: when the allow-host opt-in names a non-loopback range, also + ## surface the LAN URL so the user can copy-paste the right address into + ## a remote agent. Informational only — configure/remove still WRITE the + ## loopback URL above; nothing about the config-file contract changes. + var note := McpAllowHosts.lan_url_note(allow_hosts(), IP.get_local_addresses(), http_port()) + if not note.is_empty(): + cmd += "\n\n" + note + return cmd + + +static func config_path(id: String) -> String: + var client := ClientRegistry.get_by_id(id) + return client.resolved_config_path() if client != null else "" + + +## Resolve the highest-precedence config tier that actually contains the server +## entry. For Pi-style merge clients, returns the tier path the entry lives in +## (e.g. `~/.pi/agent/.mcp.json`) instead of the lowest-tier `path_template` +## `config_path()` returns. Falls back to `path_template` when no entry is +## found anywhere. Empty `launch_context` is allowed; command-shape clients +## synthesize one via `capture_launch_context()` so dock row construction can +## call this without first capturing launch state. +static func effective_config_path(id: String, launch_context: Dictionary = {}) -> String: + var client := ClientRegistry.get_by_id(id) + if client == null: + return "" + var resolution := client.resolved_config_path_details() + var fallback := str(resolution.get("path", "")) + var context := launch_context + if context.is_empty() and client.command_shape != Client.CommandShape.NONE: + context = capture_launch_context() + var roots := _project_roots_from_context(context) + var target := JsonStrategy.manual_target_details(client, SERVER_NAME, fallback, roots) + if bool(target.get("ok", false)): + return str(target.get("path", fallback)) + return fallback + + +## Path that `_check_status_merged` would consider authoritative for the +## server entry, or `path_template` when no entry is found anywhere. +## For Pi-style merge clients this is the latest project tier when one +## exists (matching the F2 last-wins status logic), falling back to the +## latest global tier, then to `path_template`. +## +## The dock uses this for Open/Reveal so the file the user inspects is +## the same file that drives the status check — `effective_config_path` +## fails closed (returns `path_template`) when there are multiple project +## tiers, which historically sent users to the wrong file (codex round 3, +## F-3-4). Splitting this from `effective_config_path` keeps the manual +## instructions fail-closed while letting the dock follow the +## authoritative tier. +static func effective_authoritative_path(id: String, launch_context: Dictionary = {}) -> String: + var client := ClientRegistry.get_by_id(id) + if client == null: + return "" + var resolution := client.resolved_config_path_details() + var fallback := str(resolution.get("path", "")) + var context := launch_context + if context.is_empty() and client.command_shape != Client.CommandShape.NONE: + context = capture_launch_context() + var roots := _project_roots_from_context(context) + var authoritative: String = JsonStrategy.authoritative_tier_path(client, SERVER_NAME, roots) + if not authoritative.is_empty(): + return authoritative + return fallback + + +static func is_installed(id: String) -> bool: + var client := ClientRegistry.get_by_id(id) + return client != null and client.is_installed() + + +# --- Server command discovery -------------------------------------------- +# +# Three-tier resolution: +# 1. .venv python — dev checkout, source code +# 2. uvx — user install, published package from PyPI +# 3. godot-ai CLI — system-wide pip/pipx/uv install + +static func get_plugin_version() -> String: + var cfg := ConfigFile.new() + if cfg.load("res://addons/godot_ai/plugin.cfg") == OK: + return cfg.get_value("plugin", "version", "0.0.1") + return "0.0.1" + + +## Strip PEP 440 local build metadata for PyPI pins: `3.0.2+local.1` → `3.0.2`. +## Pre-release segments (`3.1.0-rc1`) are preserved — only `+…` is removed. +static func _pypi_pin_version(version: String) -> String: + var v := version.strip_edges() + var plus := v.find("+") + if plus >= 0: + v = v.substr(0, plus) + return v + + +## Resolve the client-owned `godot-ai attach` command from a main-thread +## LaunchContext. Discovery itself is worker-safe: path/environment lookup is +## snapshot-backed and subprocess probes are wall-clock bounded. +## +## `discovery_override` is a data-only test seam. Supplying a key (including +## an empty value) bypasses that tier's live lookup; `system_version_result` +## bypasses the real `godot-ai --version` subprocess. +static func resolve_attach_launch( + launch_context: Dictionary, discovery_override: Dictionary = {} +) -> Dictionary: + ## Test overrides always bypass the session cache so fixture-controlled + ## discovery remains deterministic. Production results are keyed by every + ## setting that affects the rendered command; a port/domain/version change + ## therefore cannot reuse stale arguments. + if not discovery_override.is_empty(): + return _resolve_attach_launch_uncached(launch_context, discovery_override) + var cache_key := _attach_launch_cache_key(launch_context) + _attach_launch_cache_mutex.lock() + if _attach_launch_cache.has(cache_key): + var cached: Dictionary = _attach_launch_cache[cache_key].duplicate(true) + _attach_launch_cache_mutex.unlock() + return cached + ## Keep the cache lock through the bounded discovery probes. This cold path + ## runs at most once per distinct context and prevents simultaneous status + ## workers from repeating the same subprocess probes. Invalidation waits for + ## the in-flight result, then clears it, so stale work cannot repopulate a + ## freshly invalidated cache. + var resolved := _resolve_attach_launch_uncached(launch_context) + _attach_launch_cache[cache_key] = resolved.duplicate(true) + _attach_launch_cache_mutex.unlock() + return resolved + + +static func _resolve_attach_launch_uncached( + launch_context: Dictionary, discovery_override: Dictionary = {} +) -> Dictionary: + for key in ["http_port", "ws_port", "excluded_domains", "plugin_version", "allow_dev_venv", "platform"]: + if not launch_context.has(key): + return _attach_discovery_error("Launch context is missing `%s`; retry Configure." % key) + + var plugin_version := str(launch_context.get("plugin_version", "")).strip_edges() + if plugin_version.is_empty(): + return _attach_discovery_error("The bundled godot-ai version is unavailable; reinstall the plugin and retry Configure.") + + var common_args: Array[String] = [ + "attach", + "--port", str(int(launch_context.get("http_port", DEFAULT_HTTP_PORT))), + "--ws-port", str(int(launch_context.get("ws_port", DEFAULT_WS_PORT))), + ] + var exclusions := str(launch_context.get("excluded_domains", "")).strip_edges() + if not exclusions.is_empty(): + common_args.append_array(["--exclude-domains", exclusions]) + ## Default true when the key is absent (hand-built contexts in tests, stale + ## pre-upgrade snapshots) — matching the server's send-by-default posture. + ## Toggling the setting changes the rendered argv, so existing entries read + ## CONFIGURED_MISMATCH and the dock offers Reconfigure, like any other + ## launch-affecting value. + if not bool(launch_context.get("telemetry_enabled", true)): + common_args.append("--disable-telemetry") + + var venv_python := "" + if discovery_override.has("venv_python"): + venv_python = str(discovery_override["venv_python"]) + elif bool(launch_context.get("allow_dev_venv", true)): + venv_python = _cached_venv_python() + if bool(launch_context.get("allow_dev_venv", true)) and not venv_python.is_empty(): + var venv_args: Array[String] = ["-m", "godot_ai"] + venv_args.append_array(common_args) + return _finalize_attach_launch( + "dev_venv", venv_python, venv_args, launch_context, discovery_override + ) + + var uvx := "" + if discovery_override.has("uvx_path"): + uvx = str(discovery_override["uvx_path"]) + else: + ## Strict lookup for attach entries: never write a bare `uvx` command + ## that a GUI-launched client may be unable to resolve from its PATH. + uvx = find_uvx() + if not uvx.is_empty(): + var uvx_args: Array[String] = [ + "--link-mode", "copy", + "--from", "godot-ai==%s" % _pypi_pin_version(plugin_version), + "godot-ai", + ] + uvx_args.append_array(common_args) + return _finalize_attach_launch( + "uvx", uvx, uvx_args, launch_context, discovery_override + ) + + var system_cmd := "" + if discovery_override.has("system_path"): + system_cmd = str(discovery_override["system_path"]) + else: + system_cmd = _find_system_install() + if not system_cmd.is_empty(): + var probe: Dictionary + if discovery_override.has("system_version_result"): + probe = discovery_override["system_version_result"] as Dictionary + else: + probe = McpCliExec.run(system_cmd, ["--version"], _DISCOVERY_TIMEOUT_MS, false) + var version_check := _system_version_from_probe(probe) + if bool(version_check.get("ok", false)): + var found_version := str(version_check.get("version", "")) + if found_version == plugin_version: + return _finalize_attach_launch( + "system", system_cmd, common_args, launch_context, discovery_override + ) + return _attach_discovery_error( + "System godot-ai is version %s, but this plugin requires %s. Install uv or update the system package, then retry Configure." + % [found_version, plugin_version] + ) + if bool(probe.get("timed_out", false)): + return _attach_discovery_error( + "Timed out checking the system godot-ai version. Install uv or repair the system command, then retry Configure." + ) + return _attach_discovery_error( + "Could not verify the system godot-ai version. Install uv or repair the system command, then retry Configure." + ) + + return _attach_discovery_error( + "No compatible godot-ai launcher was found. Install uv (provides uvx), then retry Configure." + ) + + +## Return a launch shape that cannot allocate a visible console on Windows. +## The development tier can execute its sibling pythonw directly. uvx and the +## system entry point still need their own environments, so pythonw acts only +## as a stdio-preserving, CREATE_NO_WINDOW process bootstrap for those tiers. +static func _finalize_attach_launch( + tier: String, + command: String, + args: Array[String], + launch_context: Dictionary, + discovery_override: Dictionary, +) -> Dictionary: + if str(launch_context.get("platform", "")) != "Windows": + return {"ok": true, "tier": tier, "command": command, "args": args} + + var pythonw := _resolve_consoleless_python(command, tier, discovery_override) + if pythonw.is_empty(): + return _attach_discovery_error( + "Windows requires pythonw.exe to launch the MCP bridge without opening a terminal window. Repair this Python or uv installation, then retry Configure." + ) + + ## `console_command`/`console_args` carry the unwrapped console-subsystem + ## launch for clients that opt out of pythonw via + ## `needs_consoleless_launcher = false` (#863). Strategies only consume + ## `command`/`args`/`ok`; `launch_for_client` swaps the shapes per client. + if tier == "dev_venv": + return { + "ok": true, "tier": tier, "command": pythonw, "args": args, + "console_command": command, "console_args": args, + } + + var wrapped_args: Array[String] = ["-c", _WINDOWS_STDIO_BOOTSTRAP, command] + wrapped_args.append_array(args) + return { + "ok": true, "tier": tier, "command": pythonw, "args": wrapped_args, + "console_command": command, "console_args": args, + } + + +## Select the launch shape a specific client should see. Clients with +## `needs_consoleless_launcher = false` (Antigravity, #863) get the plain +## console command captured by `_finalize_attach_launch`; everyone else keeps +## the pythonw shape unchanged. Idempotent: the returned dict carries no +## console keys, so a second application is a no-op. +static func launch_for_client(client: Client, launch: Dictionary) -> Dictionary: + if client == null or client.needs_consoleless_launcher: + return launch + if not launch.has("console_command"): + return launch + var selected := launch.duplicate(true) + selected["command"] = selected["console_command"] + selected["args"] = selected["console_args"] + selected.erase("console_command") + selected.erase("console_args") + return selected + + +static func _resolve_consoleless_python( + command: String, tier: String, discovery_override: Dictionary +) -> String: + ## Data-only override keeps resolver tests independent of the host's Python. + if discovery_override.has("consoleless_python"): + return str(discovery_override["consoleless_python"]) + + ## Venv/system console-script launchers normally keep pythonw beside their + ## python.exe. The dev tier must use that exact interpreter so godot_ai is + ## imported from the selected checkout rather than some unrelated install. + var sibling := command.get_base_dir().path_join("pythonw.exe") + if FileAccess.file_exists(sibling): + return sibling + if tier == "dev_venv": + return "" + + ## uvx may be installed without a PATH-visible CPython. Ask its sibling uv + ## for the already-managed system interpreter; Godot AI's existing uvx + ## server launch ensures one normally exists before client configuration. + if tier == "uvx": + var uv := command.get_base_dir().path_join("uv.exe") + if not FileAccess.file_exists(uv): + uv = CliFinder.find(["uv.exe"]) + if not uv.is_empty(): + var probe := McpCliExec.run( + uv, ["python", "find", "--system"], _DISCOVERY_TIMEOUT_MS, false + ) + if int(probe.get("exit_code", -1)) == 0: + var python := str(probe.get("stdout", "")).strip_edges() + if not python.is_empty(): + var managed_pythonw := python.get_base_dir().path_join("pythonw.exe") + if FileAccess.file_exists(managed_pythonw): + return managed_pythonw + + ## A system Python GUI launcher is sufficient for the non-dev bootstrap; + ## it does not import godot_ai itself. + return CliFinder.find(["pythonw.exe"]) + + +static func _system_version_from_probe(probe: Dictionary) -> Dictionary: + if int(probe.get("exit_code", -1)) != 0: + return {"ok": false} + var output := str(probe.get("stdout", "")).strip_edges() + var pattern := RegEx.new() + if pattern.compile("^godot-ai\\s+([^\\s]+)(?:\\s|$)") != OK: + return {"ok": false} + var matched := pattern.search(output) + if matched == null: + return {"ok": false} + return {"ok": true, "version": matched.get_string(1)} + + +static func _attach_discovery_error(message: String) -> Dictionary: + return {"ok": false, "error": message} + + +## Override for the dev-vs-user heuristic. Accepted values: +## "dev" — force dev-checkout mode (skip update check + self-install) +## "user" — force user-install mode (run update check, allow self-install) +## as long as the data-safety guard (addons_dir_is_symlink) passes +## other / unset — "auto": fall back to the .venv-proximity heuristic +## +## Use `user` to test the AssetLib self-update flow from inside a dev +## checkout (there's a .venv nearby but `addons/godot_ai` is a plain copy — +## e.g. after unpacking a release zip into `test_project/`). +## +## Two ways to set it, resolved in priority order: +## 1. EditorSettings → `godot_ai/mode_override` — set manually via +## Editor Settings (no dock UI writes it today); persists +## per-editor-install and wins over the env var so an editor-side +## choice always takes effect without relaunching. +## 2. Env var `GODOT_AI_MODE` — useful for CLI launches and CI. +const MODE_OVERRIDE_ENV := "GODOT_AI_MODE" +const MODE_OVERRIDE_SETTING := "godot_ai/mode_override" + + +static func mode_override() -> String: + # 1. EditorSetting wins — the user explicitly set it via Editor Settings. + # _editor_setting_lookup handles the `Engine.is_editor_hint()` gate + # (no-op in the game subprocess; see CLAUDE.md "Game-side code") and + # serves worker threads from a main-thread-warmed snapshot — this + # runs on the #678 startup walk's discovery worker, and + # EditorInterface/EditorSettings are not thread-safe (#691). + var setting: Variant = _editor_setting_lookup(MODE_OVERRIDE_SETTING) + if setting != null: + var setting_val := str(setting).strip_edges().to_lower() + if setting_val == "dev" or setting_val == "user": + return setting_val + # 2. Env var fallback. env_lookup, not OS.get_environment: same + # worker-thread reason (#691). + var raw := McpPathTemplate.env_lookup(MODE_OVERRIDE_ENV).strip_edges().to_lower() + if raw == "dev" or raw == "user": + return raw + return "" + + +static func is_dev_checkout() -> bool: + match mode_override(): + "dev": + return true + "user": + return false + return not _find_venv_python().is_empty() + + +## Data-safety check for self-install: is `res://addons/godot_ai` a symbolic +## link? In a dev checkout this points at the canonical `plugin/` source +## tree, and writing files into it would clobber tracked source. This check +## is independent of `is_dev_checkout()` so a forced-user mode override +## still cannot extract a release zip over the symlink. +static func addons_dir_is_symlink() -> bool: + return _is_symlink(ProjectSettings.globalize_path("res://addons/godot_ai")) + + +## Mirrors the idiom used in `mcp_dock.gd::_resolve_plugin_symlink_target` — +## open the parent dir and ask Godot via `DirAccess.is_link()`, which +## handles symlinks on POSIX and reparse points on Windows natively. +static func _is_symlink(path: String) -> bool: + if path.is_empty(): + return false + var dir := DirAccess.open(path.get_base_dir()) + if dir == null: + ## This is a data-safety guard (a symlinked addons dir is a dev + ## checkout self-update must never write through). When the path + ## exists but its parent can't be opened, we can't PROVE it isn't + ## a link — fail closed and treat it as one (#711). + return DirAccess.dir_exists_absolute(path) or FileAccess.file_exists(path) + return dir.is_link(path) + + +## `refresh` forces uvx to re-fetch PyPI index metadata on spawn — used by +## `_start_server`'s one-shot retry when the first attempt exited fast with +## no pid-file on the uvx tier (stale-index-cache failure mode). No-op on +## other tiers: dev_venv and system resolve locally, so the flag has nowhere +## to go. See plugin.gd::_should_retry_with_refresh. +static func get_server_command(refresh: bool = false) -> Array[String]: + ## `mode_override() == "user"` skips the dev_venv tier even when a nearby + ## .venv exists — the override then becomes an actual workaround for + ## the "user venv misidentified as dev checkout" bug, not just a + ## cosmetic relabel. + if mode_override() != "user": + var venv_python := _cached_venv_python() + if not venv_python.is_empty(): + print("MCP | using dev venv: %s" % venv_python) + return [venv_python, "-m", "godot_ai"] + + var uvx := find_uvx() + if not uvx.is_empty(): + var version := get_plugin_version() + ## PEP 440 local build tags (e.g. 3.0.2+local.1) are not on PyPI. + ## Pin uvx to the public base version so the server still boots; + ## checkout-local extras need the dev_venv tier above + ## (symlink/junction → repo .venv). + var pypi_version := _pypi_pin_version(version) + ## Pin to the EXACT plugin version rather than `~=`. Under the + ## tilde form, uvx was happy to reuse a cached tool env that matched + ## the minor constraint — so an install that first spawned 1.2.0 kept + ## using 1.2.0 even after 1.2.1/1.2.2 landed. Exact pinning makes the + ## cache key version-specific: if the cached env matches, fast hit; + ## otherwise uvx installs the exact version fresh. Keeps plugin and + ## server version in lockstep without needing `--refresh-package` on + ## every spawn. See issue #133. + if pypi_version != version: + print( + "MCP | using uvx (godot-ai==%s; local plugin %s not on PyPI)%s" + % [pypi_version, version, " [refresh]" if refresh else ""] + ) + else: + print("MCP | using uvx (godot-ai==%s)%s" % [pypi_version, " [refresh]" if refresh else ""]) + var cmd: Array[String] = [uvx] + if refresh: + cmd.append("--refresh") + cmd.append_array(["--from", "godot-ai==%s" % pypi_version, "godot-ai"]) + return cmd + + var system_cmd := _find_system_install() + if not system_cmd.is_empty(): + print("MCP | using system install: %s" % system_cmd) + return [system_cmd] + + push_warning("MCP | no server found — install uv or run: pip install godot-ai") + return [] + + +## Which tier `get_server_command` would resolve to, without side-effects. +## Returned as a stable string so handshakes and session_list can expose it +## to MCP callers. Values track the `Literal` on the Python side. +static func get_server_launch_mode() -> String: + if mode_override() != "user" and not _cached_venv_python().is_empty(): + return "dev_venv" + if not find_uvx().is_empty(): + return "uvx" + if not _find_system_install().is_empty(): + return "system" + return "unknown" + + +## Wall-clock budget for the Configure-time pre-warm. Far above +## `McpCliExec.DEFAULT_TIMEOUT_MS` (8s) on purpose: this call is *expected* to +## take tens of seconds on a cold cache — downloading and unpacking the tool +## environment is the entire point — so the usual CLI-registry budget would +## kill it right when it is doing useful work. Still bounded so a wedged uv +## can't hold the worker thread forever. +const PREWARM_TIMEOUT_MS := 180000 + + +static func find_uvx() -> String: + return CliFinder.find(_uvx_cli_names()) + + +## Pre-build the uvx tool environment for `godot-ai==` in the +## background, so the FIRST spawn of that version is a warm cache hit. +## Fired when a self-update install starts: post-update the old backend is +## killed and the new one spawned, and a cold `uvx --from godot-ai==` +## resolve+install takes seconds — while an attach bridge pinned to the OLD +## version respawns its already-cached backend near-instantly, winning the +## port bind race every time (the INCOMPATIBLE dead end after every +## self-update with a live AI client). Warming the new env while the plugin +## zip downloads flips that race. +## +## `--version` makes the spawned process exit immediately after uv resolves +## and installs the env. Detached fire-and-forget: a failure only means the +## post-update spawn pays the cold cost it always used to. Returns the +## spawned PID, or -1 when skipped (no uvx on this machine — the dev-venv +## and system tiers have no per-version cache to warm — or no version). +static func prewarm_server_package(version: String) -> int: + var args := prewarm_server_package_argv(version) + if args.is_empty(): + return -1 + var uvx := find_uvx() + if uvx.is_empty(): + return -1 + var pid := OS.create_process(uvx, args) + if pid > 0: + print("MCP | pre-warming godot-ai==%s server package for the post-update restart" % version.strip_edges()) + return pid + + +## Pure argv builder for the pre-warm spawn, split out so tests can pin the +## exact command without spawning a process. Empty array when there is no +## version to pin, or when the version carries characters outside the PEP +## 440 alphabet — the value can originate from a GitHub release tag, and +## while OS.create_process argv can't be shell-injected, constraining the +## pin keeps a hostile tag from smuggling anything into the requirement +## spec uv parses (#890 review). +static func prewarm_server_package_argv(version: String) -> Array[String]: + var pinned := version.strip_edges() + if pinned.is_empty(): + return [] + ## No `*`: PEP 440 reserves it for prefix-match SPECIFIERS (`==3.2.*`), + ## not version identifiers — letting it through would turn the exact pin + ## into a prefix match (#890 CodeRabbit). + var re := RegEx.new() + if re.compile("^[A-Za-z0-9.+!-]+$") != OK or re.search(pinned) == null: + return [] + return ["--from", "godot-ai==%s" % pinned, "godot-ai", "--version"] + + +## Blocking sibling of `prewarm_server_package`, for the user-initiated +## Configure flow (#851, and the reconnect timeouts reported alongside it). +## +## Why Configure needs its own pre-warm: `prewarm_server_package` only fires +## on self-update and on server-lifecycle recovery. Neither covers the case +## that actually bites — the plugin ADOPTS an already-running server (no uvx +## spawn, so nothing warms the env), the user clicks Configure, and the first +## client launch is the one that pays for building the whole tool environment. +## That build is ~67 packages; a warm launch is ~0.1s. Two symptoms fall out +## of the cold path: a visible terminal window on Windows (#851), and a spawn +## that overruns the MCP client's default 30s connect timeout, which the user +## sees as the Godot AI tools silently disappearing. +## +## Why blocking, unlike the fire-and-forget server-side pre-warm: Configure is +## a deliberate click, so the cost is attributable and the dock can show it as +## progress rather than as an unexplained pause. Runs on the dock's client +## action worker thread — never the main thread — and `McpCliExec.run` bounds +## it, so a wedged uv cannot trap the worker. +## +## Best-effort by contract. The config file is already written and correct +## when this runs; a failure here only means the next client launch pays the +## cold cost it always used to. Callers must NOT downgrade a successful +## Configure because of this result. +## +## Returns the `McpCliExec.run` dict, plus `skipped` (true when there is no +## uvx tier to warm or no usable version pin). +static func prewarm_server_package_blocking( + version: String, + timeout_ms: int = PREWARM_TIMEOUT_MS, + cancel_check: Callable = Callable(), +) -> Dictionary: + var args := prewarm_server_package_argv(version) + if args.is_empty(): + return {"skipped": true, "reason": "no version pin"} + var uvx := find_uvx() + if uvx.is_empty(): + ## dev-venv and system tiers have no per-version cache to warm. + return {"skipped": true, "reason": "no uvx"} + var result := McpCliExec.run(uvx, args, timeout_ms, true, cancel_check) + result["skipped"] = false + return result + + +## Decide whether the freshly-written entry has an environment worth warming. +## +## Pure and side-effect free, split from the spawn below so tests can pin the +## decision without building a real uv environment — the same split +## `prewarm_server_package_argv` uses for the argv (#890). +## +## Warms only the `uvx` tier: dev-venv and system launches run an +## already-installed package and have no per-version environment to build. +## Resolving the tier here rather than in the dock keeps launcher knowledge in +## the configurator; the dock stays free of tier branching. +## +## Returns `{warm: bool, version: String, reason: String}`. +static func prewarm_attach_plan( + launch_context: Dictionary, discovery_override: Dictionary = {} +) -> Dictionary: + var launch := resolve_attach_launch(launch_context, discovery_override) + if not bool(launch.get("ok", false)): + return {"warm": false, "version": "", "reason": "launch discovery failed"} + var tier := str(launch.get("tier", "")) + if tier != "uvx": + return {"warm": false, "version": "", "reason": "tier %s has no env to warm" % tier} + var version := _pypi_pin_version(str(launch_context.get("plugin_version", ""))) + if version.is_empty(): + return {"warm": false, "version": "", "reason": "no version pin"} + return {"warm": true, "version": version, "reason": ""} + + +## Warm the environment the freshly-written entry will actually launch. +## Thin wrapper over `prewarm_attach_plan` + `prewarm_server_package_blocking`. +static func prewarm_attach_launch( + launch_context: Dictionary, + timeout_ms: int = PREWARM_TIMEOUT_MS, + discovery_override: Dictionary = {}, + cancel_check: Callable = Callable(), +) -> Dictionary: + var plan := prewarm_attach_plan(launch_context, discovery_override) + if not bool(plan.get("warm", false)): + return {"skipped": true, "reason": str(plan.get("reason", ""))} + return prewarm_server_package_blocking( + str(plan.get("version", "")), timeout_ms, cancel_check + ) + + +static func _uvx_cli_names() -> Array[String]: + var names: Array[String] = [] + names.append("uvx.exe" if OS.get_name() == "Windows" else "uvx") + return names + + +## Drop the `CliFinder` cache for the platform-specific uvx binary +## name. Pairs with `invalidate_uv_version_cache()` so the dock's +## `_on_install_uv` can refresh both caches with one call each. The +## OS-specific name matters: Windows caches under `uvx.exe`, every +## other platform under `uvx`; hard-coding `"uvx"` here would leave +## the CLI-path cache stale on Windows after a fresh install and the +## dock would keep showing "uv: not found" for the rest of the session. +static func invalidate_uvx_cli_cache() -> void: + for name in _uvx_cli_names(): + CliFinder.invalidate(name) + + +## Drop the entire `CliFinder` cache. Called from any explicit-user-action +## refresh path (`force=true` in `_request_client_status_refresh` — manual +## Refresh button, popup-open, compat wrapper, future external API) so a +## freshly-installed CLI (claude, codex, gemini, …) gets detected without +## an editor restart. Per-CLI invalidation (`invalidate_uvx_cli_cache`) is +## preferred when the dock knows which binary changed; this catch-all +## handles the "any CLI may have been installed since the last sweep" case. +## +## Thread safety: `CliFinder.invalidate()` guards `_cache` / `_searched` +## with a mutex so it can race safely against worker threads calling +## `find()` from `_run_client_action_worker`. The mutex is held only +## across the dictionary clear, never across the bounded subprocess lookup, +## so this call can never block the main thread on a subprocess. +static func invalidate_cli_cache() -> void: + CliFinder.invalidate() + + +static var _uv_version_cache: String = "" +static var _uv_version_searched: bool = false + + +## Cached for the editor session. The dock's `_refresh_setup_status` +## (called via `call_deferred` from `_build_ui`) calls this on the +## main thread in user mode, so the cold `uvx --version` probe is +## wall-clock bounded and cached. Subsequent calls (focus-in refresh, +## manual Refresh clicks) reuse the cached string. +## +## Invalidate via `invalidate_uv_version_cache()` when the user +## installs / reinstalls uv via the dock so the next refresh reflects +## the new install. The dock's `_on_install_uv` calls this alongside +## `CliFinder.invalidate("uvx")` to clear both the path cache and +## the version cache in one place. +static func check_uv_version() -> String: + if _uv_version_searched: + return _uv_version_cache + var uvx := find_uvx() + if uvx.is_empty(): + _uv_version_searched = true + _uv_version_cache = "" + return "" + var result := McpCliExec.run(uvx, ["--version"], _DISCOVERY_TIMEOUT_MS, false) + if int(result.get("exit_code", -1)) == 0: + var lines := PackedStringArray(str(result.get("stdout", "")).split("\n")) + _uv_version_cache = lines[0].strip_edges() if lines.size() > 0 else "" + else: + _uv_version_cache = "" + _uv_version_searched = true + return _uv_version_cache + + +static func invalidate_uv_version_cache() -> void: + _uv_version_searched = false + _uv_version_cache = "" + + +## True when a probe has run this session and came back empty — i.e. the +## dock is currently rendering "uv: not found". Lets callers decide when +## a re-probe is worth paying for (server-connect transition, manual +## Refresh) without ever re-probing once uv has been found. +static func uv_probe_negative() -> bool: + return _uv_version_searched and _uv_version_cache.is_empty() + + +## Drop both uv caches — the resolved uvx path AND the cached +## `uvx --version` output — so the next check_uv_version() re-runs the +## full detection. #739: a probe that fails once at editor startup +## (contended spawn, cold Defender scan, stale PATH under a +## Steam-launched editor) used to pin "uv: not found" for the whole +## session; the Install-uv click was the only invalidation path. Callers +## invoke this on events that suggest the failure was transient. +static func invalidate_uv_detection() -> void: + invalidate_uvx_cli_cache() + invalidate_uv_version_cache() + _attach_launch_cache_mutex.lock() + _attach_launch_cache.clear() + _attach_launch_cache_mutex.unlock() + + +static var _venv_python_cache: String = "" +static var _venv_python_searched: bool = false +## #678 worker threads write this cache while main-thread callers read +## it; same lock discipline as McpCliFinder (clients/_cli_finder.gd). +static var _venv_mutex: Mutex = Mutex.new() +static var _attach_launch_cache := {} +static var _attach_launch_cache_mutex := Mutex.new() + + +static func _attach_launch_cache_key(launch_context: Dictionary) -> String: + return JSON.stringify([ + launch_context.get("http_port", null), + launch_context.get("ws_port", null), + launch_context.get("excluded_domains", null), + launch_context.get("plugin_version", null), + launch_context.get("allow_dev_venv", null), + launch_context.get("platform", null), + launch_context.get("telemetry_enabled", null), + ]) + + +static func _cached_venv_python() -> String: + _venv_mutex.lock() + if not _venv_python_searched: + _venv_python_cache = _find_venv_python() + _venv_python_searched = true + var cached := _venv_python_cache + _venv_mutex.unlock() + return cached + + +## Absolute path to `res://addons/godot_ai`, resolving Windows junctions / +## POSIX symlinks via `DirAccess.read_link`. Unresolved globalize_path only +## walks the *logical* project path (e.g. MyGame/addons/godot_ai → MyGame) +## and never reaches a fork checkout's `.venv` (…/godot-ai/.venv). +static func resolve_addons_realpath() -> String: + var addons_path := ProjectSettings.globalize_path("res://addons/godot_ai").rstrip("/").rstrip("\\") + if addons_path.is_empty(): + return "" + var parent := addons_path.get_base_dir() + var dir := DirAccess.open(parent) + if dir != null and dir.is_link(addons_path): + var target := dir.read_link(addons_path) + if not target.is_empty(): + if target.is_relative_path(): + target = parent.path_join(target).simplify_path() + return target.rstrip("/").rstrip("\\") + return addons_path + + +static func _find_venv_python() -> String: + ## Optional hard override (junction edge cases / CI). + var env_py := McpPathTemplate.env_lookup("GODOT_AI_VENV_PYTHON").strip_edges() + if not env_py.is_empty(): + if FileAccess.file_exists(env_py): + return env_py + ## An explicit override pointing nowhere is a misconfiguration the + ## user needs to see — falling through silently would make the dev + ## venv appear randomly ignored. + push_warning( + "godot-ai: GODOT_AI_VENV_PYTHON is set but no file exists at '%s'; ignoring override." + % env_py + ) + ## 1) Walk up from the open project (classic monorepo / test_project layout). + var from_project := _find_venv_python_in( + ProjectSettings.globalize_path("res://").rstrip("/").rstrip("\\") + ) + if not from_project.is_empty(): + return from_project + ## 2) Junctioned plugin: resolve reparse target, then walk up to fork root. + var addons_real := resolve_addons_realpath() + if not addons_real.is_empty(): + var from_addons := _find_venv_python_in(addons_real) + if not from_addons.is_empty(): + return from_addons + return "" + + +## Pure path-based lookup so tests can drive it with a scratch dir instead of +## monkey-patching `res://`. Only treats a `.venv/bin/python` as a godot-ai dev +## venv if a sibling `src/godot_ai/` exists in the same parent dir — otherwise +## an unrelated user venv (e.g. `~/.venv` from a data-science side project) +## gets picked up and `python -m godot_ai` fails with ModuleNotFoundError about +## 5s into startup, cascading into an infinite reconnect loop. The retry-with- +## refresh recovery in `plugin.gd::_should_retry_with_refresh` only fires on +## the uvx tier, so the dev_venv misidentification has no escape hatch — the +## detection has to be right the first time. +static func _find_venv_python_in(start_dir: String) -> String: + var dir := start_dir.rstrip("/").rstrip("\\") + var python_name := "python" if OS.get_name() != "Windows" else "python.exe" + var venv_dir := ".venv/bin/" if OS.get_name() != "Windows" else ".venv/Scripts/" + ## 8 hops: game project roots are shallow; junctioned plugins sit at + ## /plugin/addons/godot_ai (4) and nested worktrees may be deeper. + for i in 8: + var venv_path := dir.path_join(venv_dir + python_name) + if FileAccess.file_exists(venv_path) and DirAccess.dir_exists_absolute(dir.path_join("src/godot_ai")): + return venv_path + var parent := dir.get_base_dir() + if parent == dir or parent.is_empty(): + break + dir = parent + return "" + + +## Walk up from `start_dir` looking for a sibling `src/godot_ai/` — returns +## the absolute path of the enclosing `src/` dir, or "". Used by the dev +## server launcher to prepend the caller's own source to PYTHONPATH so a +## worktree-launched editor serves the worktree's Python, not the root +## repo's editable install. See #84. +static func find_worktree_src_dir(start_dir: String) -> String: + var dir := start_dir.rstrip("/") + for i in 5: + var candidate := dir.path_join("src/godot_ai") + if DirAccess.dir_exists_absolute(candidate): + return dir.path_join("src") + var parent := dir.get_base_dir() + if parent == dir: + break + dir = parent + return "" + + +## Delegates to McpCliFinder rather than shelling out to which/where +## directly: the finder adds the well-known-install-dirs and login-shell +## PATH tiers plus its per-exe cache, and this drops the private +## `_pick_best_path` cross-class reach (#711). +static func _find_system_install() -> String: + ## Built with append, not a ternary of untyped literals — assigning a + ## ternary's Array to Array[String] is a runtime error on newer Godot + ## builds (same idiom as _uvx_cli_names above). + var names: Array[String] = ["godot-ai"] + if OS.get_name() == "Windows": + names.push_front("godot-ai.exe") + return CliFinder.find(names) diff --git a/addons/godot_ai/client_configurator.gd.uid b/addons/godot_ai/client_configurator.gd.uid new file mode 100644 index 0000000..9182096 --- /dev/null +++ b/addons/godot_ai/client_configurator.gd.uid @@ -0,0 +1 @@ +uid://1kiy8hqyymyj diff --git a/addons/godot_ai/clients/_atomic_write.gd b/addons/godot_ai/clients/_atomic_write.gd new file mode 100644 index 0000000..3dbf72c --- /dev/null +++ b/addons/godot_ai/clients/_atomic_write.gd @@ -0,0 +1,251 @@ +@tool +class_name McpAtomicWrite +extends RefCounted + +## Write text to a file via temp + rename so a crash mid-write never leaves +## the user's MCP config truncated. Creates the parent dir if needed and +## keeps a one-shot `.backup` of the prior file. +## +## On filesystems where rename-over-existing fails (Windows under AV / lock +## pressure, some SMB shares), falls back to overwrite-copy plus a +## backup-restore on failure. The original file is never removed before the +## new bytes are verified on disk — if both the rename and the copy fail, +## the user's prior config is restored from the `.backup` snapshot. See +## issue #297 finding #10 for the data-loss scenario this guards against. + + +static func write(path: String, content: String) -> bool: + # Last line of defence for the path-resolution layer above. A relative (or + # empty) destination resolves against the EDITOR's working directory, not the + # caller's. The empty-path case is especially deceptive: editor safe-save + # runs mkstemp on "-XXXXXX", writes the payload into the project root, then + # fails only when renaming back to "" and leaves the random file behind. + # Callers gate this already (`McpClient.resolved_config_path_details`), but a + # writer that cannot tell where it is writing must refuse rather than guess. + if not path.is_absolute_path(): + return false + # If the target is a symlink (stow/chezmoi-managed dotfiles), rename-over + # would replace the LINK with a regular file, silently detaching the + # config from the user's dotfile repo (#534). Resolve the link chain and + # write to the real target so the symlink survives. + path = _resolve_symlink_target(path) + var dir_path := path.get_base_dir() + if not DirAccess.dir_exists_absolute(dir_path): + if DirAccess.make_dir_recursive_absolute(dir_path) != OK: + return false + + # Decide the permission mode the final file (and its backup) must carry + # BEFORE we replace anything. A rewrite must preserve the prior file's + # mode: the Claude CLI creates ~/.claude.json as 0600 (it holds OAuth + # creds + history), and a naive FileAccess write + DirAccess copy would + # silently relax that to the umask default (0644) and leak it on shared + # machines. A brand-new config defaults to owner-only 0600 since these + # files routinely carry tokens. On platforms without POSIX permissions + # (Windows) the get/set calls no-op and this logic is inert. See #297 + # finding TC-1. + var had_original := FileAccess.file_exists(path) + var target_mode := _resolve_target_mode(path, had_original) + + # Suffix the temp name with this process's PID so two editors writing the + # same config concurrently (both clicking Configure) can't interleave + # bytes on a shared fixed ".tmp" path (#534). Each process stages its own + # temp file; the final rename remains the atomic commit point. + var tmp_path := "%s.tmp.%d" % [path, OS.get_process_id()] + var file := _open_restricted_temp(tmp_path, target_mode) + if file == null: + return false + file.store_string(content) + # Push Godot's internal buffer out to the OS before the rename. Godot + # exposes no fsync, so the bytes aren't guaranteed durable on the physical + # disk until the OS flushes its own cache — a power loss in that window can + # still lose the data. But flush() ensures the rename can't be ordered ahead + # of the write at the application layer, which is the failure this guards. + file.flush() + file.close() + # Re-assert the mode on the closed inode before rename. The temp was already + # restricted before this handle opened, so this is defence in depth rather + # than the first point at which secrets become owner-only. + if not _apply_mode(tmp_path, target_mode): + DirAccess.remove_absolute(tmp_path) + return false + + # Verify the staged temp landed intact before committing it anywhere. The + # copy-fallback path below already guards this (`_written_size_matches` at + # the rename-fallback check); the rename path was the one gap — under + # disk-full/quota the temp can be silently truncated, and an unverified + # rename would swap a truncated file over the live target while the + # caller is told the write succeeded (#687). + if not _written_size_matches(tmp_path, content): + DirAccess.remove_absolute(tmp_path) + return false + + # Best-effort: snapshot the prior file before we touch the target so we + # can restore on a failed swap. The backup is also kept on success as a + # one-shot rollback aid for the user — give it the same (preserved) mode + # so a 0600 config's backup isn't itself a world-readable copy. + # + # copy_absolute creates the backup at the umask default and we can only + # chmod it afterward, so there's a sub-millisecond window where the backup + # carries default perms. Accepted: it duplicates bytes already sitting at + # `path` (which the caller created 0600) inside the user's own config dir, + # and Godot exposes no API to create the copy pre-chmod'd. Not worth + # reimplementing copy by hand to shave that window. + var backup_path := path + ".backup" + var backup_made := false + if had_original: + DirAccess.remove_absolute(backup_path) + if DirAccess.copy_absolute(path, backup_path) == OK: + if not _apply_mode(backup_path, target_mode): + ## The backup contains the same secrets as the live config. Do + ## not leave that copy behind — or touch the destination — when + ## it cannot be restricted to the intended mode. + DirAccess.remove_absolute(backup_path) + DirAccess.remove_absolute(tmp_path) + return false + backup_made = true + else: + ## copy_absolute may leave a partial destination on failure. It + ## contains config bytes under the process umask, so remove it. + DirAccess.remove_absolute(backup_path) + + if DirAccess.rename_absolute(tmp_path, path) == OK: + return true + + # Rename-over-existing rejected (Windows + AV / lock timing, some SMB + # shares). Use overwrite-copy as the recovery path: copy_absolute never + # removes the original before writing the new bytes, so a failure here + # leaves the user's prior config in place rather than nuking it. + if DirAccess.copy_absolute(tmp_path, path) == OK and _written_size_matches(path, content): + # copy_absolute creates the destination with the default mode, so + # re-apply the preserved/owner-only mode after the copy lands. A + # permission failure is a failed write: fall through to the same + # restore/remove path as a partial copy instead of reporting success + # with a potentially exposed token-bearing config. + if _apply_mode(path, target_mode): + DirAccess.remove_absolute(tmp_path) + return true + + # Copy didn't land cleanly. Restore the destination to its pre-call state. + if backup_made: + # Restore the snapshot we took before the swap. `copy_absolute` + # overwrites the destination, so we don't pre-remove `path` — the + # pre-remove created a window where `path` was gone if the + # subsequent copy itself failed. If the restore copy fails now the + # user's prior bytes are still in `.backup` for manual recovery + # and the false return value tells the caller the swap didn't + # complete. + var restored := ( + DirAccess.copy_absolute(backup_path, path) == OK + and _apply_mode(path, target_mode) + ) + if not restored: + ## The backup's mode was already verified before the swap. Remove + ## any partial/default-mode destination, then move that restricted + ## inode back into place. If even the same-directory rename fails, + ## the complete prior contents remain in `.backup` for recovery. + DirAccess.remove_absolute(path) + DirAccess.rename_absolute(backup_path, path) + elif not had_original and FileAccess.file_exists(path): + # No prior file existed but copy_absolute landed partial bytes at + # `path`. Remove them so the failure leaves nothing on disk rather + # than a truncated/invalid new file. The `file_exists` guard keeps + # us off non-file destinations (a path that points at a directory + # yields `had_original=false` too, but we must not try to delete + # the directory). Issue #297 PR review. + DirAccess.remove_absolute(path) + # (If `had_original` is true but the snapshot couldn't be taken, the + # original on disk is whatever copy_absolute managed to write before + # failing. This is a best-effort path — the false return value tells the + # caller the swap didn't complete; recovery beyond that requires a + # backup we couldn't take.) + DirAccess.remove_absolute(tmp_path) + return false + + +## Follow a symlink chain at `path` and return the final real target, so the +## temp+rename lands on the linked-to file instead of replacing the link. +## +## Best-effort by design: DirAccess.is_link()/read_link() are only implemented +## on platforms with POSIX symlinks (Linux/macOS; on Windows and other +## platforms is_link() returns false), and opening the parent dir can fail for +## exotic paths. In every "can't tell" case we return `path` unchanged, which +## is exactly the pre-#534 behavior — never worse, symlink-preserving where +## the engine lets us detect one. +static func _resolve_symlink_target(path: String) -> String: + var resolved := path + # Bounded hops so a symlink cycle can't loop us forever. + for _hop in 8: + var base_dir := resolved.get_base_dir() + var da := DirAccess.open(base_dir) + if da == null or not da.is_link(resolved): + return resolved + var target := da.read_link(resolved) + if target.is_empty(): + return resolved + if target.is_relative_path(): + target = base_dir.path_join(target) + resolved = target.simplify_path() + return resolved + + +static func _resolve_target_mode(path: String, had_original: bool) -> int: + # Preserve the prior file's POSIX mode on a rewrite; default a brand-new + # config (or any case we can't read a mode for) to owner read+write (0600). + # + # get_unix_permissions returns 0 both on Windows (no POSIX perms) and for a + # genuine 0000 file. Treating 0 as "use the 0600 floor" is deliberate, not a + # missed case: these are config files the plugin must read and write, 0000 is + # unusable, and re-applying 0000 would lock the owner out next run. 0600 is + # still owner-only so this never widens access. (A genuinely-0000 file can't + # reach a rewrite through the config strategies anyway — their read-first + # guard fails to open it and refuses the write before we get here.) + if had_original: + var existing := FileAccess.get_unix_permissions(path) + if existing > 0: + return existing + return FileAccess.UNIX_READ_OWNER | FileAccess.UNIX_WRITE_OWNER + + +## Create/truncate an EMPTY temp file, close it, restrict its mode, then reopen +## it without truncation for the payload write. Godot 4.6 on macOS returns +## FAILED when set_unix_permissions targets a path whose FileAccess is still +## open; the old create -> chmod-while-open -> write sequence therefore emitted +## one warning per configured client and briefly wrote secrets under the umask +## mode. Closing the empty inode first makes the security ordering real and +## removes that platform-specific warning without suppressing genuine errors. +static func _open_restricted_temp(path: String, mode: int) -> FileAccess: + var created := FileAccess.open(path, FileAccess.WRITE) + if created == null: + return null + created.close() + if not _apply_mode(path, mode): + DirAccess.remove_absolute(path) + return null + return FileAccess.open(path, FileAccess.READ_WRITE) + + +static func _apply_mode(path: String, mode: int) -> bool: + # Best-effort. set_unix_permissions returns ERR_UNAVAILABLE on platforms + # without POSIX permissions (Windows); that's expected and ignored so the + # write still works there. mode <= 0 should never happen (resolve always + # returns >0) but is guarded so a future caller can't chmod a file to nothing. + if mode <= 0: + return true + var err := FileAccess.set_unix_permissions(path, mode) + if err == OK or err == ERR_UNAVAILABLE: + return true + # Surface a real chmod failure (not the Windows no-op) so permission + # hardening on a sensitive config doesn't fail completely silently. + push_warning("MCP | could not set permissions on %s: %s" % [path, error_string(err)]) + return false + + +static func _written_size_matches(path: String, content: String) -> bool: + # `store_string` writes UTF-8 bytes with no BOM and no newline translation, + # so the byte length on disk must match `to_utf8_buffer().size()` exactly. + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + return false + var on_disk := f.get_length() + f.close() + return on_disk == content.to_utf8_buffer().size() diff --git a/addons/godot_ai/clients/_atomic_write.gd.uid b/addons/godot_ai/clients/_atomic_write.gd.uid new file mode 100644 index 0000000..add9f7f --- /dev/null +++ b/addons/godot_ai/clients/_atomic_write.gd.uid @@ -0,0 +1 @@ +uid://6fkb5uau0r4h diff --git a/addons/godot_ai/clients/_base.gd b/addons/godot_ai/clients/_base.gd new file mode 100644 index 0000000..494646a --- /dev/null +++ b/addons/godot_ai/clients/_base.gd @@ -0,0 +1,528 @@ +@tool +class_name McpClient +extends RefCounted + +## Descriptor for one MCP client (Cursor, Claude Desktop, Codex, ...). +## +## Subclasses set fields in `_init()` and MUST NOT carry Callables — strategies +## (json/toml/cli) interpret the data. Enforced by +## `test_clients.gd::test_descriptors_are_data_only`. +## +## Why no Callables: per-client `.gd` files get hot-reloaded on disk-mtime +## change. A worker thread mid-call into a descriptor lambda races the +## bytecode swap and SEGVs (issue #229). Bonus: also obsoletes the stale- +## Callable workaround from #192. + +## CONFIGURED_MISMATCH = an entry with our `SERVER_NAME` exists in the user's +## client config, but its URL or launch command doesn't match the current +## ports/version/exclusions — typical after a setting change or update. +## Distinguishing this from `NOT_CONFIGURED` lets the dock surface a "your +## saved client configuration is stale" banner instead of conflating it with +## "you never configured this client". +enum Status { NOT_CONFIGURED, CONFIGURED, CONFIGURED_MISMATCH, ERROR } + + +## Lowercase string label for a `Status` value. Single source of truth so the +## MCP `client_status` tool, the dock, and the verify-after-write diagnostic +## in `McpClientConfigurator` all emit the same names — agents pattern-match +## against this set, so a fifth value being silently introduced would break +## them. +static func status_label(status: McpClient.Status) -> String: + match status: + Status.CONFIGURED: + return "configured" + Status.NOT_CONFIGURED: + return "not_configured" + Status.CONFIGURED_MISMATCH: + return "configured_mismatch" + return "error" + + +## One-line configure success message, shared by every strategy so the dock +## and the `client_manage` tool describe the transport that was actually +## written. Command-shape clients register the stdio `godot-ai attach` +## bridge — the URL-era "(HTTP: )" suffix would name a transport the +## write never touched (found live in the #838 Windows smoke). +static func configured_message(client: McpClient, server_url: String) -> String: + if client.command_shape != CommandShape.NONE: + return "%s configured (stdio attach)" % client.display_name + return "%s configured (HTTP: %s)" % [client.display_name, server_url] + +var id: String = "" ## stable key, e.g. "cursor" +var display_name: String = "" ## "Cursor" +var config_type: String = "" ## "json" | "toml" | "yaml" | "cli" | "dsh" + +# JSON / TOML clients ------------------------------------------------------ +## {"darwin": "~/...", "windows": "$APPDATA/...", "linux": "$XDG_CONFIG_HOME/..."} +## Keys may also use "unix" as a shorthand for darwin+linux. +var path_template: Dictionary = {} + +## Optional ordered path candidates by platform. Each value is an Array of +## templates; one `*` may appear in a directory segment so packaged-app roots +## can be discovered without hardcoding publisher hashes. +## +## Resolution contract: +## 1. Existing files win in descriptor order, except that a unique wildcard +## match is authoritative even before its config leaf exists. A matching +## package root therefore creates inside that package rather than writing +## a fallback path that may become invisible after copy-on-write. When +## that private leaf is new, Configure seeds it from the first later +## existing candidate so read-through content is not shadowed. +## 2. If no file or wildcard package match exists, the first non-wildcard +## template is the deterministic create target. +## 3. Multiple matches within any wildcard group are ambiguous and fail +## closed instead of choosing an arbitrary package. +## +## Exact-file and config-home environment overrides still have higher +## priority. When this map has no entry for the current platform, +## `path_template` remains the fallback. +var config_path_candidates: Dictionary = {} + +## Optional global JSON config files merged by the client from lowest to highest +## precedence. Unlike `config_path_candidates`, every existing file participates; +## Configure updates the effective last definition, status verifies it, and +## Remove clears every global definition transactionally. +var config_merge_path_templates: Dictionary = {} +## Project-relative tiers that may override the global files. Their root is the +## external client's working directory, which the Godot process cannot know. +## The strategy checks plausible roots and fails closed instead of mutating them. +var config_merge_project_paths: PackedStringArray = PackedStringArray() + +## De-duplicate persistent path-ambiguity warnings across recurring status +## refreshes. The actionable message still returns on every resolution; only +## the editor-console echo is single-shot until the ambiguity clears/changes. +var _last_config_path_warning := "" +var _config_path_warning_mutex := Mutex.new() + +## Path inside the config object where the per-server map lives. +## Cursor / Claude Desktop / most others: ["mcpServers"] +## VS Code: ["servers"] +## OpenCode: ["mcp"] +var server_key_path: PackedStringArray = PackedStringArray() +## Alternative server-map paths accepted by the client, in precedence order +## after `server_key_path`. JSON strategy operations select the first non-null +## existing path so Configure, status, and Remove agree with the client parser. +var server_key_path_aliases: Array[PackedStringArray] = [] + +## Field inside the entry dict that holds our server URL. +## "url" by default; some clients use "serverUrl" or "httpUrl". +var entry_url_field: String = "url" + +## Required entry fields — written on every Configure AND verified by the +## default verifier. Use this for transport pins (e.g. `type: +## "streamable-http"`) where a missing/wrong value breaks negotiation: a +## legacy entry without the pin fails verification and surfaces as drift. +## +## DO NOT put user-mutable state here (auto-approval lists, `disabled` +## flags, opt-in toggles). Verifying those treats every user customisation +## as drift, and Configure-All-Mismatched then silently overwrites them +## back to defaults — see the `entry_initial_fields` doc below. +var entry_extra_fields: Dictionary = {} + +## Default fields written ONLY when the entry doesn't yet exist. Reconfigure +## preserves whatever the user (or the client itself) has set; the verifier +## ignores these keys entirely. Use for opt-in flags and user-state arrays — +## e.g. Roo / Cline / Kilo `alwaysAllow` / `autoApprove` lists, `disabled: +## false`, `isActive: true`. The pre-#229 behaviour was equivalent: per- +## client `entry_builder` lambdas seeded these as defaults but the +## per-client `verify_entry` lambdas only checked transport pins, so a +## user-customised array was `CONFIGURED`, not drift. Splitting the field +## restores that contract under the data-only descriptor model. +var entry_initial_fields: Dictionary = {} + +## Client-owned stdio launch shape. Each strategy renders the shape in its +## config language: +## +## - FLAT — `command` string + `args` array as sibling keys. JSON and YAML +## strategies. A client whose docs require a type discriminator next to the +## flat keys (VS Code's `type: "stdio"`, Claude Code's fallback file) stays +## FLAT and declares it via `command_transport_key` / `command_transport_value`, +## so TYPED_FLAT remains reserved vocabulary. +## - COMMAND_ARRAY — the launch argv carried as one array. In the JSON +## strategy the entry's `command` field IS that array (OpenCode's +## `"command": ["uvx", …]`). In the TOML strategy the launcher renders as a +## `command = "…"` line plus an `args = […]` array (Codex, Grok) — the name +## refers to the argv-as-TOML-array body it emits. +## - NESTED_COMMAND — command/args nested inside a sub-object. Reserved; no +## current client needs it and strategies reject it with an actionable error. +## +## CLI-registered clients (`config_type == "cli"`) express the launch through +## `cli_register_template` tokens instead; their `command_shape` governs the +## JSON-fallback file rendering (Claude Code, #463). +## +## Values are data-only shared vocabulary; keeping them data-only avoids +## reintroducing the descriptor Callable race from #229. +enum CommandShape { NONE, FLAT, TYPED_FLAT, COMMAND_ARRAY, NESTED_COMMAND } +var command_shape: CommandShape = CommandShape.NONE + +## Whether manual instructions may offer the client's native URL transport as +## an alternative to its command shape. This is capability metadata, not a +## consequence of `command_shape`: Codex supports a URL block, while Claude +## Desktop's local `claude_desktop_config.json` entries are stdio-only. +var command_supports_url_fallback: bool = false + +## Optional discriminator required by a client's command transport shape +## (for example `type = "stdio"`). Empty means command+args are sufficient. +var command_transport_key: String = "" +var command_transport_value: Variant = null + +## Whether this client's Windows stdio entry must launch through the +## GUI-subsystem pythonw bootstrap (#827). The bootstrap exists for clients +## that run console-subsystem MCP commands in a visible terminal (Codex); +## Electron-family spawners hide child consoles themselves, and at least one +## (Antigravity) hangs tool calls when handed a GUI-subsystem executable +## (#863). Set false to write the plain console launcher on Windows. +var needs_consoleless_launcher: bool = true + +## Keys from the legacy transport that Configure must delete. Codex removes +## `url`, because Codex rejects a server entry containing both URL and stdio +## launch fields. +var command_legacy_keys: PackedStringArray = PackedStringArray() + +## Keys inside a preserved JSON `env` object that belonged to a legacy launch +## shape and must be removed during migration. Other environment values remain +## user-owned and survive Configure. Currently consumed by the JSON strategy. +var command_env_legacy_keys: PackedStringArray = PackedStringArray() + +## Defaults seeded only for a new entry. Reconfigure preserves user values. +## Codex uses this for enabled/startup/tool timeout defaults. +var command_initial_fields: Dictionary = {} + +## Declarative documentation of fields owned by the user and timeout fields +## supported by this client. Strategies preserve these values and tests pin +## the descriptor contract; no control flow lives on the descriptor. +var command_user_fields: PackedStringArray = PackedStringArray() +var command_timeout_fields: PackedStringArray = PackedStringArray() + +## Paths whose existence implies the user has this client installed. +## Used purely for the dock's "installed" badge. `is_installed()` additionally +## checks `resolved_config_path()`, so a config relocated via an environment +## override is detected without listing it here. +var detect_paths: PackedStringArray = PackedStringArray() + +# Config-path env overrides -------------------------------------------------- +## Some clients name the exact config file in an environment variable +## (OpenCode: `$OPENCODE_CONFIG`). When the variable is set and non-empty, it +## wins over directory-valued `config_home_env` and `path_template`. Relative +## values fail closed because the editor and client may have different working +## directories; auto-configuration cannot safely assume they resolve alike. +var config_file_env: String = "" + +## Some clients honor an env var that relocates their entire config home +## (Codex: `$CODEX_HOME/config.toml`; Claude Code: `$CLAUDE_CONFIG_DIR/.claude.json`). +## When `config_home_env` names an env var that is set and non-empty, +## `resolved_config_path()` returns `/` +## instead of resolving `path_template`. Both fields must be non-empty for the +## override to apply. Only declare a mapping when the client's docs guarantee +## the env var relocates the exact file we write — a wrong mapping writes the +## MCP entry somewhere the client never reads and Configure false-succeeds. +## Relative values fail closed for the same reason `config_file_env`'s do. +var config_home_env: String = "" +## Path of the config file relative to the env var's directory, e.g. +## "config.toml". Joined verbatim — no per-OS variants needed because the env +## value itself is already an absolute (or ~-prefixed) directory. +var config_home_env_subpath: String = "" + +# CLI clients -------------------------------------------------------------- +var cli_names: PackedStringArray = PackedStringArray() +## Argument templates with `{name}` and `{url}` tokens; the strategy +## substitutes them at call time. Tokens are matched verbatim — no escaping +## semantics, no shell expansion. Command-shape templates additionally use the +## whole-element tokens `{command}` / `{args...}` (see `McpCliStrategy.format_args`). +## Populated by CLI descriptors (currently `claude_code`; `kimi_code` moved to +## mcp.json in #813). +var cli_register_template: PackedStringArray = PackedStringArray() +var cli_unregister_template: PackedStringArray = PackedStringArray() +## Args run to read current state; stdout is scanned for the server name and +## URL. Presence of `name` AND `url` → CONFIGURED, name only → MISMATCH, +## neither → NOT_CONFIGURED. +var cli_status_args: PackedStringArray = PackedStringArray() +## Optional scope-aware status template with a `{name}` token, for descriptors +## that also take `{scope}` in their register template. `cli_status_args` lists +## whatever the CLI resolves for the current directory and cannot say WHICH +## scope an entry came from, so a leftover user-scope entry reads as CONFIGURED +## while the selected project scope is empty — the dock then shows green over +## exactly the "loaded in every workspace" state the scope setting exists to +## end (#872). This template must print a `Scope: …` line +## (`claude mcp get ` does) and exit non-zero when the server is absent. +## Only consulted when the selected scope isn't the one `path_template` reads. +var cli_scope_status_template: PackedStringArray = PackedStringArray() + +# Codex / TOML clients ----------------------------------------------------- +## Dotted TOML path under which our entry lives, e.g. ["mcp_servers", "godot-ai"]. +## Strategies build the [section."name"] header from this. +var toml_section_path: PackedStringArray = PackedStringArray() +var toml_legacy_section_aliases: PackedStringArray = PackedStringArray() +## Lines (without the [header]) emitted under the section, with `{url}` +## tokens. Substituted at call time. +var toml_body_template: PackedStringArray = PackedStringArray() + + +## Resolved absolute config path for this client on the current OS. Exact-file +## overrides win first, followed by directory-valued `config_home_env`, then +## ordered candidates / `path_template`. Ignoring either override can write a +## file the client never reads and false-succeed. +func resolved_config_path() -> String: + return str(resolved_config_path_details().get("path", "")) + + +## Detailed sibling used by status/configure/remove so safe resolution +## failures reach the dock instead of collapsing into NOT_CONFIGURED. `error` +## is empty for ordinary unsupported/missing path mappings to preserve the +## long-standing status behavior for clients not installed on this platform. +func resolved_config_path_details() -> Dictionary: + var details := _resolve_config_path_details() + var path := str(details.get("path", "")) + if path.is_empty() or path.is_absolute_path(): + return details + ## Last gate before every strategy's read/write. `McpPathTemplate.expand` + ## leaves a token it cannot resolve in place, so an unset `$USERPROFILE` (or + ## a `~` with no HOME) reaches here as a RELATIVE path rather than as the + ## root-relative `/godot` that sails through `is_absolute_path()`. Acting on + ## it would resolve against the editor's own working directory and create a + ## literal `$USERPROFILE` folder in the Godot project. No descriptor + ## template is intentionally relative — every one is `~`- or `$VAR`-rooted — + ## so a non-absolute survivor is always a resolution failure. Report it with + ## the unexpanded path, which still shows what could not be resolved. + return {"path": "", "error": unresolved_config_path_error(display_name, path)} + + +## Shared wording for a path template `McpPathTemplate.expand` could not fully +## resolve. Used by the guard above and by the merge-tier loader in +## `_json_strategy.gd`, which resolves its own templates and never passes +## through `resolved_config_path_details`. +static func unresolved_config_path_error(client_name: String, path: String) -> String: + return ( + "Could not resolve %s's config path: %s did not expand to an absolute " + + "path. Set HOME/USERPROFILE (or the variable the path names) in the " + + "environment the editor was launched from." + ) % [client_name, path] + + +func _resolve_config_path_details() -> Dictionary: + ## Reflected reads: after an in-session self-update, an instance created + ## before the update can answer Nil for vars the update added, and the + ## typed calls below would each hard-error (Nil -> Dictionary, #850's + ## per-row error wall). Fail with the + ## one repair message instead; the registry's coherence probe drives the + ## same text on the status path. + var candidates: Variant = get("config_path_candidates") + var template: Variant = get("path_template") + var file_env: Variant = get("config_file_env") + if not (candidates is Dictionary) or not (template is Dictionary) or not (file_env is String): + return {"path": "", "error": McpClientRegistry.RESTART_TO_FINISH_UPDATE} + var file_override := config_file_override_details() + if not str(file_override.get("path", "")).is_empty() or not str(file_override.get("error", "")).is_empty(): + _clear_config_path_warning() + return file_override + var home_override := config_home_override_details() + if not str(home_override.get("path", "")).is_empty() or not str(home_override.get("error", "")).is_empty(): + _clear_config_path_warning() + return home_override + var candidate_key := McpPathTemplate.platform_key(candidates) + if not candidate_key.is_empty(): + return _resolve_ordered_config_path_candidates(candidates[candidate_key]) + _clear_config_path_warning() + return {"path": McpPathTemplate.resolve(template), "error": ""} + + +## The exact-file env override plus any fail-closed diagnostic. Empty path and +## error means no override applies (no mapping, unset, or blank env var). +func config_file_override_details() -> Dictionary: + if config_file_env.is_empty(): + return {"path": "", "error": ""} + ## env_lookup, not OS.get_environment: this can run on dock workers (#691). + var raw_path := McpPathTemplate.env_lookup(config_file_env).strip_edges() + if raw_path.is_empty(): + return {"path": "", "error": ""} + var expanded := McpPathTemplate.expand(raw_path) + if not expanded.is_absolute_path(): + return { + "path": "", + "error": "%s's $%s override must be an absolute config-file path; got %s" % [ + display_name, config_file_env, raw_path, + ], + } + if DirAccess.dir_exists_absolute(expanded): + return { + "path": "", + "error": "%s's $%s override must point to a config file, not a directory: %s" % [ + display_name, config_file_env, expanded, + ], + } + return {"path": expanded, "error": ""} + + +func _resolve_ordered_config_path_candidates(templates: Variant) -> Dictionary: + if not (templates is Array or templates is PackedStringArray): + _clear_config_path_warning() + return {"path": "", "error": ""} + var ordered_templates: Array = [] + for template_variant in templates: + ordered_templates.append(str(template_variant)) + var fallback_create_path := "" + for index in range(ordered_templates.size()): + var template := str(ordered_templates[index]) + var expanded_template := McpPathTemplate.expand(template) + # An empty wildcard group ordinarily means "this package is not + # installed", but an unresolved root token produces the same empty + # group. Do not silently treat "could not inspect" as "not present" and + # fall through to a later writable candidate. + if not expanded_template.is_absolute_path(): + _clear_config_path_warning() + return { + "path": "", + "error": unresolved_config_path_error(display_name, expanded_template), + } + var group := McpPathTemplate.expand_path_candidates(template) + if group.size() > 1: + var message := ( + "%s has multiple matching config package paths for %s: %s. " + + "Remove the stale package installation or edit the intended config manually." + ) % [display_name, template, ", ".join(group)] + _warn_config_path_once(message) + return {"path": "", "error": message} + if group.is_empty(): + continue + var path := String(group[0]) + if FileAccess.file_exists(path): + _clear_config_path_warning() + return {"path": path, "error": ""} + # A wildcard only resolves when its package directory exists. Treat that + # installation evidence as authoritative and create its private config + # directly instead of relying on copy-on-write read-through. Preserve + # anything currently visible through read-through by naming the first + # later existing candidate as a one-time seed source. + if template.contains("*"): + var seed := _first_existing_later_candidate(ordered_templates, index + 1) + if not str(seed.get("error", "")).is_empty(): + _clear_config_path_warning() + return {"path": "", "error": seed["error"]} + _clear_config_path_warning() + return {"path": path, "error": "", "seed_path": seed.get("path", "")} + if fallback_create_path.is_empty(): + fallback_create_path = path + _clear_config_path_warning() + return {"path": fallback_create_path, "error": ""} + + +## Find a readable seed for a newly-created authoritative wildcard target. +## An unresolved later root is an error, not an absent seed: writing without +## inspecting it could silently discard configuration visible through the +## package's read-through fallback. +func _first_existing_later_candidate(templates: Array, start_index: int) -> Dictionary: + for index in range(start_index, templates.size()): + var template := str(templates[index]) + var expanded_template := McpPathTemplate.expand(template) + if not expanded_template.is_absolute_path(): + return { + "path": "", + "error": unresolved_config_path_error(display_name, expanded_template), + } + var group := McpPathTemplate.expand_path_candidates(template) + # A seed is optional. Never choose among an ambiguous later wildcard; + # the authoritative target was already resolved by the earlier group. + if group.size() != 1: + continue + var path := String(group[0]) + if FileAccess.file_exists(path): + return {"path": path, "error": ""} + return {"path": "", "error": ""} + + +func _warn_config_path_once(message: String) -> void: + _config_path_warning_mutex.lock() + var should_warn := message != _last_config_path_warning + _last_config_path_warning = message + _config_path_warning_mutex.unlock() + if should_warn: + push_warning(message) + + +func _clear_config_path_warning() -> void: + _config_path_warning_mutex.lock() + _last_config_path_warning = "" + _config_path_warning_mutex.unlock() + + +## The config-home env override plus any fail-closed diagnostic. Empty path and +## error means no override applies (no mapping declared, env var unset, or env +## var empty/whitespace). +func config_home_override_details() -> Dictionary: + if config_home_env.is_empty() or config_home_env_subpath.is_empty(): + return {"path": "", "error": ""} + ## env_lookup, not OS.get_environment: this runs on dock worker threads, + ## which must not race the spawn window's setenv/unsetenv (#691). + var home := McpPathTemplate.env_lookup(config_home_env).strip_edges() + if home.is_empty(): + return {"path": "", "error": ""} + # Expand a leading ~ so `CODEX_HOME=~/codex-alt` behaves like the shell. + var expanded := McpPathTemplate.expand(home) + ## Same fail-closed rule as `config_file_override_details`: a relative value + ## resolves against the EDITOR's working directory, not the client's, so + ## honouring it silently aims the write at the Godot project directory + ## instead of the file the client reads. The write layer can only name the + ## mangled path it was handed; only here do we still know which env var + ## produced it, so this is where the user-facing explanation belongs. + if not expanded.is_absolute_path(): + return { + "path": "", + "error": "%s's $%s override must be an absolute config-home directory path; got %s" % [ + display_name, config_home_env, home, + ], + } + return {"path": expanded.path_join(config_home_env_subpath), "error": ""} + + +## The env-var-relocated config path, or "" when no override applies (no +## mapping declared, env var unset, env var empty/whitespace, or a value that +## failed closed — `config_home_override_details` carries that diagnostic). +func config_home_override() -> String: + return str(config_home_override_details().get("path", "")) + + +## True when a CLI client also declares where its config file lives, so it can +## fall back to writing that file directly when the CLI binary isn't on PATH. +## #463: Claude Code installed only as a VS Code / Cursor extension exposes no +## `claude` binary, but `claude mcp add --scope user` just writes `mcpServers` +## into ~/.claude.json — so we can produce the same entry ourselves. +func has_json_fallback() -> bool: + return config_type == "cli" and not path_template.is_empty() and not server_key_path.is_empty() + + +## True if the user appears to have this client installed locally. +func is_installed() -> bool: + if config_type == "cli": + if not McpCliFinder.find(_array_from_packed(cli_names)).is_empty(): + return true + # CLI not on PATH. A cli client with a JSON fallback (Claude Code as a + # VS Code/Cursor extension, #463) still counts as installed if its + # fallback config file already exists. + if has_json_fallback(): + var cfg := resolved_config_path() + return not cfg.is_empty() and FileAccess.file_exists(cfg) + return false + for p in detect_paths: + for resolved in McpPathTemplate.expand_path_candidates(p): + if FileAccess.file_exists(resolved) or DirAccess.dir_exists_absolute(resolved): + return true + # Fall back to "config file already exists" — usually means installed at some point. + var cfg := resolved_config_path() + return not cfg.is_empty() and FileAccess.file_exists(cfg) + + +static func _array_from_packed(packed: PackedStringArray) -> Array[String]: + var out: Array[String] = [] + for s in packed: + out.append(s) + return out + + +## Slice a PackedStringArray into a new PackedStringArray over [from, to). +## Used by `_toml_strategy` and `_manual_command` to peel the section path +## apart for `[a.b."c"]` header rendering. +static func _packed_slice(packed: PackedStringArray, from: int, to: int) -> PackedStringArray: + var out := PackedStringArray() + for i in range(from, to): + out.append(packed[i]) + return out diff --git a/addons/godot_ai/clients/_base.gd.uid b/addons/godot_ai/clients/_base.gd.uid new file mode 100644 index 0000000..5ea77d3 --- /dev/null +++ b/addons/godot_ai/clients/_base.gd.uid @@ -0,0 +1 @@ +uid://cyowqr1x12ilg diff --git a/addons/godot_ai/clients/_cli_exec.gd b/addons/godot_ai/clients/_cli_exec.gd new file mode 100644 index 0000000..995b91c --- /dev/null +++ b/addons/godot_ai/clients/_cli_exec.gd @@ -0,0 +1,176 @@ +@tool +class_name McpCliExec +extends RefCounted + +## Wall-clock-bounded CLI invocation. Every dock shell-out to a per-client +## CLI (`claude mcp list`, `claude mcp add ...`, etc.) goes through here so +## a hung subprocess can't trap the calling thread forever. +## +## Without the timeout, a contended `claude mcp list` has been observed to +## hang for 6+ minutes (issues #238, #239) — wedging the dock's status +## refresh worker, and on the Configure / Remove paths the editor main +## thread itself. +## +## Why poll/kill instead of `OS.execute(..., true)`: GDScript can't +## interrupt a blocking `OS.execute`, so a hung CLI takes its caller's +## thread with it. `OS.execute_with_pipe` returns immediately with a PID; +## we drive the wait ourselves and `OS.kill` the orphan if budget +## expires. CLI registry commands have bounded output (a few hundred +## bytes), so we don't bother draining the pipe during the poll loop — +## the kernel buffer absorbs it. +## +## Returns a Dictionary with: +## exit_code: process exit code (0 = success). -1 on timeout / spawn failure. +## stdout: captured stdout text. May be partial on timeout. +## stderr: captured stderr text. May be partial on timeout. Empty when +## `capture_stderr` is false. +## output: stdout + (newline + stderr if non-empty). Convenience for +## the common case of "show whatever the CLI said when it +## failed" — `claude mcp add` writes its real diagnostics to +## stderr, so callers that only read `stdout` would surface +## a generic "exit code 1" instead. +## timed_out: true if we killed the process at the wall-clock budget. +## cancelled: true if the caller requested a cooperative early stop. +## spawn_failed: true if `OS.execute_with_pipe` didn't return a usable PID. + +const DEFAULT_TIMEOUT_MS := 8000 +const _POLL_INTERVAL_MS := 50 +const _KILL_GRACE_MS := 500 + + +static func run( + exe: String, + args: Array, + timeout_ms: int = DEFAULT_TIMEOUT_MS, + capture_stderr: bool = true, + cancel_check: Callable = Callable(), +) -> Dictionary: + if exe.is_empty(): + return _spawn_failed_result() + return _run_piped(exe, args, timeout_ms, capture_stderr, cancel_check) + + +static func _run_piped( + exe: String, + args: Array, + timeout_ms: int, + capture_stderr: bool, + cancel_check: Callable, +) -> Dictionary: + + var spawn_exe := exe + var spawn_args := args + if OS.get_name() == "Windows": + var lower := exe.to_lower() + if lower.ends_with(".cmd") or lower.ends_with(".bat"): + ## CreateProcessW can't launch `.cmd` / `.bat` scripts on its + ## own — they're cmd.exe input, not PE binaries. Without this + ## wrap, the moment `McpCliFinder` resolves a Node-style shim + ## (npm's `claude.cmd`, pnpm's wrappers, …) the next + ## `OS.execute_with_pipe` surfaces "Could not create child + ## process: ..." in Godot's output log (#251). Passing + ## `exe` as a separate argv element keeps spaces in the path + ## quoted by Godot's standard quoter — no manual escaping. + spawn_exe = "cmd.exe" + spawn_args = ["/c", exe] + spawn_args.append_array(args) + + var info := OS.execute_with_pipe(spawn_exe, spawn_args) + if info.is_empty(): + return _spawn_failed_result() + + var pid: int = int(info.get("pid", -1)) + var stdio: Variant = info.get("stdio", null) + var stderr_pipe: Variant = info.get("stderr", null) + if pid <= 0: + _close_pipes(stdio, stderr_pipe) + return _spawn_failed_result() + + var deadline := Time.get_ticks_msec() + maxi(timeout_ms, _POLL_INTERVAL_MS) + while OS.is_process_running(pid): + var cancelled := cancel_check.is_valid() and bool(cancel_check.call()) + if cancelled or Time.get_ticks_msec() >= deadline: + ## Kill before draining: a pipe read can block while the child is + ## still alive. Once it exits, drain any buffered partial output. + OS.kill(pid) + var kill_deadline := Time.get_ticks_msec() + _KILL_GRACE_MS + while OS.is_process_running(pid) and Time.get_ticks_msec() < kill_deadline: + OS.delay_msec(_POLL_INTERVAL_MS) + + var partial_stdout := "" + var partial_stderr := "" + if not OS.is_process_running(pid): + partial_stdout = _drain_pipe(stdio) + partial_stderr = _drain_pipe(stderr_pipe) if capture_stderr else "" + _close_pipes(stdio, stderr_pipe) + return { + "exit_code": -1, + "stdout": partial_stdout, + "stderr": partial_stderr, + "output": _join_streams(partial_stdout, partial_stderr), + "timed_out": not cancelled, + "cancelled": cancelled, + "spawn_failed": false, + } + OS.delay_msec(_POLL_INTERVAL_MS) + + var stdout := _drain_pipe(stdio) + var stderr_text := _drain_pipe(stderr_pipe) if capture_stderr else "" + _close_pipes(stdio, stderr_pipe) + + return { + "exit_code": OS.get_process_exit_code(pid), + "stdout": stdout, + "stderr": stderr_text, + "output": _join_streams(stdout, stderr_text), + "timed_out": false, + "cancelled": false, + "spawn_failed": false, + } + + +static func _spawn_failed_result() -> Dictionary: + return { + "exit_code": -1, + "stdout": "", + "stderr": "", + "output": "", + "timed_out": false, + "cancelled": false, + "spawn_failed": true, + } + + +static func _drain_pipe(pipe: Variant) -> String: + if not (pipe is FileAccess): + return "" + var f := pipe as FileAccess + var bytes := PackedByteArray() + var max_bytes := 1 << 20 # 1 MiB, far above expected client CLI output. + while bytes.size() < max_bytes: + var chunk := f.get_buffer(mini(4096, max_bytes - bytes.size())) + if chunk.is_empty(): + break + bytes.append_array(chunk) + if f.eof_reached(): + break + return bytes.get_string_from_utf8() + + +static func _join_streams(stdout: String, stderr_text: String) -> String: + ## Most CLIs write their actionable diagnostics to one stream or the + ## other, never both — so concatenation gives "the message" without + ## the caller having to guess which key to read. Newline-separate so + ## callers that grep don't see two lines run together. + if stderr_text.is_empty(): + return stdout + if stdout.is_empty(): + return stderr_text + return "%s\n%s" % [stdout, stderr_text] + + +static func _close_pipes(stdio: Variant, stderr_pipe: Variant) -> void: + if stdio is FileAccess: + (stdio as FileAccess).close() + if stderr_pipe is FileAccess: + (stderr_pipe as FileAccess).close() diff --git a/addons/godot_ai/clients/_cli_exec.gd.uid b/addons/godot_ai/clients/_cli_exec.gd.uid new file mode 100644 index 0000000..4a97a2c --- /dev/null +++ b/addons/godot_ai/clients/_cli_exec.gd.uid @@ -0,0 +1 @@ +uid://dhoe3ypkhm12v diff --git a/addons/godot_ai/clients/_cli_finder.gd b/addons/godot_ai/clients/_cli_finder.gd new file mode 100644 index 0000000..394e76c --- /dev/null +++ b/addons/godot_ai/clients/_cli_finder.gd @@ -0,0 +1,181 @@ +@tool +class_name McpCliFinder +extends RefCounted + +## Generic three-tier CLI resolution for clients whose binary lives somewhere +## a GUI-launched Godot's minimal PATH won't see: +## 1. Well-known install locations (~/.local/bin, /opt/homebrew/bin, ...) +## 2. Login shell lookup (`bash -lc 'command -v '`) — picks up .zshrc / .bashrc +## 3. Plain `which` / `where` against the inherited PATH +## Caches per-exe so repeated dock refreshes don't fork a shell every frame. +## +## Thread safety: `find()` runs on action-worker threads +## (`_run_client_action_worker` in `mcp_dock.gd`), and `invalidate()` runs on +## the main thread (manual Refresh path). Godot `Dictionary` is not safe for +## concurrent mutation, so `_cache` / `_searched` access is guarded by +## `_mutex`. The mutex is held only across dictionary read/write — the slow +## `_resolve()` path (FileAccess + bounded subprocess lookup) runs unlocked, so a +## main-thread `invalidate()` can never block on a worker's subprocess. +## Two workers racing the same exe both call `_resolve()` and both write +## back the same answer; that's wasted work, not corruption. + + +static var _mutex: Mutex = Mutex.new() +static var _cache: Dictionary = {} # exe_name -> resolved path (or "") +static var _searched: Dictionary = {} + +const _LOOKUP_TIMEOUT_MS := 3000 + + +## Find any of the supplied exe names; returns the first hit. +## On Windows pass the .exe variant in `exe_names` if relevant. +static func find(exe_names: Array[String]) -> String: + for name in exe_names: + var hit := _find_one(name) + if not hit.is_empty(): + return hit + return "" + + +## Drop cache for one exe (call after the user installs / reinstalls). +static func invalidate(exe_name: String = "") -> void: + _mutex.lock() + if exe_name.is_empty(): + _cache.clear() + _searched.clear() + else: + _cache.erase(exe_name) + _searched.erase(exe_name) + _mutex.unlock() + + +static func _find_one(exe_name: String) -> String: + _mutex.lock() + var already_searched: bool = _searched.get(exe_name, false) + var cached: String = _cache.get(exe_name, "") + _mutex.unlock() + if already_searched: + return cached + # `_resolve()` does FileAccess + bounded subprocess lookup (forks + # `bash -lc` / `which`), which can take 100ms-1s. Holding the mutex across that + # would let a concurrent `invalidate()` on the main thread freeze the + # editor for the duration of the subprocess — which defeats the whole + # point of running CLI lookup off the main thread. + var hit := _resolve(exe_name) + _mutex.lock() + _cache[exe_name] = hit + _searched[exe_name] = true + _mutex.unlock() + return hit + + +static func _resolve(exe_name: String) -> String: + var is_windows := OS.get_name() == "Windows" + + # 1. Well-known locations + for dir in _well_known_dirs(): + var full := dir.path_join(exe_name) + if FileAccess.file_exists(full): + return full + + # 2. Login shell lookup (Unix only) + if not is_windows: + ## env_lookup, not OS.get_environment: CLI resolution runs on dock + ## worker threads (configure/remove actions) and must not race the + ## spawn window's setenv/unsetenv (#691). + var shell := McpPathTemplate.env_lookup("SHELL") + if shell.is_empty(): + shell = "/bin/bash" + var stripped := exe_name.trim_suffix(".exe") + var login_result := McpCliExec.run(shell, ["-lc", "command -v %s" % stripped], _LOOKUP_TIMEOUT_MS, false) + if int(login_result.get("exit_code", -1)) == 0: + var login_found: String = str(login_result.get("stdout", "")).strip_edges() + if not login_found.is_empty() and FileAccess.file_exists(login_found): + return login_found + + # 3. which / where with inherited PATH + var lookup := "where" if is_windows else "which" + var result := McpCliExec.run(lookup, [exe_name], _LOOKUP_TIMEOUT_MS, false) + if int(result.get("exit_code", -1)) == 0: + var output := str(result.get("stdout", "")) + var lines := PackedStringArray(output.split("\n")) + var found := _pick_best_path(lines) if is_windows else lines[0].strip_edges() + if not found.is_empty(): + return found + return "" + + +## Executable extensions Windows' CreateProcessW can launch from a path +## (after the cmd.exe wrap in `_cli_exec.gd`). Order is preference: `.exe` +## is a native PE binary; `.cmd` / `.bat` go through the shell; `.com` is +## the legacy COM-format executable that some shims still ship. +const _WINDOWS_EXEC_EXTS := [".exe", ".cmd", ".bat", ".com"] + + +## Pick the best path from `where` output on Windows. +## +## npm-installed Node CLIs ship as BOTH `/` (a POSIX bash shim +## for WSL / Git Bash users) AND `/.cmd` (the actual Windows +## wrapper). `where ` lists both. CreateProcessW — the underlying +## syscall behind `OS.execute_with_pipe` — refuses to launch the +## extensionless POSIX shim, surfacing as +## `ERROR: Could not create child process: "...\claude" mcp list` +## in Godot's output log (#251). Picking a path with a real executable +## extension dodges that entirely. +## +## Extension scan is the OUTER loop so the order in `_WINDOWS_EXEC_EXTS` +## drives preference — `.exe` wins over `.cmd` even when the `.cmd` shows +## up first in `where` output (one fewer process per shell-out). Falls +## back to the first non-empty line when no entry has a recognised +## extension, so we never come up empty when `where` returned *something*. +static func _pick_best_path(lines: PackedStringArray) -> String: + var stripped := PackedStringArray() + for raw in lines: + var line := raw.strip_edges() + if not line.is_empty(): + stripped.append(line) + if stripped.is_empty(): + return "" + for ext in _WINDOWS_EXEC_EXTS: + for candidate in stripped: + if candidate.to_lower().ends_with(ext): + return candidate + return stripped[0] + + +static func _well_known_dirs() -> Array[String]: + ## env_lookup, not OS.get_environment — see _resolve()'s worker-thread + ## note (#691). + var home := McpPathTemplate.env_lookup("HOME") + if home.is_empty(): + home = McpPathTemplate.env_lookup("USERPROFILE") + match OS.get_name(): + "macOS": + return [ + home.path_join(".local/bin"), + home.path_join(".claude/local"), + home.path_join(".cargo/bin"), + "/opt/homebrew/bin", + "/usr/local/bin", + ] + "Windows": + var local := McpPathTemplate.env_lookup("LOCALAPPDATA") + var prog := McpPathTemplate.env_lookup("ProgramFiles") + var paths: Array[String] = [] + if not home.is_empty(): + paths.append(home.path_join(".claude/local")) + paths.append(home.path_join(".local/bin")) + paths.append(home.path_join(".cargo/bin")) + paths.append(home.path_join("AppData/Local/Programs/uv")) + if not local.is_empty(): + paths.append(local.path_join("Programs/uv")) + if not prog.is_empty(): + paths.append(prog.path_join("uv")) + return paths + _: + return [ + home.path_join(".local/bin"), + home.path_join(".claude/local"), + home.path_join(".cargo/bin"), + "/usr/local/bin", + ] diff --git a/addons/godot_ai/clients/_cli_finder.gd.uid b/addons/godot_ai/clients/_cli_finder.gd.uid new file mode 100644 index 0000000..9985270 --- /dev/null +++ b/addons/godot_ai/clients/_cli_finder.gd.uid @@ -0,0 +1 @@ +uid://cnp5b6fcwou2y diff --git a/addons/godot_ai/clients/_cli_strategy.gd b/addons/godot_ai/clients/_cli_strategy.gd new file mode 100644 index 0000000..0714115 --- /dev/null +++ b/addons/godot_ai/clients/_cli_strategy.gd @@ -0,0 +1,372 @@ +@tool +class_name McpCliStrategy +extends RefCounted + +## Strategy for MCP clients that own their own state via a CLI (e.g. +## `claude mcp add`). Reads `cli_register_template` / `cli_unregister_template` +## / `cli_status_args` from the descriptor and substitutes `{name}` / `{url}` +## tokens. Command-shape descriptors additionally use the whole-element launch +## tokens `{command}` / `{args...}` (see `format_args`). No descriptor-supplied +## Callables — see `_base.gd` for why. +## +## Every shell-out goes through `McpCliExec.run`, which wraps the call in a +## wall-clock timeout. A hung CLI (e.g. `claude mcp list` under +## inter-Claude-Code contention) gets killed at the budget instead of +## locking up the caller forever — see issues #238 / #239. + +## The descriptor token resolved from `godot_ai/mcp_client_scope` (#872). +## Only Claude Code takes it today; any `config_type = "cli"` descriptor can. +const SCOPE_TOKEN := "{scope}" + +const _CONFIGURE_TIMEOUT_MS := 10000 +const _REMOVE_TIMEOUT_MS := 10000 +const _STATUS_TIMEOUT_MS := 6000 + + +static func configure( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> Dictionary: + ## Fail closed before any subprocess runs: a command-shape client without a + ## verified attach launcher must not register anything (see + ## docs/client-configuration.md — an ERROR beats an entry known to be broken). + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": "error", "message": launch_error} + var cli := _resolve_cli(client) + if cli.is_empty(): + return {"status": "error", "message": "%s not found" % client.display_name} + + # Best-effort prior cleanup so re-configure is idempotent. Bounded to + # the same budget — a hung unregister shouldn't block the configure + # that follows. + if not client.cli_unregister_template.is_empty(): + ## #872: a `{scope}` descriptor sweeps EVERY scope, not just the + ## selected one. Flipping the setting user -> project and pressing + ## Configure would otherwise leave the old user-scope entry alive — + ## exactly the "loaded in every unrelated workspace" problem the + ## setting exists to fix. `mcp remove` on an absent entry is a no-op + ## and the result is discarded either way, so the extra passes are + ## safe; they cost one bounded subprocess per additional scope. + for pre_scope in _cleanup_scopes(client): + var pre_args := _format_args( + client.cli_unregister_template, server_name, server_url, {}, pre_scope + ) + McpCliExec.run(cli, pre_args, _REMOVE_TIMEOUT_MS) + + if client.cli_register_template.is_empty(): + return {"status": "error", "message": "%s descriptor missing cli_register_template" % client.display_name} + var args := _format_args(client.cli_register_template, server_name, server_url, launch) + var result := McpCliExec.run(cli, args, _CONFIGURE_TIMEOUT_MS) + if result.get("timed_out", false): + return { + "status": "error", + "message": "Configure %s timed out after %ds — see 'Run this manually' below to retry by hand" % [ + client.display_name, _CONFIGURE_TIMEOUT_MS / 1000, + ], + } + if result.get("spawn_failed", false): + return {"status": "error", "message": "Failed to spawn %s" % client.display_name} + if int(result.get("exit_code", -1)) == 0: + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + ## `claude mcp add` writes its real failure diagnostics to stderr, so + ## prefer `output` (stdout + stderr) over `stdout` alone — otherwise + ## the user sees "exit code 1" instead of the actual error. + var combined := str(result.get("output", "")).strip_edges() + var err := combined if not combined.is_empty() else "exit code %d" % int(result.get("exit_code", -1)) + return {"status": "error", "message": "Failed to configure %s: %s" % [client.display_name, err]} + + +## Run the descriptor's `cli_status_args`, scan stdout for `server_name` and +## the expected target. The matching rule is the only sensible one for "list +## MCP entries" output across CLI clients we currently support: name AND +## target present → CONFIGURED; name only → MISMATCH; neither → +## NOT_CONFIGURED. For URL descriptors the target is `server_url`; for +## command-shape descriptors it is the resolved attach launcher path (the +## listing prints the registered command line, not a URL). Command-shape CLI +## clients with a JSON fallback file get exact drift detection via the JSON +## strategy instead — the configurator prefers that path and only lands here +## for CLI clients whose state isn't file-readable. +static func check_status( + client: McpClient, server_name: String, server_url: String, launch: Dictionary = {} +) -> McpClient.Status: + return check_status_with_cli_path(client, server_name, server_url, _resolve_cli(client), launch) + + +static func check_status_with_cli_path( + client: McpClient, server_name: String, server_url: String, cli: String, launch: Dictionary = {} +) -> McpClient.Status: + return check_status_details(client, server_name, server_url, cli, launch).get("status", McpClient.Status.NOT_CONFIGURED) + + +## Detailed variant used by the dock's refresh worker so it can surface a +## "probe timed out" badge on the affected row instead of silently +## conflating the timeout with NOT_CONFIGURED. Returns +## `{"status": Status, "error_msg": String}`. The caller plumbs +## `error_msg` straight into `_apply_row_status`. +static func check_status_details( + client: McpClient, server_name: String, server_url: String, cli: String, launch: Dictionary = {} +) -> Dictionary: + if cli.is_empty(): + return _status_details(McpClient.Status.NOT_CONFIGURED) + if client.cli_status_args.is_empty(): + return _status_details(McpClient.Status.NOT_CONFIGURED) + var expected_target := server_url + if client.command_shape != McpClient.CommandShape.NONE: + ## Same fail-closed contract as configure: without a verified launcher + ## there is no target to compare against, and guessing would report a + ## broken entry as green. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return _status_details(McpClient.Status.ERROR, launch_error) + expected_target = str(launch.get("command", "")) + var result := McpCliExec.run( + cli, + McpClient._array_from_packed(client.cli_status_args), + _STATUS_TIMEOUT_MS, + false + ) + if result.get("timed_out", false): + return _status_details(McpClient.Status.ERROR, "probe timed out") + if result.get("spawn_failed", false): + return _status_details(McpClient.Status.NOT_CONFIGURED) + if int(result.get("exit_code", -1)) != 0: + return _status_details(McpClient.Status.NOT_CONFIGURED) + var text := str(result.get("stdout", "")) + if text.find(server_name) < 0: + return _status_details(McpClient.Status.NOT_CONFIGURED) + ## Server registered, but pointing somewhere else — drift after a + ## port change. Surface as mismatch so the dock offers Reconfigure. + if text.find(expected_target) < 0: + return _status_details(McpClient.Status.CONFIGURED_MISMATCH) + return _status_details(McpClient.Status.CONFIGURED) + + +## Empty string when this client's launch requirements are satisfied. A +## command-shape descriptor requires a successfully resolved attach launch; +## URL descriptors (`CommandShape.NONE`) never require one. Mirrors +## `McpJsonStrategy.command_launch_error` / the TOML equivalent. +static func command_launch_error(client: McpClient, launch: Dictionary) -> String: + if client.command_shape == McpClient.CommandShape.NONE: + return "" + if not bool(launch.get("ok", false)): + return str(launch.get("error", "No compatible attach launcher was found.")) + return "" + + +static func _status_details(status: McpClient.Status, error_msg: String = "") -> Dictionary: + return {"status": status, "error_msg": error_msg} + + +static func remove(client: McpClient, server_name: String) -> Dictionary: + var cli := _resolve_cli(client) + if cli.is_empty(): + return {"status": "error", "message": "%s not found" % client.display_name} + if client.cli_unregister_template.is_empty(): + return {"status": "error", "message": "%s descriptor missing cli_unregister_template" % client.display_name} + var args := _format_args(client.cli_unregister_template, server_name, "") + var result := McpCliExec.run(cli, args, _REMOVE_TIMEOUT_MS) + if result.get("timed_out", false): + return { + "status": "error", + "message": "Remove %s timed out after %ds — see 'Run this manually' below to retry by hand" % [ + client.display_name, _REMOVE_TIMEOUT_MS / 1000, + ], + } + if result.get("spawn_failed", false): + return {"status": "error", "message": "Failed to spawn %s" % client.display_name} + if int(result.get("exit_code", -1)) == 0: + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + ## `claude mcp add` writes its real failure diagnostics to stderr, so + ## prefer `output` (stdout + stderr) over `stdout` alone — otherwise + ## the user sees "exit code 1" instead of the actual error. + var combined := str(result.get("output", "")).strip_edges() + var err := combined if not combined.is_empty() else "exit code %d" % int(result.get("exit_code", -1)) + return {"status": "error", "message": "Failed to remove %s: %s" % [client.display_name, err]} + + +## Substitute `{name}` and `{url}` tokens in every template entry. +## Tokens match verbatim — `{name_suffix}` is NOT touched, so callers don't +## have to worry about partial-token collisions in their argv. +## +## Launch tokens are whole-element only: an element that is exactly +## `{command}` becomes the resolved attach launcher path, and an element that +## is exactly `{args...}` is spliced into the argv as one element per launch +## arg. Whole-element matching keeps a literal brace inside a path or flag +## from ever triggering an expansion. +## +## `scope_override` forces a specific `{scope}` value instead of the live +## setting; the configure pre-cleanup uses it to sweep the scopes the user is +## NOT currently on. Empty means "resolve from the setting". +static func format_args( + template: PackedStringArray, + server_name: String, + server_url: String, + launch: Dictionary = {}, + scope_override: String = "", +) -> Array[String]: + return _format_args(template, server_name, server_url, launch, scope_override) + + +static func _format_args( + template: PackedStringArray, + server_name: String, + server_url: String, + launch: Dictionary = {}, + scope_override: String = "", +) -> Array[String]: + var scope := scope_override if not scope_override.is_empty() else McpSettings.client_scope() + var out: Array[String] = [] + for arg in template: + var s := String(arg) + if s == "{command}": + out.append(str(launch.get("command", ""))) + continue + if s == "{args...}": + for launch_arg in launch.get("args", []): + out.append(str(launch_arg)) + continue + s = s.replace("{name}", server_name) + s = s.replace("{url}", server_url) + ## Resolved per-call rather than baked into the descriptor so the + ## setting can change without an editor restart, and so the manual + ## command shown in the dock always matches what Configure would run. + s = s.replace(SCOPE_TOKEN, scope) + out.append(s) + return out + + +## Scope-aware status for descriptors that declare `cli_scope_status_template`. +## Returns the same `{"status", "error_msg"}` shape as check_status_details. +## +## Split from the subprocess call so the verdict is a pure function of what the +## CLI printed — `_scope_probe_verdict` is unit-tested against real recorded +## `claude mcp get` output rather than needing a `claude` binary on the runner. +static func check_scope_status_details( + client: McpClient, + server_name: String, + server_url: String, + cli: String, + launch: Dictionary, + expected_scope: String, +) -> Dictionary: + if cli.is_empty() or client.cli_scope_status_template.is_empty(): + return _status_details(McpClient.Status.NOT_CONFIGURED) + var expected_target := server_url + if client.command_shape != McpClient.CommandShape.NONE: + ## Same fail-closed contract as configure and the plain status probe. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return _status_details(McpClient.Status.ERROR, launch_error) + expected_target = str(launch.get("command", "")) + var args := _format_args(client.cli_scope_status_template, server_name, server_url) + var result := McpCliExec.run(cli, args, _STATUS_TIMEOUT_MS, false) + if result.get("timed_out", false): + return _status_details(McpClient.Status.ERROR, "probe timed out") + if result.get("spawn_failed", false): + return _status_details(McpClient.Status.NOT_CONFIGURED) + return _scope_probe_verdict( + int(result.get("exit_code", -1)), + str(result.get("stdout", "")), + expected_scope, + expected_target, + ) + + +## The `Scope:` label the probe printed, normalised to a CLIENT_SCOPES value, +## or "" when no line was recognisable. Matched on the first word after the +## label so the parenthetical blurb ("(shared via .mcp.json)") can change +## wording between CLI releases without breaking detection. +static func _scope_from_probe_output(text: String) -> String: + for raw_line in text.split("\n"): + var line := String(raw_line).strip_edges() + var marker := line.find("Scope:") + if marker < 0: + continue + var rest := line.substr(marker + 6).strip_edges().to_lower() + for scope in McpSettings.CLIENT_SCOPES: + var name := String(scope) + if rest.begins_with(name): + return name + return "" + + +## Pure verdict for a scope probe. A non-zero exit is the CLI's "no such +## server" signal. An entry resolved from a scope other than the selected one +## is MISMATCH, not CONFIGURED: the dock offers Reconfigure, and Configure's +## all-scope pre-cleanup is what actually moves it. +## +## A missing or unrecognised `Scope:` line degrades to the target check alone, +## deliberately rather than failing closed. `_verify_post_state` turns any +## non-CONFIGURED status after a successful write into an error, so treating an +## unparsed label as MISMATCH would mean a future CLI release that reworded or +## dropped that line breaks Configure outright — a false error plus a +## permanently amber row whose Reconfigure button cannot clear it. The entry +## has already been matched by name and exact launcher path at that point; the +## only thing in doubt is which scope it came from, and a slightly optimistic +## dot is a much cheaper failure than a configure flow that reports success as +## failure. Today's claude (2.1.241) always prints the line, so this is a +## forward-compatibility hedge, not a live code path. +static func _scope_probe_verdict( + exit_code: int, text: String, expected_scope: String, expected_target: String +) -> Dictionary: + if exit_code != 0: + return _status_details(McpClient.Status.NOT_CONFIGURED) + ## `resolved_scope` rides along as structured data so callers can act on it + ## — `_verify_post_state`'s path hint needs to know WHICH scope survived to + ## name the right file, and parsing it back out of the human-facing message + ## would couple that hint to this wording (#879). Parsed BEFORE the target + ## check so both mismatch paths carry it: an entry whose launcher drifted + ## sends the user to the wrong file just as readily as one whose scope did. + var resolved := _scope_from_probe_output(text) + if not expected_target.is_empty() and text.find(expected_target) < 0: + var drifted := _status_details(McpClient.Status.CONFIGURED_MISMATCH) + if not resolved.is_empty(): + drifted["resolved_scope"] = resolved + return drifted + if resolved.is_empty(): + return _status_details(McpClient.Status.CONFIGURED) + if resolved != expected_scope: + var details := _status_details( + McpClient.Status.CONFIGURED_MISMATCH, + "registered at %s scope, not %s" % [resolved, expected_scope], + ) + details["resolved_scope"] = resolved + return details + return _status_details(McpClient.Status.CONFIGURED) + + +## True when the descriptor's register template takes `{scope}`, i.e. where +## its entry lands is decided by the `godot_ai/mcp_client_scope` setting rather +## than fixed by the descriptor. The configurator uses this to decide whether +## the JSON-fallback file is still a valid place to read status back from. +static func uses_scope_token(client: McpClient) -> bool: + return client.cli_register_template.has(SCOPE_TOKEN) + + +## Public view of the pre-cleanup sweep, for the manual-command text: what the +## dock tells the user to run has to match what Configure actually runs (#877). +static func cleanup_scopes(client: McpClient) -> Array[String]: + return _cleanup_scopes(client) + + +## Scopes the configure pre-cleanup removes from. A descriptor without the +## `{scope}` token has exactly one place its entry can live, so it keeps the +## single pass it always had — "" means "resolve the scope normally". +static func _cleanup_scopes(client: McpClient) -> Array[String]: + if not uses_scope_token(client): + return [""] + var scopes: Array[String] = [] + for scope in McpSettings.CLIENT_SCOPES: + scopes.append(String(scope)) + return scopes + + +static func _resolve_cli(client: McpClient) -> String: + return McpCliFinder.find(McpClient._array_from_packed(client.cli_names)) + + +static func resolve_cli_path(client: McpClient) -> String: + return _resolve_cli(client) diff --git a/addons/godot_ai/clients/_cli_strategy.gd.uid b/addons/godot_ai/clients/_cli_strategy.gd.uid new file mode 100644 index 0000000..f84a92b --- /dev/null +++ b/addons/godot_ai/clients/_cli_strategy.gd.uid @@ -0,0 +1 @@ +uid://bvib7d8eabbcm diff --git a/addons/godot_ai/clients/_dsh_strategy.gd b/addons/godot_ai/clients/_dsh_strategy.gd new file mode 100644 index 0000000..e18385c --- /dev/null +++ b/addons/godot_ai/clients/_dsh_strategy.gd @@ -0,0 +1,759 @@ +@tool +class_name McpDshStrategy +extends RefCounted + +## Configure / status / remove for DeepSeek Harness (dsh) MCP servers. +## +## DeepSeek Harness has no `mcp` CLI verb (verified against dsh +## 0.1.0-rc.6 — `dsh --help` exposes only `web` and `plugin`). MCP servers +## register as `@deepseek-ai/dsh-mcp-client` plugin entries in the HOME patch +## layer `$DSH_HOME/cordis.patch.yml` — the machine-local layer dsh applies +## over EVERY profile's own patch layer (the web GUI included), so one entry +## covers every profile the user boots. +## +## The patch file is a top-level YAML array of loader patch entries +## (`@deepseek-ai/cordis-plugin-include`'s `applyEntryPatches`). A non-insert +## row only OVERRIDES an existing bundle row (a new id is skipped with a +## warning), so a brand-new server must be added with an `insert` row: +## +## - insert: +## - id: mcp-godot-ai +## name: '@deepseek-ai/dsh-mcp-client' +## config: +## serverName: godot-ai +## transport: stdio +## command: "..." +## args: [...] +## +## Both shapes verified live against the dsh loader +## (`dsh --profile web --dump-config` composes the inserted entry; a plain +## row for a new id warns "patch: entry not found" and is skipped). We write +## one dedicated insert row per server, preserve every other row byte-for-byte +## (including other users' insert rows, overrides, comments, and `!!js` +## expressions), and status-verify the entry we wrote — the same file-read +## drift contract the JSON/TOML/YAML strategies use. +## +## The entry's `config` nests the launch under `serverName`/`transport`/ +## `command`/`args`; `serverName` is the model-facing tool namespace +## (`mcp__godot-ai__`), so it carries the server name like the +## `server_key_path` map key does for the other strategies. + +## Loader entry id prefix inside the patch list. The full id is +## `` — "mcp-godot-ai" for the godot-ai server. +const ENTRY_ID_PREFIX := "mcp-" +## The loader plugin that bridges MCP servers into the harness. Must be +## installed in the profile's node_modules (dsh ships it as a dependency of +## the CLI package). Quoted in the file: `@` is a reserved YAML indicator and +## cannot start a plain scalar. +const PLUGIN_NAME := "@deepseek-ai/dsh-mcp-client" +## Indent of a nested entry header under `- insert:` (children step 2 spaces +## deeper), matching the shipped profile patch files. +const ENTRY_INDENT := 4 + + +static func entry_id(server_name: String) -> String: + return ENTRY_ID_PREFIX + server_name + + +static func configure( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty(): + return {"status": "error", "message": "Could not resolve config path for %s on this OS" % client.display_name} + ## Fail closed before touching the file — same contract as JSON/TOML/YAML. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": "error", "message": launch_error} + + var read := _read(path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to overwrite %s: %s. Fix or move the file, then re-run Configure." % [path, read["error"]]} + ## Fail closed on content that is not a loader patch list: dsh's patch + ## parser rejects a non-array file at boot, so appending our row to a + ## top-level mapping would hand the user a broken file (#867 review). + ## `[]` is a valid empty sequence meaning "no rows"; the literal must not + ## survive an append (block rows after `[]` are malformed YAML), so only + ## that line is dropped — comments around it belong to the user and stay. + var text := String(read["data"]) + text = _strip_empty_flow_sequence(text) + if not _is_patch_sequence(text): + return { + "status": "error", + "message": "Refusing to overwrite %s: it is not a top-level YAML list of loader entries. Fix or remove the file, then re-run Configure." % path, + } + + var existing_config: Variant = null + var lines := _split_lines(text) + var found := _find_entry_block(lines, entry_id(server_name), true) + if found.is_empty(): + var plain := _find_entry_block(lines, entry_id(server_name), false) + if not plain.is_empty(): + ## A plain `- id: mcp-godot-ai` row is inert for a new id — the + ## loader skips it with a warning and never registers the server. + ## Replacing the whole row with the insert form migrates it. + found = plain + if not found.is_empty(): + ## Pass the parsed config through so user-mutable fields (env, + ## toolCallTimeoutMs, reconnect) survive a reconfigure. + existing_config = _extract_config(lines, found) + var new_entry := build_entry(client, server_name, server_url, existing_config, launch) + ## Nested replacement must keep the sequence's existing header indent — + ## items of one block sequence share indentation, so a hand-written + ## 2-space file re-emitted at 4 spaces would no longer parse (#867 + ## review). Fresh rows and plain-row migrations keep the 4-space style. + var base_indent := ENTRY_INDENT + if not found.is_empty(): + var header_indent := int(found.get("indent", 0)) + if header_indent > 0: + base_indent = header_indent + var rendered := render_nested_entry(entry_id(server_name), new_entry, base_indent) + var out := "" + if found.is_empty(): + out = _append_row(lines, rendered) + else: + out = _replace_lines(lines, found, rendered) + if not McpAtomicWrite.write(path, out): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + + +static func check_status( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> McpClient.Status: + return check_status_details(client, server_name, server_url, launch)["status"] + + +## Same contract as the other strategies (#711): {status, error_msg}. An +## existing-but-unreadable config is ERROR with the diagnostic — not +## NOT_CONFIGURED — so the dock row can tell "no config" from "config the +## editor can't read" instead of offering a Configure that would fail. +static func check_status_details( + client: McpClient, server_name: String, server_url: String, launch: Dictionary = {} +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var read := _read(path) + if not read["ok"]: + return { + "status": McpClient.Status.ERROR, + "error_msg": "Cannot read %s: %s" % [path, read["error"]], + } + var text := String(read["data"]) + if not _is_patch_sequence(text): + ## A top-level mapping/scalar is not a dsh patch list: nothing in it + ## can be "configured", and a nested `- id:` inside a mapping must + ## not read as ours (#867 review). + return { + "status": McpClient.Status.ERROR, + "error_msg": "%s is not a top-level YAML list of loader entries; fix or remove the file." % path, + } + var lines := _split_lines(text) + var found := _find_entry_block(lines, entry_id(server_name), true) + if found.is_empty(): + ## A plain row for our id is inert (the loader skips unknown ids), so + ## the server is NOT registered no matter what the file says. It only + ## becomes registered once Configure rewrites it as an insert row. + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var config := _extract_config(lines, found) + if config.is_empty(): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + ## An entry exists but no verified launcher does — mirror the other + ## strategies: this is an environment ERROR, not entry drift. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": launch_error} + if verify_entry(client, config, server_name, server_url, launch): + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + + +static func remove(client: McpClient, server_name: String) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": "ok", "message": "Not configured"} + var read := _read(path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to rewrite %s: %s." % [path, read["error"]]} + var text := String(read["data"]) + if not _is_patch_sequence(text): + ## Same fail-closed contract as configure (#867 review): never modify + ## a file that dsh cannot load as a patch list. + return { + "status": "error", + "message": "Refusing to rewrite %s: it is not a top-level YAML list of loader entries. Fix or remove the file, then re-run Remove." % path, + } + var lines := _split_lines(text) + var found := _find_entry_block(lines, entry_id(server_name), true) + if found.is_empty(): + found = _find_entry_block(lines, entry_id(server_name), false) + if found.is_empty(): + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + var out := _remove_lines(lines, found) + if _is_blank_or_comment_only(out): + ## dsh's patch parser requires a top-level YAML array: an empty or + ## comment-only patch file FAILS BOOT (`loadOptionalPatches` throws on + ## a non-array file), while an absent file means "no layer". After our + ## row is gone, an all-blank file must therefore be deleted, not + ## written back. + if FileAccess.file_exists(path): + var remove_err := DirAccess.remove_absolute(path) + if remove_err != OK: + return {"status": "error", "message": "Cannot remove %s (error %d)" % [path, remove_err]} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + if not McpAtomicWrite.write(path, out): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + + +## Build the `config` dict written inside the loader entry. Command mode +## (FLAT, #838) nests `serverName`/`transport`/`command`/`args`; URL mode nests +## `serverName`/`transport`/`url`. Existing user state (env, timeouts, +## reconnect) survives a reconfigure via the deep copy. +static func build_entry( + client: McpClient, + server_name: String, + server_url: String, + existing: Variant = null, + launch: Dictionary = {}, +) -> Dictionary: + var entry: Dictionary = (existing as Dictionary).duplicate(true) if existing is Dictionary else {} + entry["serverName"] = server_name + if client.command_shape == McpClient.CommandShape.FLAT: + entry["command"] = str(launch.get("command", "")) + entry["args"] = _array_copy(launch.get("args", [])) + if not client.command_transport_key.is_empty(): + entry[client.command_transport_key] = client.command_transport_value + for key in client.command_initial_fields: + if not entry.has(key): + entry[key] = client.command_initial_fields[key] + for key in client.command_legacy_keys: + entry.erase(String(key)) + return entry + if client.command_shape == McpClient.CommandShape.NONE: + ## Single URL-mode source of truth (#867 review): build_entry's URL + ## branch delegates to build_url_entry so the two can never drift. + return build_url_entry(client, server_name, server_url, existing) + return {} + + +## URL-mode sibling for the manual-instruction fallback text and the +## build_entry URL branch. DeepSeek Harness' mcp-client bridge accepts +## `transport: streamable-http` with a `url`, so the entry keeps the same +## `serverName` namespace with an HTTP transport instead of the stdio attach +## bridge. Existing user state survives via the deep copy. +static func build_url_entry( + client: McpClient, server_name: String, server_url: String, existing: Variant = null +) -> Dictionary: + var entry: Dictionary = (existing as Dictionary).duplicate(true) if existing is Dictionary else {} + entry["serverName"] = server_name + entry["transport"] = "streamable-http" + if not client.entry_url_field.is_empty(): + entry[client.entry_url_field] = server_url + return entry + + +## Verify a stored `config` dict matches the current launch. Command mode +## checks every launch-affecting value exactly and requires legacy URL keys +## gone; serverName must match the pinned namespace. URL mode checks the url +## and the streamable-http pin. +static func verify_entry( + client: McpClient, + config: Dictionary, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> bool: + if config.get("serverName") != server_name: + return false + if client.command_shape != McpClient.CommandShape.NONE: + if client.command_shape != McpClient.CommandShape.FLAT or not bool(launch.get("ok", false)): + return false + for key in client.command_legacy_keys: + if config.has(String(key)): + return false + if config.get("command") != launch.get("command"): + return false + if not _arrays_equal(config.get("args", null), launch.get("args", null)): + return false + if not client.command_transport_key.is_empty(): + if config.get(client.command_transport_key, null) != client.command_transport_value: + return false + return true + if config.get(client.entry_url_field, "") != server_url: + return false + return config.get("transport", "") == "streamable-http" + + +## Empty string when this client's launch requirements are satisfied. +## Mirrors `McpYamlStrategy.command_launch_error`; the patch-list dialect +## supports FLAT (and the URL fallback) only. +static func command_launch_error(client: McpClient, launch: Dictionary) -> String: + if client.command_shape == McpClient.CommandShape.NONE: + return "" + if client.command_shape != McpClient.CommandShape.FLAT: + return "%s uses a command shape not supported by DeepSeek Harness config yet" % client.display_name + if not bool(launch.get("ok", false)): + return str(launch.get("error", "No compatible attach launcher was found.")) + return "" + + +# --- Rendering -------------------------------------------------------------- + +## Render a full `- insert:` row containing one nested loader entry. Public +## seam for the dock's manual-instruction text so the pasted YAML matches +## what Configure would write byte-for-byte. +static func render_insert_row(entry_id_value: String, config: Dictionary) -> PackedStringArray: + var lines: PackedStringArray = ["- insert:"] + lines.append_array(render_nested_entry(entry_id_value, config)) + return lines + + +## Render one nested loader entry (the `- id:` block inside an `insert` +## list). `base_indent` defaults to the 4-space style used by the shipped +## patch files; a nested replacement reuses the indent the existing entry was +## found at so the block sequence keeps a single indentation (#867 review). +static func render_nested_entry( + entry_id_value: String, config: Dictionary, base_indent: int = ENTRY_INDENT +) -> PackedStringArray: + var lines: PackedStringArray = [] + lines.append("%s- id: %s" % [_indent_str(base_indent), entry_id_value]) + lines.append("%sname: '%s'" % [_indent_str(base_indent + 2), PLUGIN_NAME]) + lines.append("%sconfig:" % _indent_str(base_indent + 2)) + for key in config: + lines.append_array(_emit_field(String(key), config[key], base_indent + 4)) + return lines + + +## Emit one `key: value` line (or a nested block for Dictionary values) at +## the given indent. Arrays render in flow style; scalars through the shared +## YAML emitter so quoting rules stay identical across the two YAML dialects. +static func _emit_field(key: String, value: Variant, indent: int) -> PackedStringArray: + var lines: PackedStringArray = [] + var prefix := _indent_str(indent) + if value is Dictionary: + lines.append("%s%s:" % [prefix, key]) + for sub_key in value: + lines.append_array(_emit_field(String(sub_key), value[sub_key], indent + 2)) + elif value is Array or value is PackedStringArray: + lines.append("%s%s: %s" % [prefix, key, McpYamlStrategy.emit_flow_array(_array_copy(value))]) + else: + lines.append("%s%s: %s" % [prefix, key, McpYamlStrategy.emit_scalar(value)]) + return lines + + +# --- Line-level parsing (no YAML parser in Godot) --------------------------- + +## Split file text into lines, dropping only a single trailing newline so the +## remainder round-trips byte-for-byte. `text` is never split on the empty +## string, so an empty file yields an empty array. +static func _split_lines(text: String) -> PackedStringArray: + if text.is_empty(): + return PackedStringArray() + var lines := text.split("\n") + if lines.size() > 0 and String(lines[lines.size() - 1]).is_empty(): + lines.remove_at(lines.size() - 1) + return lines + + +## Locate the block owned by our loader entry: +## require_nested=true — the `- id: ` line inside an `insert` +## list (indent > 0), plus its indented children. +## require_nested=false — a plain top-level `- id: ` row (indent +## 0), plus its indented children. +## Returns {"start": int, "end": int, "indent": int} (end exclusive) or {} +## when absent. The header indent is detected dynamically so a hand-written +## file using non-2-space indentation is still found; children are lines +## deeper than the header. `end` stops right AFTER the last content line: +## trailing blank and comment lines between our entry and the next sibling +## belong to the file, not to our block, so `_replace_lines` / `_remove_lines` +## (which splice [start, end)) never delete them (#867 review). +static func _find_entry_block(lines: PackedStringArray, entry_id_value: String, require_nested: bool) -> Dictionary: + for i in range(lines.size()): + var indent := _indent_of(lines[i]) + if require_nested and indent <= 0: + continue + if not require_nested and indent != 0: + continue + var parsed := _parse_entry_header(lines[i]) + if parsed.is_empty() or parsed.get("id") != entry_id_value: + continue + ## A nested match must actually live inside an `- insert:` row: a + ## `- id:` list under some other top-level row (an override row's own + ## sequence, say) is not a loader entry and is not ours to touch. + if require_nested and not _under_insert_row(lines, i): + continue + var j := i + 1 + var last_content := i + while j < lines.size(): + var l := lines[j] + if _is_blank_or_comment(l): + j += 1 + continue + if _indent_of(l) <= indent: + break + last_content = j + j += 1 + return {"start": i, "end": last_content + 1, "indent": indent} + return {} + + +## True when the nearest preceding 0-indent content line above `index` is an +## `- insert:` row header. Blank and comment lines are skipped; hitting the +## top of the file without a header means the nested line is orphaned and +## cannot be a loader entry. +static func _under_insert_row(lines: PackedStringArray, index: int) -> bool: + for i in range(index - 1, -1, -1): + if _is_blank_or_comment(lines[i]): + continue + if _indent_of(lines[i]) == 0: + return lines[i].strip_edges().begins_with("- insert:") + return false + + +## Parse a `- id: ` header line into {"id": String}. Returns {} for +## any other line. The value may be plain or single/double-quoted. +static func _parse_entry_header(line: String) -> Dictionary: + var stripped := line.strip_edges() + if not stripped.begins_with("- "): + return {} + var body := stripped.substr(2).strip_edges() + if not body.begins_with("id:"): + return {} + var value := body.substr(3).strip_edges() + if value.begins_with("\"") and value.ends_with("\"") and value.length() >= 2: + var parsed: Variant = JSON.parse_string(value) + if parsed is String: + value = parsed + elif value.begins_with("'") and value.ends_with("'") and value.length() >= 2: + value = value.substr(1, value.length() - 2) + return {"id": value} + + +## Extract the `config:` sub-dict from a found entry block. Fields may nest +## (env, reconnect); deeper values are parsed with the same scalar coercion +## the YAML strategy uses. Returns {} when the block has no config block. +static func _extract_config(lines: PackedStringArray, block: Dictionary) -> Dictionary: + var start := int(block.get("start", -1)) + var end := int(block.get("end", -1)) + if start < 0: + return {} + var config_indent := -1 + var config_start := -1 + for i in range(start, end): + var stripped := lines[i].strip_edges() + if _is_blank_or_comment(lines[i]): + continue + if stripped == "config:": + config_indent = _indent_of(lines[i]) + config_start = i + break + if config_start < 0: + return {} + return _parse_block_lines(lines, config_start + 1, end, config_indent) + + +## Parse sibling `key: value` lines at a fixed minimum indent into a +## Dictionary. Nested blocks (a key with no inline value) recurse and their +## child lines are consumed by the recursion — the parent index advances past +## them so they are never re-parsed as top-level config fields (#867 review). +## Flow arrays parse back into Arrays via JSON. Quoted and plain scalars +## strip via the YAML strategy's shared `coerce_scalar`. +static func _parse_block_lines(lines: PackedStringArray, start: int, end: int, min_indent: int) -> Dictionary: + var out: Dictionary = {} + var i := start + while i < end: + var l := lines[i] + if _is_blank_or_comment(l): + i += 1 + continue + var indent := _indent_of(l) + if indent <= min_indent: + break + var stripped := l.strip_edges() + var colon := stripped.find(":") + if colon < 0: + i += 1 + continue + var key := stripped.substr(0, colon).strip_edges() + var value := stripped.substr(colon + 1).strip_edges() + if value.is_empty(): + ## Nested block: find where its children end (a line at or above + ## the block key's indent), parse only that span, and jump past it. + var child_end := i + 1 + while child_end < end: + if not _is_blank_or_comment(lines[child_end]) and _indent_of(lines[child_end]) <= indent: + break + child_end += 1 + out[key] = _parse_block_lines(lines, i + 1, child_end, indent) + i = child_end + else: + ## Shared with the YAML strategy so the two dialects can never + ## drift on quoting/typing rules (#867 review). + out[key] = McpYamlStrategy.coerce_scalar(value) + i += 1 + return out + + +# --- Rewrites --------------------------------------------------------------- + +## Append a new `- insert:` row at the end of the file. A blank separator +## line keeps rows visually distinct; the file always ends with a newline. +static func _append_row(lines: PackedStringArray, nested_lines: PackedStringArray) -> String: + var parts: Array[String] = [] + for l in lines: + parts.append(l) + ## Collapse trailing blank lines so the appended row is not orphaned + ## below stray empties; one separator blank keeps rows readable. + while parts.size() > 0 and String(parts[parts.size() - 1]).strip_edges().is_empty(): + parts.remove_at(parts.size() - 1) + if parts.size() > 0: + parts.append("") + parts.append("- insert:") + for l in nested_lines: + parts.append(l) + return _join_lines(parts) + + +## Replace the lines owned by our entry. When the found block is a plain +## top-level row (indent 0 header), the whole row — including its children — +## is replaced by the insert form. When it is a nested block inside an +## insert row, only that block's lines are replaced, leaving sibling entries +## and comments in the same row byte-for-byte intact. +static func _replace_lines(lines: PackedStringArray, block: Dictionary, nested_lines: PackedStringArray) -> String: + var start := int(block.get("start", -1)) + var end := int(block.get("end", -1)) + var parts: Array[String] = [] + for i in range(lines.size()): + if i == start: + ## A nested block keeps the surrounding `- insert:` row, so only + ## the nested entry lines (indent > 0) are spliced in. + if _indent_of(lines[start]) > 0: + for l in nested_lines: + parts.append(l) + else: + parts.append("- insert:") + for l in nested_lines: + parts.append(l) + if i >= start and i < end: + continue + parts.append(lines[i]) + return _join_lines(parts) + + +## Remove our entry. A nested block is spliced out; if its enclosing insert +## row is left without any nested entries (only the bare `- insert:` header, +## blanks, and comments), the row header goes too so the file stays a valid +## patch list. A plain row for our id is removed wholesale. +static func _remove_lines(lines: PackedStringArray, block: Dictionary) -> String: + var start := int(block.get("start", -1)) + var end := int(block.get("end", -1)) + var nested := _indent_of(lines[start]) > 0 + var parts: Array[String] = [] + if nested: + ## Find the enclosing `- insert:` row header: the nearest preceding + ## 0-indent `- ` line. + var row_start := -1 + for i in range(start - 1, -1, -1): + if _indent_of(lines[i]) == 0 and lines[i].strip_edges().begins_with("- "): + row_start = i + break + ## Row end: first 0-indent non-blank/comment line after the block. + var row_end := lines.size() + for i in range(end, lines.size()): + if _indent_of(lines[i]) == 0 and not _is_blank_or_comment(lines[i]): + row_end = i + break + var has_other_entries := false + for i in range(row_start + 1, row_end): + if i >= start and i < end: + continue + if _is_blank_or_comment(lines[i]): + continue + if _indent_of(lines[i]) > 0 and lines[i].strip_edges().begins_with("- "): + has_other_entries = true + break + if has_other_entries or row_start < 0: + ## Only our block goes; sibling entries and any trailing + ## comments in the same row survive. + for i in range(lines.size()): + if i >= start and i < end: + continue + parts.append(lines[i]) + else: + ## The row held only our entry: drop the `- insert:` header and + ## our block, but keep trailing blank/comment lines — a comment + ## the user wrote above the next row must survive (#867 review). + for i in range(lines.size()): + if i >= row_start and i < end: + continue + parts.append(lines[i]) + parts = _trim_trailing_blanks(parts) + else: + ## Plain top-level row for our id: drop the whole block. + for i in range(lines.size()): + if i >= start and i < end: + continue + parts.append(lines[i]) + parts = _trim_trailing_blanks(parts) + return _join_lines(parts) + + +## Remove trailing blank lines left behind by a removal. +static func _trim_trailing_blanks(parts: Array[String]) -> Array[String]: + while parts.size() > 0 and String(parts[parts.size() - 1]).strip_edges().is_empty(): + parts.remove_at(parts.size() - 1) + return parts + + +## True when the text holds no patch rows at all — blank lines and comments +## only. Such a file cannot be written back (see `remove`), because dsh's +## patch parser rejects a non-array file at boot. +static func _is_blank_or_comment_only(text: String) -> bool: + for line in text.split("\n"): + var stripped := line.strip_edges() + if not stripped.is_empty() and not stripped.begins_with("#"): + return false + return true + + +## When the document's only content line is the empty flow sequence `[]`, +## return the text with that one line removed — blanks and comments stay, +## because they belong to the user. Any other document comes back unchanged; +## a `[]` mixed with real rows is left for `_is_patch_sequence` to refuse. +static func _strip_empty_flow_sequence(text: String) -> String: + var lines := _split_lines(text) + var bracket_line := -1 + for i in range(lines.size()): + if _is_blank_or_comment(lines[i]): + continue + if bracket_line < 0 and lines[i].strip_edges() == "[]": + bracket_line = i + continue + return text + if bracket_line < 0: + return text + var parts: Array[String] = [] + for i in range(lines.size()): + if i != bracket_line: + parts.append(lines[i]) + if parts.is_empty(): + return "" + return _join_lines(parts) + + +## True when the text is a valid loader patch list (or empty/comment-only / +## the empty flow sequence `[]`, which all mean "no layer"). Anything else — +## a top-level mapping or scalar — would make dsh fail boot, so Configure +## refuses to write into it instead of producing a broken file (#867 review). +## Only 0-indent content lines define the top-level structure: they must all +## be `- ` rows. Deeper lines are row children and are not inspected. `[]` is +## valid only as the COMPLETE document — appending rows after the empty flow +## sequence would produce malformed YAML, so a mixed `[]` + rows file fails +## the check too. +static func _is_patch_sequence(text: String) -> bool: + if text.strip_edges().is_empty(): + return true + var saw_brackets := false + var content_count := 0 + for line in text.split("\n"): + var stripped := line.strip_edges() + if stripped.is_empty() or stripped.begins_with("#"): + continue + content_count += 1 + if stripped == "[]": + saw_brackets = true + continue + if _indent_of(line) == 0 and not stripped.begins_with("- "): + return false + if saw_brackets and content_count > 1: + return false + return true + + +static func _join_lines(parts: Array) -> String: + if parts.is_empty(): + return "" + var lines: Array[String] = [] + for p in parts: + lines.append(String(p)) + return "\n".join(lines) + "\n" + + +# --- Small helpers ---------------------------------------------------------- + +static func _indent_str(n: int) -> String: + var out := "" + for i in range(n): + out += " " + return out + + +static func _indent_of(line: String) -> int: + var n := 0 + while n < line.length() and (line[n] == " " or line[n] == "\t"): + n += 1 + return n + + +static func _is_blank_or_comment(line: String) -> bool: + var stripped := line.strip_edges() + return stripped.is_empty() or stripped.begins_with("#") + + +static func _array_copy(value: Variant) -> Array: + if value is Array: + return (value as Array).duplicate(true) + if value is PackedStringArray: + return McpClient._array_from_packed(value) + return [] + + +static func _arrays_equal(left: Variant, right: Variant) -> bool: + if not (left is Array or left is PackedStringArray): + return false + if not (right is Array or right is PackedStringArray): + return false + var left_array := _array_copy(left) + var right_array := _array_copy(right) + if left_array.size() != right_array.size(): + return false + for i in range(left_array.size()): + if left_array[i] != right_array[i]: + return false + return true + + +## Returns {"ok": true, "data": String} when the file is absent or readable, +## and {"ok": false, "error": String} when unreadable. Callers must NOT fall +## back to an empty string on the error path — doing so blows away the user's +## other patch rows on the next write. +static func _read(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {"ok": true, "data": ""} + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + var err := FileAccess.get_open_error() + return {"ok": false, "error": "could not open for reading (%s)" % error_string(err)} + var t := f.get_as_text() + f.close() + return {"ok": true, "data": t} diff --git a/addons/godot_ai/clients/_dsh_strategy.gd.uid b/addons/godot_ai/clients/_dsh_strategy.gd.uid new file mode 100644 index 0000000..36703f4 --- /dev/null +++ b/addons/godot_ai/clients/_dsh_strategy.gd.uid @@ -0,0 +1 @@ +uid://ch0brn7swb6qx diff --git a/addons/godot_ai/clients/_json_strategy.gd b/addons/godot_ai/clients/_json_strategy.gd new file mode 100644 index 0000000..9fb40eb --- /dev/null +++ b/addons/godot_ai/clients/_json_strategy.gd @@ -0,0 +1,989 @@ +@tool +class_name McpJsonStrategy +extends RefCounted + +## Read–merge–write strategy for JSON-backed MCP clients. +## All knobs come from the McpClient descriptor as plain data — no Callables. +## See `_base.gd` for why descriptors are data-only. + + +static func configure( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> Dictionary: + if _uses_merge_tiers(client): + return _configure_merged(client, server_name, server_url, launch, project_roots) + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty(): + return {"status": "error", "message": "Could not resolve config path for %s on this OS" % client.display_name} + + var seed_path := str(resolution.get("seed_path", "")) + var read_path := seed_path if not FileAccess.file_exists(path) and not seed_path.is_empty() else path + var read := _read_or_init(read_path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to overwrite %s: %s. Fix or move the file, then re-run Configure." % [read_path, read["error"]]} + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": "error", "message": launch_error} + var config: Dictionary = read["data"] + var holder := _ensure_path(config, select_server_key_path(config, client)) + ## Pass the existing entry through so `build_entry` can preserve user-mutable + ## state (auto-approval lists, `disabled` toggles) instead of resetting it + ## to descriptor defaults on every Configure click. See `entry_initial_fields` + ## docs in `_base.gd`. + var existing: Variant = holder.get(server_name, null) + holder[server_name] = build_entry(client, server_url, existing, launch) + + # F5: refuse to re-serialize a file whose parsed integers above 2^53 would + # lose precision. Editing by hand keeps those values intact. + if _has_lossy_numbers(config): + return {"status": "error", "message": "Refusing to rewrite %s: contains integers above 2^53 that Godot's JSON parser would re-emit imprecise. Edit the file by hand." % path} + if not McpAtomicWrite.write(path, JSON.stringify(_narrow_integral_numbers(config), "\t", false)): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + +## Pi-style clients merge several global config files. Update the effective +## highest-precedence definition; fail closed when a project override exists +## because Pi's external working directory cannot be inferred safely here. +static func _configure_merged( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary, + project_roots: PackedStringArray, +) -> Dictionary: + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": "error", "message": launch_error} + var project := _load_project_definitions(client, server_name, project_roots) + if not project.get("ok", false): + return {"status": "error", "message": str(project.get("error", "Cannot inspect project config tiers"))} + var project_tiers: Array = project.get("tiers", []) + if not project_tiers.is_empty(): + return {"status": "error", "message": _project_override_message(project_tiers, "update or remove", client.display_name, server_name)} + var loaded := _load_merge_tiers(client) + if not loaded.get("ok", false): + return {"status": "error", "message": str(loaded.get("error", "Cannot read merged config tiers"))} + var tiers: Array = loaded.get("tiers", []) + if tiers.is_empty(): + return {"status": "error", "message": "Could not resolve config path for %s on this OS" % client.display_name} + var target_index := 0 + for index in range(tiers.size()): + var config: Dictionary = tiers[index]["data"] + var holder := _walk_path(config, select_server_key_path(config, client)) + if holder is Dictionary and holder.has(server_name): + target_index = index + var tier: Dictionary = tiers[target_index] + var config: Dictionary = tier["data"] + var holder := _ensure_path(config, select_server_key_path(config, client)) + var existing: Variant = holder.get(server_name, null) + holder[server_name] = build_entry(client, server_url, existing, launch) + var path := str(tier["path"]) + # F5: refuse to re-serialize a tier whose parsed integers above 2^53 would + # lose precision. The same check guards the simple `configure` path. + if _has_lossy_numbers(config): + return {"status": "error", "message": "Refusing to rewrite %s: contains integers above 2^53 that Godot's JSON parser would re-emit imprecise. Edit the file by hand." % path} + if not McpAtomicWrite.write(path, JSON.stringify(_narrow_integral_numbers(config), "\t", false)): + return {"status": "error", "message": "Cannot write to %s" % path} + # Codex F1 caveat: when we wrote a global tier but couldn't find any project + # override in the roots we probed AND the user hasn't told us where Pi (or any + # external cwd client) actually runs from, we can't prove this write is the + # effective config. Surface the actionable hint instead of silently passing. + # The early `not project_tiers.is_empty()` return above already covers the + # "project override exists in probed roots" case (we fail closed there), so + # reaching this point with `project_tiers.is_empty()` means: no probed + # override was found. + var message := McpClient.configured_message(client, server_url) + var external_cwd := str(McpClientConfigurator._editor_setting_lookup(McpClientConfigurator.SETTING_EXTERNAL_CLIENT_CWD)) + if external_cwd.is_empty() and project_tiers.is_empty(): + message += " If %s is launched from a cwd this editor cannot see, the effective entry may still be in a project-tier file — set godot_ai/external_client_cwd to that cwd to verify." % client.display_name + return {"status": "ok", "message": message} + + +static func check_status( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> McpClient.Status: + return check_status_details(client, server_name, server_url, launch, project_roots).get("status", McpClient.Status.NOT_CONFIGURED) + + +## Detailed variant feeding the dock's error_msg plumbing (#711): a config +## file that EXISTS but can't be read or parsed is Status.ERROR carrying the +## read/parse error, not NOT_CONFIGURED — the write path refuses to touch +## such a file (see `_read_or_init`), so the status dot must say "broken +## file", not "click Configure". +static func check_status_details( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> Dictionary: + if _uses_merge_tiers(client): + return _check_status_merged(client, server_name, server_url, launch, project_roots) + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var read := _read_or_init(path) + if not read["ok"]: + return {"status": McpClient.Status.ERROR, "error_msg": String(read["error"])} + var config: Dictionary = read["data"] + var holder := _walk_path(config, select_server_key_path(config, client)) + if not (holder is Dictionary) or not holder.has(server_name): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + return _entry_status_details(client, holder[server_name], server_url, launch) + + +## Verify the effective last definition after applying the client's merge order. +static func _check_status_merged( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary, + project_roots: PackedStringArray, +) -> Dictionary: + var loaded := _load_merge_tiers(client) + if not loaded.get("ok", false): + return {"status": McpClient.Status.ERROR, "error_msg": str(loaded.get("error", "Cannot read merged config tiers"))} + var effective: Variant = null + for tier in loaded.get("tiers", []): + var config: Dictionary = tier["data"] + var holder := _walk_path(config, select_server_key_path(config, client)) + if holder is Dictionary and holder.has(server_name): + effective = holder[server_name] + var project := _load_project_definitions(client, server_name, project_roots) + if not project.get("ok", false): + return {"status": McpClient.Status.ERROR, "error_msg": str(project.get("error", "Cannot inspect project config tiers"))} + var project_tiers: Array = project.get("tiers", []) + if not project_tiers.is_empty(): + # Last-definition-wins mirrors the global-tier fold above and how + # pi-codemode-mcp merges project tiers on disk. Earlier tiers are dead + # once a later one defines the same server, so an early-stale entry + # doesn't make Pi's effective config drift (codex-review finding F2). + # Pass `[latest]` to `_project_override_message` so the error names only + # the file the user actually has to edit. + var latest: Dictionary = project_tiers[project_tiers.size() - 1] + var details := _entry_status_details(client, latest["entry"], server_url, launch) + if details.get("status") != McpClient.Status.CONFIGURED: + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": _project_override_message([latest], "update or remove", client.display_name, server_name)} + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + if effective == null: + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + return _entry_status_details(client, effective, server_url, launch) + + +static func _entry_status_details( + client: McpClient, + entry: Variant, + server_url: String, + launch: Dictionary, +) -> Dictionary: + if not (entry is Dictionary): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": launch_error} + if verify_entry(client, entry, server_url, launch): + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + + +static func remove( + client: McpClient, + server_name: String, + project_roots: PackedStringArray = PackedStringArray(), +) -> Dictionary: + if _uses_merge_tiers(client): + return _remove_merged(client, server_name, project_roots) + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": "ok", "message": "Not configured"} + # Token-preserving removal (F5): pull the original file text via + # `_read_file_text` and edit only the entry's bytes — keeps every other + # byte, including integers above 2^53, byte-for-byte identical to what + # the user wrote. The parsed-dict round-trip path is gone. + var file_read := _read_file_text(path) + if not file_read.get("ok", false): + return {"status": "error", "message": "Refusing to rewrite %s: %s." % [path, file_read.get("error", "")]} + var config: Dictionary = file_read.get("data", {}) + var key_path := select_server_key_path(config, client) + var original_text: String = str(file_read.get("original_text", "")) + var updated: String = _text_remove_server_entry(original_text, key_path, server_name) + if updated == original_text: + return {"status": "ok", "message": "Not configured"} + if not McpAtomicWrite.write(path, updated): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + + +static func _remove_merged( + client: McpClient, server_name: String, project_roots: PackedStringArray +) -> Dictionary: + var project := _load_project_definitions(client, server_name, project_roots) + if not project.get("ok", false): + return {"status": "error", "message": str(project.get("error", "Cannot inspect project config tiers"))} + var project_tiers: Array = project.get("tiers", []) + if not project_tiers.is_empty(): + return {"status": "error", "message": _project_override_message(project_tiers, "remove", client.display_name, server_name)} + var loaded := _load_merge_tiers(client) + if not loaded.get("ok", false): + return {"status": "error", "message": str(loaded.get("error", "Cannot read merged config tiers"))} + var writes: Array[Dictionary] = [] + for tier in loaded.get("tiers", []): + if not tier.get("exists", false): + continue + var key_path := select_server_key_path(tier["data"], client) + var original: String = str(tier.get("original_text", "")) + # Token-preserving removal (F5): edit `original` textually instead of + # re-serialising the parsed config. This preserves every byte outside + # the entry block, so unrelated integers (including those above the + # IEEE-754 exact-int range that `_narrow_integral_numbers` cannot + # round-trip) keep their original literals. + var updated: String = _text_remove_server_entry(original, key_path, server_name) + if updated == original: + continue # entry not in this tier; skip + writes.append({ + "path": tier["path"], + "text": updated, + "original_text": original, + }) + if writes.is_empty(): + return {"status": "ok", "message": "Not configured"} + var written := _write_transaction(writes) + if not written.get("ok", false): + return {"status": "error", "message": written.get("error", "Cannot remove merged configuration")} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + + +## Synthesize the entry dict the strategy writes under +## `server_key_path[server_name]`. Both URL and command entries deep-copy the +## existing dict before overwriting strategy-owned fields, preserving unknown +## client additions as well as descriptor-documented user fields. +static func build_entry( + client: McpClient, + server_url: String, + existing: Variant = null, + launch: Dictionary = {}, +) -> Dictionary: + if _is_supported_command_shape(client.command_shape): + var command_entry: Dictionary = (existing as Dictionary).duplicate(true) if existing is Dictionary else {} + if client.command_shape == McpClient.CommandShape.COMMAND_ARRAY: + ## OpenCode-style: the entry's `command` field IS the argv array. + ## A stale sibling `args` from a FLAT-style hand edit would be + ## ambiguous next to it, so it is strategy-owned and removed. + command_entry["command"] = _launch_argv(launch) + command_entry.erase("args") + else: + command_entry["command"] = str(launch.get("command", "")) + command_entry["args"] = _array_copy(launch.get("args", [])) + if not client.command_transport_key.is_empty(): + command_entry[client.command_transport_key] = client.command_transport_value + for key in client.command_initial_fields: + if not command_entry.has(key): + command_entry[key] = client.command_initial_fields[key] + for key in client.command_legacy_keys: + command_entry.erase(String(key)) + _remove_legacy_env_keys(command_entry, client.command_env_legacy_keys) + return command_entry + if client.command_shape != McpClient.CommandShape.NONE: + return {} + return build_url_entry(client, server_url, existing) + + +static func build_url_entry(client: McpClient, server_url: String, existing: Variant = null) -> Dictionary: + var entry: Dictionary = (existing as Dictionary).duplicate(true) if existing is Dictionary else {} + entry[client.entry_url_field] = server_url + for k in client.entry_extra_fields: + entry[k] = client.entry_extra_fields[k] + for k in client.entry_initial_fields: + if not entry.has(k): + entry[k] = client.entry_initial_fields[k] + return entry + + +## Default verifier for a stored entry. Command entries must match every +## launch-affecting value exactly; legacy URL or env keys are migration drift. +## For URL clients, assert `entry[entry_url_field] == url` AND every +## key in `entry_extra_fields` matches verbatim. Type-pinning for Cline / +## Roo / Kilo (`type: "streamable-http"` etc.) falls out of this — pre-fix +## entries that lack the type field fail verification and surface as drift. +static func verify_entry( + client: McpClient, + entry: Dictionary, + server_url: String, + launch: Dictionary = {}, +) -> bool: + if client.command_shape != McpClient.CommandShape.NONE: + if not _is_supported_command_shape(client.command_shape) or not bool(launch.get("ok", false)): + return false + for key in client.command_legacy_keys: + if entry.has(String(key)): + return false + var env = entry.get("env", null) + if env is Dictionary: + for key in client.command_env_legacy_keys: + if env.has(String(key)): + return false + if client.command_shape == McpClient.CommandShape.COMMAND_ARRAY: + if not _arrays_equal(entry.get("command", null), _launch_argv(launch)): + return false + if entry.has("args"): + return false + else: + if entry.get("command") != launch.get("command"): + return false + if not _arrays_equal(entry.get("args", null), launch.get("args", null)): + return false + if not client.command_transport_key.is_empty(): + if not entry.has(client.command_transport_key): + return false + if entry.get(client.command_transport_key) != client.command_transport_value: + return false + return true + if entry.get(client.entry_url_field, "") != server_url: + return false + for k in client.entry_extra_fields: + if entry.get(k) != client.entry_extra_fields[k]: + return false + return true + + +static func command_launch_error(client: McpClient, launch: Dictionary) -> String: + if client.command_shape == McpClient.CommandShape.NONE: + return "" + if not _is_supported_command_shape(client.command_shape): + return "%s uses a command shape not supported by JSON yet" % client.display_name + if not bool(launch.get("ok", false)): + return str(launch.get("error", "No compatible attach launcher was found.")) + return "" + + +static func _is_supported_command_shape(shape: McpClient.CommandShape) -> bool: + return shape == McpClient.CommandShape.FLAT or shape == McpClient.CommandShape.COMMAND_ARRAY + + +## The full launch argv as one array: launcher path followed by every arg. +static func _launch_argv(launch: Dictionary) -> Array: + var argv: Array = [str(launch.get("command", ""))] + argv.append_array(_array_copy(launch.get("args", []))) + return argv + + +static func _remove_legacy_env_keys(entry: Dictionary, legacy_keys: PackedStringArray) -> void: + if legacy_keys.is_empty(): + return + var existing_env = entry.get("env", null) + if not (existing_env is Dictionary): + return + var env: Dictionary = (existing_env as Dictionary).duplicate(true) + for key in legacy_keys: + env.erase(String(key)) + if env.is_empty(): + entry.erase("env") + else: + entry["env"] = env + + +static func _array_copy(value: Variant) -> Array: + if value is Array: + return (value as Array).duplicate(true) + if value is PackedStringArray: + return McpClient._array_from_packed(value) + return [] + + +static func _arrays_equal(left: Variant, right: Variant) -> bool: + if not (left is Array or left is PackedStringArray): + return false + if not (right is Array or right is PackedStringArray): + return false + var left_array := _array_copy(left) + var right_array := _array_copy(right) + if left_array.size() != right_array.size(): + return false + for i in range(left_array.size()): + if left_array[i] != right_array[i]: + return false + return true + + +## Read a config file once and parse the captured text. Returns +## {"exists": bool, "ok": bool, "data": Dictionary, "original_text": String} +## when the file is absent or parses cleanly, and +## {"exists": true, "ok": false, "error": String, "original_text": String} +## when the file exists with non-empty content we cannot safely round-trip. +## Callers must NOT treat the error path as an empty config — doing so blows +## away the user's other MCP entries on the next write. The `original_text` +## is the exact captured source so transactional rollback can restore +## byte-for-byte; the UTF-8 BOM is stripped only from the parsing copy. +static func _read_file_text(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {"exists": false, "ok": true, "data": {}, "original_text": ""} + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + var open_err := FileAccess.get_open_error() + return {"exists": true, "ok": false, "error": "could not open for reading (error %d)" % open_err, "original_text": ""} + var content := file.get_as_text() + file.close() + if content.strip_edges().is_empty(): + return {"exists": true, "ok": true, "data": {}, "original_text": content} + var parse_copy := content + # Strip a UTF-8 BOM if present — some editors (notably on Windows) save + # JSON with a leading , which Godot's JSON.parse rejects outright. + # Previously this landed on the "unparseable → wipe" path. + if parse_copy.begins_with(""): + parse_copy = parse_copy.substr(1) + var json := JSON.new() + if json.parse(parse_copy) != OK: + var msg := "JSON parse error on line %d: %s" % [json.get_error_line(), json.get_error_message()] + push_warning("MCP | %s in %s" % [msg, path]) + return {"exists": true, "ok": false, "error": msg, "original_text": content} + if not (json.data is Dictionary): + return {"exists": true, "ok": false, "error": "top-level value is %s, expected object" % type_string(typeof(json.data)), "original_text": content} + return {"exists": true, "ok": true, "data": json.data, "original_text": content} + + +## Returns {"ok": true, "data": Dictionary} when the file is absent or parses +## cleanly, and {"ok": false, "error": String} when the file exists with +## non-empty content we cannot safely round-trip. Callers must NOT fall back +## to an empty dict on the error path — doing so blows away the user's other +## MCP entries on the next write. +static func _read_or_init(path: String) -> Dictionary: + var read := _read_file_text(path) + var result: Dictionary = {"ok": read.get("ok", false), "data": read.get("data", {})} + if not result.get("ok", false): + result["error"] = read.get("error", "") + return result + + +## Walk a key path, creating intermediate Dicts as needed. Returns the leaf Dict. +static func _ensure_path(root: Dictionary, key_path: PackedStringArray) -> Dictionary: + var cur := root + for key in key_path: + var next = cur.get(key) + if not (next is Dictionary): + next = {} + cur[key] = next + cur = next + return cur + + +## Walk a key path, returning the leaf Dict if all hops exist; else null. +static func _walk_path(root: Dictionary, key_path: PackedStringArray) -> Variant: + var cur: Variant = root + for key in key_path: + if not (cur is Dictionary) or not cur.has(key): + return null + cur = cur[key] + return cur + + +## Match clients that accept multiple server-map keys without creating a +## higher-precedence canonical map that shadows an existing legacy map. A +## non-null scalar still wins, matching nullish-coalescing parsers; Configure's +## `_ensure_path` then repairs it using the strategy's existing behavior. +static func select_server_key_path(root: Dictionary, client: McpClient) -> PackedStringArray: + var candidates: Array[PackedStringArray] = [client.server_key_path] + # Dynamic access keeps mixed-snapshot self-updates parse-safe when a new + # strategy is briefly loaded with an older McpClient base (#398/#736). + var aliases = client.get("server_key_path_aliases") + if aliases is Array: + for alias in aliases: + if alias is PackedStringArray: + candidates.append(alias) + for key_path in candidates: + if _walk_path(root, key_path) != null: + return key_path + return client.server_key_path + + +static func _uses_merge_tiers(client: McpClient) -> bool: + var templates = client.get("config_merge_path_templates") + return templates is Dictionary and not templates.is_empty() + + +## Resolve the global config tiers in the client's documented merge order. +static func _merge_paths(client: McpClient) -> PackedStringArray: + var result := PackedStringArray() + var templates = client.get("config_merge_path_templates") + if templates is Dictionary: + var platform_key := McpPathTemplate.platform_key(templates) + if not platform_key.is_empty(): + var raw_paths: Variant = templates.get(platform_key, []) + if raw_paths is Array or raw_paths is PackedStringArray: + for template in raw_paths: + var path := McpPathTemplate.expand(str(template)).simplify_path() + if not path.is_empty() and not result.has(path): + result.append(path) + return result + + +## Pi's project tiers are relative to Pi's process cwd, not Godot's. Inspect +## plausible roots only to detect overrides; callers fail closed rather than +## mutating both guesses. +static func _project_candidate_paths( + client: McpClient, roots: PackedStringArray +) -> PackedStringArray: + var result := PackedStringArray() + var project_paths = client.get("config_merge_project_paths") + if not (project_paths is PackedStringArray): + return result + for project_path in project_paths: + var absolute_path := String(project_path).simplify_path() + if absolute_path.is_absolute_path() and FileAccess.file_exists(absolute_path) and not result.has(absolute_path): + result.append(absolute_path) + for root in roots: + if String(root).is_empty(): + continue + for relative_path in project_paths: + if String(relative_path).is_absolute_path(): + continue + var path := String(root).path_join(String(relative_path)).simplify_path() + if FileAccess.file_exists(path) and not result.has(path): + result.append(path) + return result + + +static func _load_project_definitions( + client: McpClient, server_name: String, project_roots: PackedStringArray +) -> Dictionary: + var tiers: Array[Dictionary] = [] + for path in _project_candidate_paths(client, project_roots): + var read := _read_or_init(path) + if not read.get("ok", false): + return {"ok": false, "error": "Cannot inspect project config %s: %s" % [path, read.get("error", "invalid JSON")]} + var config: Dictionary = read["data"] + var key_path := select_server_key_path(config, client) + var holder := _walk_path(config, key_path) + if holder is Dictionary and holder.has(server_name): + tiers.append({ + "path": path, + "data": config, + "key_path": key_path, + "entry": holder[server_name], + }) + return {"ok": true, "tiers": tiers} + + +static func _project_override_message( + tiers: Array, action: String, client_name: String, server_name: String +) -> String: + var paths := PackedStringArray() + for tier in tiers: + paths.append(str(tier["path"])) + return "%s project config overrides %s at %s. %s resolves project files from its own working directory, so the dock cannot safely choose one; %s the entry manually." % [client_name, server_name, ", ".join(paths), client_name, action] + + +static func _load_merge_tiers(client: McpClient) -> Dictionary: + var tiers: Array[Dictionary] = [] + for path in _merge_paths(client): + ## These templates never pass through `resolved_config_path_details`, + ## so they need its fail-closed gate here: `McpPathTemplate.expand` + ## leaves a token it cannot resolve in place, and the relative survivor + ## would be read — and on Configure, written — against the editor's own + ## working directory. Fail the whole fold rather than dropping the tier: + ## a dropped tier reads as "the user has no config there", which is + ## exactly the wrong thing to conclude when we could not look. + if not path.is_absolute_path(): + return { + "ok": false, + "error": McpClient.unresolved_config_path_error(client.display_name, path), + } + var read := _read_file_text(path) + if not read.get("ok", false): + return { + "ok": false, + "error": "Refusing to rewrite %s: %s. Fix or move the file, then re-run Configure." % [path, read.get("error", "invalid JSON")], + } + tiers.append({ + "path": path, + "exists": read.get("exists", false), + "original_text": read.get("original_text", ""), + "data": read.get("data", {}), + }) + return {"ok": true, "tiers": tiers} + + +## Commit a multi-file removal with best-effort rollback. Each individual write +## is atomic; this layer restores earlier tiers if a later commit fails. +static func _write_transaction(writes: Array[Dictionary]) -> Dictionary: + var completed: Array[Dictionary] = [] + for write in writes: + var path := str(write["path"]) + if McpAtomicWrite.write(path, str(write["text"])): + completed.append(write) + continue + var rollback_failed := PackedStringArray() + completed.reverse() + for previous in completed: + if not McpAtomicWrite.write(str(previous["path"]), str(previous["original_text"])): + rollback_failed.append(str(previous["path"])) + var suffix := "" + if not rollback_failed.is_empty(): + suffix = " Rollback also failed for: %s" % ", ".join(rollback_failed) + return {"ok": false, "error": "Cannot write to %s; earlier tier changes were rolled back.%s" % [path, suffix]} + return {"ok": true} +## Path that `_check_status_merged`'s last-wins logic would consider +## authoritative for the server entry, or "" when no entry is found in +## any tier. Mirrors the same project-tier / global-tier resolution the +## status check uses so callers (notably the dock Open/Reveal buttons) +## land on the file that actually drives Pi's effective config. +## +## Resolution order (codex round 3, F-3-4): +## 1. Latest project tier containing the entry — F2 last-wins means the +## latest of `.pi/mcp.json` and `.mcp.json` wins (matches `_check_status_merged`). +## 2. Latest global tier containing the entry — already iterated in +## merge order, last-iterated-wins (same loop pattern as +## `manual_target_details` lines 660-665). +## 3. "" when no tier has the entry — caller decides what fallback +## (`path_template`) to use. +## +## Returns "" (not `path_template`) on the "nothing anywhere" branch so +## the dock can distinguish "no entry yet" from "entry is at the +## template path" if it wants to. +static func authoritative_tier_path( + client: McpClient, + server_name: String, + project_roots: PackedStringArray, +) -> String: + if not _uses_merge_tiers(client): + return "" + var project := _load_project_definitions(client, server_name, project_roots) + if not bool(project.get("ok", false)): + return "" + var project_tiers: Array = project.get("tiers", []) + if not project_tiers.is_empty(): + # F2 last-wins: latest project tier is authoritative. When there are + # multiple project tiers, the user-visible status is driven by the + # latest, so the Open/Reveal buttons should send them there too. + var latest: Dictionary = project_tiers[project_tiers.size() - 1] + return str(latest.get("path", "")) + var loaded := _load_merge_tiers(client) + if not bool(loaded.get("ok", false)): + return "" + var tiers: Array = loaded.get("tiers", []) + # Iterate in priority order, overwrite `selected_path` each time we + # find a tier containing the entry. With Pi's merge path order + # [mcp.json, .mcp.json] this leaves the higher-precedence `.mcp.json`. + var selected_path: String = "" + for tier in tiers: + var data: Dictionary = tier.get("data", {}) + var holder: Variant = _walk_path(data, select_server_key_path(data, client)) + if holder is Dictionary and holder.has(server_name): + selected_path = str(tier.get("path", "")) + return selected_path + + +## Pick the file and top-level map shown by the manual JSON instructions using +## the same merge and alias precedence as automatic Configure. +static func manual_target_details( + client: McpClient, + server_name: String, + fallback_path: String, + project_roots: PackedStringArray = PackedStringArray(), +) -> Dictionary: + if _uses_merge_tiers(client): + var project := _load_project_definitions(client, server_name, project_roots) + if not project.get("ok", false): + return {"ok": false, "error": project.get("error", "Cannot inspect project config tiers")} + var project_tiers: Array = project.get("tiers", []) + if project_tiers.size() > 1: + return {"ok": false, "error": _project_override_message(project_tiers, "update or remove", client.display_name, server_name)} + if project_tiers.size() == 1: + var selected_project: Dictionary = project_tiers[0] + return { + "ok": true, + "path": selected_project["path"], + "key_path": selected_project["key_path"], + } + var loaded := _load_merge_tiers(client) + if not loaded.get("ok", false): + return {"ok": false, "error": loaded.get("error", "Cannot read merged config tiers")} + var tiers: Array = loaded.get("tiers", []) + var selected: Variant = tiers[0] if not tiers.is_empty() else null + for tier in tiers: + var config: Dictionary = tier["data"] + var holder := _walk_path(config, select_server_key_path(config, client)) + if holder is Dictionary and holder.has(server_name): + selected = tier + if selected != null: + var config: Dictionary = selected["data"] + return { + "ok": true, + "path": selected["path"], + "key_path": select_server_key_path(config, client), + } + var read := _read_or_init(fallback_path) + if not read.get("ok", false): + return {"ok": false, "error": "Cannot inspect %s: %s" % [fallback_path, read.get("error", "invalid JSON")]} + return { + "ok": true, + "path": fallback_path, + "key_path": select_server_key_path(read["data"], client), + } + + +## Godot's JSON.parse turns every JSON number into a float, so a later +## JSON.stringify re-emits the user's integer fields as "8080.0" — which strict +## consumers (Go's encoding/json into an int field, etc.) reject, and which +## needlessly rewrites every number across the user's *other* entries. Re-narrow +## exactly-representable integral floats back to int so they serialize without +## the ".0". Walks dicts/arrays in place and returns the (same) value. +## +## Integers above 2^53 already lost precision when Godot parsed them to double, +## so they're left as the float Godot produced rather than faking exactness — +## byte-perfect preservation would require not parsing the file at all, and such +## magnitudes don't occur in MCP client configs. +static func _narrow_integral_numbers(value: Variant) -> Variant: + match typeof(value): + TYPE_FLOAT: + if is_finite(value) and value == floor(value) and absf(value) <= 9007199254740992.0: + return int(value) + TYPE_DICTIONARY: + for k in value: + value[k] = _narrow_integral_numbers(value[k]) + TYPE_ARRAY: + for i in value.size(): + value[i] = _narrow_integral_numbers(value[i]) + return value + + +## True when `value` contains any float outside the IEEE-754 exact-int range +## (`abs(f) > 2^53`) that would lose precision when JSON.stringify re-emits it. +## The configure path refuses such files instead of silently mutating unrelated +## integers; the remove path never needs this check because it does +## token-preserving surgery (F5). +static func _has_lossy_numbers(value: Variant) -> bool: + match typeof(value): + TYPE_FLOAT: + # `>=` not `>`: `2^53 + 1` rounds down to `2^53.0` when Godot parses + # the integer to double, so even a "clean" `2^53.0` after parse may + # have lost a least-significant bit we cannot recover. Refusing at + # the boundary is conservative but correct — and 2^53+ magnitudes + # don't appear in real MCP client configs anyway. + if is_finite(value) and absf(value) >= 9007199254740992.0: + return true + TYPE_DICTIONARY: + for k in value: + if _has_lossy_numbers(value[k]): + return true + TYPE_ARRAY: + for i in value.size(): + if _has_lossy_numbers(value[i]): + return true + return false + + +## Token-preserving entry removal. Walks the JSON text with a brace-balanced +## scanner to locate the entry at `key_path[0]/.../[server_name]` and returns +## `text` with that entry's bytes deleted (along with the surrounding +## whitespace + trailing comma). Everything else — including integers above +## the IEEE-754 exact-int range that `_narrow_integral_numbers` would silently +## mutate — is preserved byte-for-byte. Returns `text` unchanged when the +## entry isn't found in `text` (callers treat this as a no-op write). +static func _text_remove_server_entry(text: String, key_path: PackedStringArray, server_name: String) -> String: + # Descend through `key_path`. Each step finds `"":` directly inside the + # current container and moves the cursor past the value's opening `{` or `[`. + # After the loop, `cursor` is positioned just past the opening bracket of the + # container that holds our entry, and `container_depth` tracks how deeply + # nested that container is from the root (0 = root object/array). + var cursor := 0 + # Skip past the root's opening `{` or `[` (and any leading whitespace or + # UTF-8 BOM) so `_find_key_at_container_depth` starts scanning from + # inside the root container with `inner_depth == 0`. Without this step, + # the first character encountered is the root's `{`, which bumps + # `inner_depth` to 1 and makes the top-level key check fail. The BOM + # skip mirrors `_read_file_text`'s parse_copy BOM-strip above so the + # scanner sees the same view of the file the parser does; the BOM + # itself stays in `text` so the byte-survival F5 contract still holds + # (codex round 3, F-3-6 — without it, files saved with a Windows BOM + # left the entry in place after Remove). + while cursor < text.length() and _is_json_ws(text[cursor]): + cursor += 1 + if cursor < text.length() and text[cursor] == "": + cursor += 1 + if cursor < text.length() and (text[cursor] == "{" or text[cursor] == "["): + cursor += 1 + var container_depth := 0 + for key in key_path: + var key_bytes := JSON.stringify(String(key)) + var match := _find_key_at_container_depth(text, cursor, key_bytes) + if match.is_empty(): + return text + var open_char := text[match["value_start"]] + if open_char != "{" and open_char != "[": + return text # leaf isn't an object/array — path can't reach our entry + container_depth += 1 + cursor = match["value_start"] + 1 + # Now find `"":` at the top level of the container we descended + # into (the helper gates on `inner_depth == 0`). + var entry_bytes := JSON.stringify(server_name) + var entry_match := _find_key_at_container_depth(text, cursor, entry_bytes) + if entry_match.is_empty(): + return text + var key_start: int = entry_match["key_start"] + var value_end: int = entry_match["value_end"] + # Trim the surrounding comma in a mutually exclusive way: the trailing comma + # (after the entry's value) carries the burden when the entry is NOT the last + # in its container, and the leading comma (before the entry's key) carries it + # only when the entry IS the last. Trimming BOTH unconditionally corrupts a + # middle-position entry into `"x"}"y"` with no separator — codex-review + # finding F5 (regression after the initial round). + var remove_end := value_end + # Skip JSON whitespace before checking for the trailing comma — valid + # (if unusual) formats like `"godot-ai":{} ,"other":{}` put whitespace + # between the value and its separator. codex round 4 finding. + var trailing_scan := remove_end + while trailing_scan < text.length() and _is_json_ws(text[trailing_scan]): + trailing_scan += 1 + var had_trailing_comma := trailing_scan < text.length() and text[trailing_scan] == "," + if had_trailing_comma: + # Jump past the comma (and any whitespace before it we just skipped). + remove_end = trailing_scan + 1 + while remove_end < text.length() and _is_json_ws(text[remove_end]): + remove_end += 1 + var remove_start := key_start + if not had_trailing_comma: + while remove_start > 0 and _is_json_ws(text[remove_start - 1]): + remove_start -= 1 + if remove_start > 0 and text[remove_start - 1] == ",": + remove_start -= 1 + while remove_start > 0 and _is_json_ws(text[remove_start - 1]): + remove_start -= 1 + return text.substr(0, remove_start) + text.substr(remove_end) + + +## Look for `key_bytes` (a JSON-encoded string literal including the surrounding +## quotes) at the TOP LEVEL of the container we're inside, scanning `text` from +## `start` onwards. The caller is expected to advance `start` just past the +## container's opening `{` or `[`, so we begin with `inner_depth == 0` and a +## key matches when we hit it while `inner_depth` is still 0. The scan exits +## immediately if `inner_depth` drops below 0 (the target container closed) +## to prevent same-named keys in later sibling containers from being picked +## up. Returns `{key_start, value_start, value_end}` on success or `{}` if +## the key isn't present in that container. +static func _find_key_at_container_depth(text: String, start: int, key_bytes: String) -> Dictionary: + var i := start + var in_string := false + var escape := false + var inner_depth := 0 # depth *inside* the current container + while i < text.length(): + var c := text[i] + if in_string: + if escape: + escape = false + elif c == "\\": + escape = true + elif c == '"': + in_string = false + i += 1 + continue + if c == '"': + if text.substr(i, key_bytes.length()) == key_bytes: + var after_key := i + key_bytes.length() + while after_key < text.length() and _is_json_ws(text[after_key]): + after_key += 1 + if after_key < text.length() and text[after_key] == ":": + var value_start := after_key + 1 + while value_start < text.length() and _is_json_ws(text[value_start]): + value_start += 1 + var value_end := _json_value_span_end(text, value_start) + if value_end >= 0 and inner_depth == 0: + return {"key_start": i, "value_start": value_start, "value_end": value_end} + in_string = true + i += 1 + continue + if c == "{" or c == "[": + inner_depth += 1 + elif c == "}" or c == "]": + inner_depth -= 1 + # Bail out the moment we leave the container we're scanning. Without + # this guard, a later sibling container at the same level (e.g. a + # top-level `extensions` block after `mcpServers` closes) re-balances + # `inner_depth` back to 0 and a same-named key in that sibling would + # match — silently deleting data we never intended to touch + # (codex-review finding F5, regression after the initial round). + if inner_depth < 0: + return {} + i += 1 + return {} + + +## Given `value_start` pointing at the first char of a JSON value, return the +## position AFTER the value's last char. Handles objects, arrays, strings, +## and bare literals (numbers, true/false/null). Returns -1 if the value is +## unterminated. +static func _json_value_span_end(text: String, value_start: int) -> int: + if value_start >= text.length(): + return -1 + var c := text[value_start] + if c == "{" or c == "[": + var open_char := c + var close_char := "}" if c == "{" else "]" + var depth := 1 + var i := value_start + 1 + var in_string := false + var escape := false + while i < text.length() and depth > 0: + var ch := text[i] + if in_string: + if escape: + escape = false + elif ch == "\\": + escape = true + elif ch == '"': + in_string = false + i += 1 + continue + if ch == '"': + in_string = true + elif ch == open_char: + depth += 1 + elif ch == close_char: + depth -= 1 + i += 1 + return i if depth == 0 else -1 + if c == '"': + var i := value_start + 1 + var escape := false + while i < text.length(): + var ch := text[i] + if escape: + escape = false + elif ch == "\\": + escape = true + elif ch == '"': + return i + 1 + i += 1 + return -1 + # Bare literal: number / true / false / null. Walk until a JSON-significant + # delimiter (`,`, `}`, `]`, or whitespace). + var i := value_start + while i < text.length(): + var ch := text[i] + if ch == "," or ch == "}" or ch == "]" or _is_json_ws(ch): + break + i += 1 + return i + + +static func _is_json_ws(c: String) -> bool: + return c == " " or c == "\t" or c == "\n" or c == "\r" diff --git a/addons/godot_ai/clients/_json_strategy.gd.uid b/addons/godot_ai/clients/_json_strategy.gd.uid new file mode 100644 index 0000000..5e41fbb --- /dev/null +++ b/addons/godot_ai/clients/_json_strategy.gd.uid @@ -0,0 +1 @@ +uid://g8a4iijpk22w diff --git a/addons/godot_ai/clients/_manual_command.gd b/addons/godot_ai/clients/_manual_command.gd new file mode 100644 index 0000000..3e178ca --- /dev/null +++ b/addons/godot_ai/clients/_manual_command.gd @@ -0,0 +1,383 @@ +@tool +class_name McpManualCommand +extends RefCounted + +const SHELL_POSIX := "posix" +const SHELL_POWERSHELL := "powershell" +## Keep this intersection deliberately small. PowerShell treats a leading `@` +## as splatting syntax and commas as list separators, while POSIX shells accept +## both literally; quoting either is safer than trying to infer token position. +const _SHELL_BARE_SAFE_CHARS := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=:./-" + +## Synthesize the "Run this manually" string the dock surfaces when +## auto-configure can't find a CLI / write a file. Generated from the +## descriptor's declarative fields — there is no per-client builder +## Callable. See `_base.gd` for why descriptors are data-only. + + +static func build( + client: McpClient, + server_name: String, + server_url: String, + resolved_path: String, + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> String: + match client.config_type: + "cli": + return _build_cli(client, server_name, server_url, resolved_path, launch, project_roots) + "json": + return _build_json(client, server_name, server_url, resolved_path, launch, project_roots) + "toml": + return _build_toml(client, server_name, server_url, resolved_path, launch) + "yaml": + return _build_yaml(client, server_name, server_url, resolved_path, launch) + "dsh": + return _build_dsh(client, server_name, server_url, resolved_path, launch) + return "" + + +## CLI clients: format the register template against the *short* CLI name so +## the user can paste it into a terminal regardless of where their binary +## lives. (The auto-configure path resolves to an absolute uvx-style path; +## that's noise for a paste-into-terminal hint. The attach launcher path +## inside a command-shape line stays absolute — status verification compares +## the registered command against the resolved launcher verbatim.) +static func _build_cli( + client: McpClient, + server_name: String, + server_url: String, + resolved_path: String = "", + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> String: + if client.cli_register_template.is_empty() or client.cli_names.is_empty(): + return "" + var shell_kind := _shell_kind_for_platform() + var short_name: String = String(client.cli_names[0]) + # Prefer the non-.exe form for a cross-platform-looking command line. + for n in client.cli_names: + if not String(n).ends_with(".exe"): + short_name = String(n) + break + var cmd := "" + if client.command_shape != McpClient.CommandShape.NONE: + var launch_error := McpCliStrategy.command_launch_error(client, launch) + if not launch_error.is_empty(): + cmd = "Attach launch command unavailable: %s" % launch_error + else: + var args := McpCliStrategy.format_args(client.cli_register_template, server_name, server_url, launch) + var parts: Array[String] = [short_name] + for arg in args: + parts.append(String(arg)) + var lines := _sweep_lines(client, server_name, server_url, short_name, shell_kind) + lines.append(_render_command_line(parts, shell_kind)) + cmd = _format_shell_block(lines, shell_kind) + _sweep_caveat(client) + else: + var args := McpCliStrategy.format_args(client.cli_register_template, server_name, server_url) + var parts: Array[String] = [short_name] + for arg in args: + parts.append(String(arg)) + var lines := _sweep_lines(client, server_name, server_url, short_name, shell_kind) + lines.append(_render_command_line(parts, shell_kind)) + cmd = _format_shell_block(lines, shell_kind) + _sweep_caveat(client) + # #463: a CLI client with a JSON fallback (Claude Code) may have no `claude` + # binary at all — e.g. installed only as a VS Code/Cursor extension. The CLI + # line above is useless to that user, so also show the config-file edit that + # auto-configure falls back to writing. + if client.has_json_fallback() and not resolved_path.is_empty(): + return "%s\n\nNo `%s` CLI (e.g. installed as a VS Code/Cursor extension)? %s" % [ + cmd, short_name, _build_json(client, server_name, server_url, resolved_path, launch, project_roots), + ] + return cmd + + +## #877: Configure's first act is the pre-cleanup — it runs the unregister +## template once per scope the descriptor can write to (`_cli_strategy.gd` +## `configure`) before registering. Rendering only the register line made this +## hint disagree with what the button does, which is the worst property a +## "run this manually" string can have. The removes go in the SAME shell block +## as the register, in the order Configure runs them, so the whole thing stays +## one copy-paste rather than a labelled command plus loose prose. +static func _sweep_lines( + client: McpClient, + server_name: String, + server_url: String, + short_name: String, + shell_kind: String, +) -> Array[String]: + var lines: Array[String] = [] + if client.cli_unregister_template.is_empty(): + return lines + for pre_scope in McpCliStrategy.cleanup_scopes(client): + var args := McpCliStrategy.format_args( + client.cli_unregister_template, server_name, server_url, {}, pre_scope + ) + var parts: Array[String] = [short_name] + for arg in args: + parts.append(String(arg)) + lines.append(_render_command_line(parts, shell_kind)) + return lines + + +## The one thing the commands themselves cannot show: that the project pass +## resolves `.mcp.json` against the CLI's cwd, so it can delete an entry from a +## repository that has nothing to do with this project. Only for `{scope}` +## descriptors — a single implicit-scope pass removes exactly the entry the +## register is about to rewrite, which needs no warning. Kept outside the shell +## block so pasting the block never picks up prose. +static func _sweep_caveat(client: McpClient) -> String: + if client.cli_unregister_template.is_empty() or not McpCliStrategy.uses_scope_token(client): + return "" + return ( + "\n\nThe project-scope remove rewrites the .mcp.json in the directory the" + + " editor was launched from — not necessarily this project — so it drops a" + + " hand-maintained godot-ai entry there. Other servers in that file are left" + + " alone." + ) + + +static func _shell_kind_for_platform() -> String: + return SHELL_POWERSHELL if OS.get_name() == "Windows" else SHELL_POSIX + + +## Render a command for one explicitly named shell. The label is load-bearing: +## POSIX and PowerShell use different escaping for embedded single quotes, so +## presenting the command without its target shell invites a bad copy/paste. +static func _format_shell_command(parts: Array[String], shell_kind: String) -> String: + return _format_shell_block([_render_command_line(parts, shell_kind)], shell_kind) + + +## One label over N command lines. The label is per-block, not per-line: +## repeating "Run in PowerShell:" four times would bury the single line that +## actually registers. +static func _format_shell_block(lines: Array[String], shell_kind: String) -> String: + var label := "Run in PowerShell:" if shell_kind == SHELL_POWERSHELL else "Run in a POSIX shell:" + return "%s\n%s" % [label, "\n".join(lines)] + + +static func _render_command_line(parts: Array[String], shell_kind: String) -> String: + var rendered: Array[String] = [] + for part in parts: + rendered.append(_shell_display_arg(part, shell_kind)) + return " ".join(rendered) + + +## Quote one argv element for the paste-into-terminal hint. Single-quoted +## strings are literal in both supported shells, but embedded single quotes +## have shell-specific spellings. Backslashes, double quotes, dollar signs, +## and PowerShell backticks remain byte-for-byte unchanged inside the quotes. +static func _shell_display_arg(arg: String, shell_kind: String) -> String: + if arg.is_empty(): + return "''" + var stays_bare := true + for index in range(arg.length()): + if _SHELL_BARE_SAFE_CHARS.find(arg.substr(index, 1)) < 0: + stays_bare = false + break + if stays_bare: + return arg + if shell_kind == SHELL_POWERSHELL: + return "'%s'" % arg.replace("'", "''") + return "'%s'" % arg.replace("'", "'\"'\"'") + + +static func _build_json( + client: McpClient, + server_name: String, + server_url: String, + resolved_path: String, + launch: Dictionary = {}, + project_roots: PackedStringArray = PackedStringArray(), +) -> String: + var target := McpJsonStrategy.manual_target_details(client, server_name, resolved_path, project_roots) + var target_note := "" + if not target.get("ok", false): + target_note = "Target inspection failed: %s" % str(target.get("error", "cannot inspect config")) + target = {"path": resolved_path, "key_path": client.server_key_path} + var target_path := str(target.get("path", resolved_path)) + var key_path: PackedStringArray = target.get("key_path", client.server_key_path) + var key := key_path[0] if key_path.size() > 0 else "mcpServers" + if client.command_shape != McpClient.CommandShape.NONE: + var lines: Array[String] = [] + var launch_error := McpJsonStrategy.command_launch_error(client, launch) + if launch_error.is_empty(): + var command_entry := McpJsonStrategy.build_entry(client, server_url, null, launch) + lines.append("Edit %s and add under \"%s\":" % [target_path, key]) + lines.append(" \"%s\": %s" % [server_name, _format_entry_inline(command_entry)]) + else: + lines.append("Attach launch command unavailable: %s" % launch_error) + if client.command_supports_url_fallback: + lines.append("") + lines.append("Advanced fallback — use this URL-mode entry instead; never configure both shapes together. URL mode depends on your client's own reconnect behavior. If the server is down when the client starts, restarting the client may be required.") + lines.append("Edit %s and add under \"%s\":" % [target_path, key]) + var fallback_entry := McpJsonStrategy.build_url_entry(client, server_url) + lines.append(" \"%s\": %s" % [server_name, _format_entry_inline(fallback_entry)]) + if not target_note.is_empty(): + lines.append("") + lines.append(target_note) + return "\n".join(lines) + var entry := McpJsonStrategy.build_entry(client, server_url) + var instructions := "Edit %s and add under \"%s\":\n \"%s\": %s" % [target_path, key, server_name, _format_entry_inline(entry)] + if not target_note.is_empty(): + instructions += "\n\n" + target_note + return instructions + + +static func _build_toml( + client: McpClient, + _server_name: String, + server_url: String, + resolved_path: String, + launch: Dictionary = {}, +) -> String: + var header := _toml_header(client) + if client.command_shape != McpClient.CommandShape.NONE: + var lines: Array[String] = [] + var rendered := McpTomlStrategy.render_body(client, server_url, launch) + if bool(rendered.get("ok", false)): + lines.append("Edit %s and add:" % resolved_path) + lines.append(" %s" % header) + for body_line in rendered.get("lines", []): + lines.append(" %s" % str(body_line)) + else: + lines.append("Attach launch command unavailable: %s" % str(rendered.get("error", "no compatible launcher found"))) + if client.command_supports_url_fallback: + lines.append("") + lines.append("Advanced fallback — replace the command/args block above with this URL-mode block; never configure both shapes together. URL mode depends on your client's own reconnect behavior. If the server is down when the client starts, restarting the client may be required.") + lines.append("Edit %s and add:" % resolved_path) + lines.append(" %s" % header) + lines.append(" url = %s" % McpTomlStrategy.encode_basic_string(server_url)) + return "\n".join(lines) + var body := McpTomlStrategy.format_body(client.toml_body_template, server_url) + var lines: Array[String] = ["Edit %s and add:" % resolved_path, " %s" % header] + for b in body: + lines.append(" %s" % String(b)) + return "\n".join(lines) + + +static func _build_yaml( + client: McpClient, + server_name: String, + server_url: String, + resolved_path: String, + launch: Dictionary = {}, +) -> String: + var key := client.server_key_path[0] if client.server_key_path.size() > 0 else "mcp_servers" + if client.command_shape != McpClient.CommandShape.NONE: + var lines: Array[String] = [] + var launch_error := McpYamlStrategy.command_launch_error(client, launch) + if launch_error.is_empty(): + var command_entry := McpYamlStrategy.build_entry(client, server_url, null, launch) + lines.append("Edit %s and add under '%s':" % [resolved_path, key]) + for entry_line in McpYamlStrategy.render_entry_lines(server_name, command_entry): + lines.append(String(entry_line)) + else: + lines.append("Attach launch command unavailable: %s" % launch_error) + if client.command_supports_url_fallback: + lines.append("") + lines.append("Advanced fallback — use this URL-mode entry instead; never configure both shapes together. URL mode depends on your client's own reconnect behavior. If the server is down when the client starts, restarting the client may be required.") + lines.append("Edit %s and add under '%s':" % [resolved_path, key]) + var fallback_entry := {client.entry_url_field: server_url} + for entry_line in McpYamlStrategy.render_entry_lines(server_name, fallback_entry): + lines.append(String(entry_line)) + return "\n".join(lines) + var entry := McpYamlStrategy.build_entry(client, server_url) + var lines: Array[String] = [ + "Edit %s and add under '%s':" % [resolved_path, key], + " %s:" % server_name, + ] + for k in entry: + lines.append(" %s: %s" % [k, str(entry[k])]) + return "\n".join(lines) + + +## DeepSeek Harness: the user pastes a loader `insert` row into the home +## patch layer (`$DSH_HOME/cordis.patch.yml`). Auto-configure writes exactly +## these lines, so the manual text matches the file Configure would produce +## byte-for-byte. +static func _build_dsh( + client: McpClient, + server_name: String, + server_url: String, + resolved_path: String, + launch: Dictionary = {}, +) -> String: + var lines: Array[String] = ["Edit %s and add this loader entry (an `insert` row; a plain `- id:` row only overrides an existing bundle id and would be skipped):" % resolved_path] + var entry_id_value := McpDshStrategy.entry_id(server_name) + if client.command_shape != McpClient.CommandShape.NONE: + var launch_error := McpDshStrategy.command_launch_error(client, launch) + if launch_error.is_empty(): + var command_entry := McpDshStrategy.build_entry(client, server_name, server_url, null, launch) + for row_line in McpDshStrategy.render_insert_row(entry_id_value, command_entry): + lines.append(String(row_line)) + else: + lines.append("Attach launch command unavailable: %s" % launch_error) + if client.command_supports_url_fallback: + lines.append("") + ## No command/args block was rendered on the launch-error path, so + ## "replace the block above" would point at nothing. + var fallback_lead := ( + "replace the command/args block above with this URL-mode entry" + if launch_error.is_empty() + else "use this URL-mode entry instead" + ) + lines.append("Advanced fallback — %s; never configure both shapes together. URL mode depends on the harness' own reconnect behavior. If the server is down when the harness starts, restarting the harness may be required." % fallback_lead) + var fallback_entry := McpDshStrategy.build_url_entry(client, server_name, server_url) + for row_line in McpDshStrategy.render_insert_row(entry_id_value, fallback_entry): + lines.append(String(row_line)) + return "\n".join(lines) + var url_entry := McpDshStrategy.build_url_entry(client, server_name, server_url) + for row_line in McpDshStrategy.render_insert_row(entry_id_value, url_entry): + lines.append(String(row_line)) + return "\n".join(lines) + + +## Mirrors the [section."name"] header `_toml_strategy._primary_header` +## emits, kept here so the manual-command text matches the file we'd write. +static func _toml_header(client: McpClient) -> String: + var parts := client.toml_section_path + if parts.size() < 2: + return "[%s]" % ".".join(parts) + var section := ".".join(McpClient._array_from_packed(McpClient._packed_slice(parts, 0, parts.size() - 1))) + var name := parts[parts.size() - 1] + return "[%s.\"%s\"]" % [section, name] + + +## Format an entry dict as a single inline JSON-ish string, matching the +## pre-refactor manual-command style: `{ "k": v, "k": v }` with spaces. +## Pre-existing manual-command tests assert the exact substring shape; this +## keeps them stable. +## +## Uses `JSON.stringify` for every leaf String (key OR value) so paths +## containing backslashes / quotes / newlines render as syntactically valid +## JSON. A Windows uvx path like `C:\Users\foo\uvx.exe` would otherwise be +## emitted as `"C:\Users\foo\uvx.exe"` — invalid JSON, unsafe to paste. +static func _format_entry_inline(entry: Dictionary) -> String: + var parts: Array[String] = [] + for k in entry: + parts.append("%s: %s" % [JSON.stringify(String(k)), _format_value(entry[k])]) + if parts.is_empty(): + return "{}" + return "{ %s }" % ", ".join(parts) + + +static func _format_value(value: Variant) -> String: + # Strings, bools, numbers, null all round-trip correctly through JSON.stringify + # without spurious quoting of non-string scalars (true → `true`, 5 → `5`). + # Arrays and Dictionaries are formatted manually so the inline ` { k: v } ` + # spacing matches the pre-refactor manual-command output shape that tests + # pin with assert_contains. + if value is Array: + var arr_parts: Array[String] = [] + for v in value: + arr_parts.append(_format_value(v)) + return "[%s]" % ", ".join(arr_parts) + if value is Dictionary: + var d_parts: Array[String] = [] + for k in value: + d_parts.append("%s: %s" % [JSON.stringify(String(k)), _format_value(value[k])]) + if d_parts.is_empty(): + return "{}" + return "{ %s }" % ", ".join(d_parts) + return JSON.stringify(value) diff --git a/addons/godot_ai/clients/_manual_command.gd.uid b/addons/godot_ai/clients/_manual_command.gd.uid new file mode 100644 index 0000000..07a96f4 --- /dev/null +++ b/addons/godot_ai/clients/_manual_command.gd.uid @@ -0,0 +1 @@ +uid://ct1wmgfk408x0 diff --git a/addons/godot_ai/clients/_path_template.gd b/addons/godot_ai/clients/_path_template.gd new file mode 100644 index 0000000..8fc9753 --- /dev/null +++ b/addons/godot_ai/clients/_path_template.gd @@ -0,0 +1,242 @@ +@tool +class_name McpPathTemplate +extends RefCounted + +## Expands ~ / $HOME / $APPDATA / $XDG_CONFIG_HOME / $LOCALAPPDATA / $USERPROFILE +## inside path templates so per-client descriptors can declare paths declaratively +## without hand-rolling per-OS lookups. + +## #691: dock worker threads (client-status refresh, configure/remove +## actions) and the #678 startup walk's discovery worker expand these +## templates off the main thread, while the spawn step mutates the +## process-global environment around `OS.create_process` +## (`GODOT_AI_OWNER_PID`, `GODOT_AI_PLUGIN_SPAWNED`, `PYTHONPATH`, +## `GODOT_AI_DISABLE_TELEMETRY`). A glibc `getenv` racing a concurrent +## `setenv` can return a freed pointer — rare but process-fatal. All env +## reads in this layer therefore go through `env_lookup`: on the MAIN +## thread it reads live and refreshes a mutex-guarded snapshot; off the +## main thread it serves from the snapshot, so no `OS.get_environment` +## runs concurrently with the spawn window's mutations. Callers pre-warm +## every var their workers can touch via `warm_env_snapshot` (plugin +## `_enter_tree` and the dock's phase-1 refresh prep, both main-thread, +## both before any worker starts). +static var _env_snapshot := {} +static var _env_snapshot_mutex := Mutex.new() + +## Every var this layer and its sibling consumers (`_base.gd` +## `config_file_override_details`, `config_home_override_details`, `_cli_finder.gd` lookups, +## `client_configurator.gd` mode/trace reads) can touch off-main. +## Descriptor-declared config-file/config-home env names are passed as extras +## by the warm callers. +const _BASE_ENV_VARS: Array[String] = [ + "HOME", + "USERPROFILE", + "XDG_CONFIG_HOME", + "APPDATA", + "LOCALAPPDATA", + "SHELL", + "ProgramFiles", + "GODOT_AI_MODE", + "GODOT_AI_STARTUP_TRACE", + ## #804 (#752 adoption): _find_venv_python reads this via env_lookup on + ## the dock's worker path; without pre-warming, a set override reads as + ## empty there and is silently ignored — the exact misconfiguration the + ## push_warning in client_configurator.gd exists to surface. + "GODOT_AI_VENV_PYTHON", +] + + +## Thread-safe env read (#691). Main thread: live read + snapshot refresh. +## Worker thread: snapshot only, so it can never race a main-thread +## setenv/unsetenv. A worker read of a never-warmed var returns "" — the +## same value an unset var reads as — never a live OS.get_environment, +## which would reintroduce the race for exactly the vars nobody thought +## to warm. Missing warm-up degrades resolution; it must not touch the +## process-global environment off-main. +static func env_lookup(name: String) -> String: + if OS.get_thread_caller_id() == OS.get_main_thread_id(): + var live := OS.get_environment(name) + _env_snapshot_mutex.lock() + _env_snapshot[name] = live + _env_snapshot_mutex.unlock() + return live + _env_snapshot_mutex.lock() + var cached: Variant = _env_snapshot.get(name, null) + _env_snapshot_mutex.unlock() + if cached != null: + return str(cached) + return "" + + +## Main-thread pre-warm so subsequent worker reads never touch the real +## environment. Idempotent; safe to call before every worker dispatch. +static func warm_env_snapshot(extra_vars: PackedStringArray = PackedStringArray()) -> void: + for var_name in _BASE_ENV_VARS: + env_lookup(var_name) + for var_name in extra_vars: + if not String(var_name).is_empty(): + env_lookup(String(var_name)) + + +## Pick the right entry from a {"darwin": ..., "windows": ..., "linux": ...} map. +static func resolve(template_map: Dictionary) -> String: + var key := platform_key(template_map) + if key.is_empty(): + return "" + var template: String = template_map[key] + return expand(template) + + +## Return the platform-specific key present in a descriptor map. `unix` is a +## shorthand for macOS and Linux. Public so descriptors can use the same +## platform selection for ordered path-candidate arrays as for one path. +static func platform_key(template_map: Dictionary) -> String: + var key := _os_key() + if template_map.has(key): + return key + if (key == "darwin" or key == "linux") and template_map.has("unix"): + return "unix" + return "" + + +## Expand one path template into zero or more concrete paths. A single `*` is +## allowed inside one DIRECTORY segment (for example `Packages/Claude_*`). The +## wildcard is resolved by enumerating that segment's parent; the remaining +## suffix may name a file that does not exist yet, which lets callers derive a +## deterministic create target for a fresh packaged-app install. +## +## Multiple wildcards fail closed and return no candidates. A wildcard final +## segment may identify an installation directory for `detect_paths`. Returned +## paths are sorted for deterministic tests and diagnostics; callers still +## reject ambiguous config groups rather than picking one. +static func expand_path_candidates(template: String) -> PackedStringArray: + var expanded := expand(template) + if expanded.is_empty(): + return PackedStringArray() + var star := expanded.find("*") + if star < 0: + return PackedStringArray([expanded]) + if expanded.find("*", star + 1) >= 0: + return PackedStringArray() + + var slash_before := maxi(expanded.rfind("/", star), expanded.rfind("\\", star)) + var forward_after := expanded.find("/", star) + var backward_after := expanded.find("\\", star) + var slash_after := forward_after + if slash_after < 0 or (backward_after >= 0 and backward_after < slash_after): + slash_after = backward_after + if slash_before < 0: + return PackedStringArray() + + var parent := expanded.substr(0, slash_before) + var pattern := ( + expanded.substr(slash_before + 1) + if slash_after < 0 + else expanded.substr(slash_before + 1, slash_after - slash_before - 1) + ) + var suffix := "" if slash_after < 0 else expanded.substr(slash_after + 1) + var pattern_star := pattern.find("*") + if pattern_star < 0: + return PackedStringArray() + var prefix := pattern.substr(0, pattern_star) + var ending := pattern.substr(pattern_star + 1) + var dir := DirAccess.open(parent) + if dir == null: + return PackedStringArray() + + var matches := PackedStringArray() + for child in dir.get_directories(): + if _wildcard_segment_matches(String(child), prefix, ending): + var matched_path := parent.path_join(String(child)) + matches.append(matched_path if suffix.is_empty() else matched_path.path_join(suffix)) + matches.sort() + return matches + + +## Substitute env vars and ~ in a single template string. +## +## A token that cannot be resolved — the var is unset and no home-derived +## fallback applies, or a dock worker's env snapshot was never warmed with it — +## is LEFT IN PLACE rather than replaced with "". Substituting "" is what turns +## `$USERPROFILE/godot` into `/godot`: a root-relative path that +## `is_absolute_path()` accepts, so every fail-closed guard downstream waves it +## through and the caller reads or writes a directory the user never named. +## `$USERPROFILE` is the easy repro (unset off Windows, and the only one of +## these vars with no fallback), but `$HOME`/`$XDG_CONFIG_HOME`/`$APPDATA`/ +## `$LOCALAPPDATA` reach the same state whenever `_home()` is empty, which the +## missing-warm-up degradation above makes reachable on a worker thread. +## +## The surviving token keeps the result non-absolute, so those guards catch it, +## and the unexpanded path they report still shows what failed to resolve. +## `~` is left alone for the same reason: collapsing `~/godot` to the relative +## `godot` aims it at the editor's own working directory. +static func expand(template: String) -> String: + if template.is_empty(): + return "" + var out := template + if out.begins_with("~/") or out == "~": + var home := _home() + if not home.is_empty(): + out = home if out == "~" else home.path_join(out.substr(2)) + # $HOME, $APPDATA, $LOCALAPPDATA, $USERPROFILE, $XDG_CONFIG_HOME + for var_name in ["XDG_CONFIG_HOME", "LOCALAPPDATA", "USERPROFILE", "APPDATA", "HOME"]: + var token := "$%s" % var_name + if out.find(token) < 0: + continue + var value := env_lookup(var_name) + if value.is_empty(): + value = _home_fallback(var_name) + if value.is_empty(): + continue + out = out.replace(token, value) + return out + + +## Home-derived default for a var the environment does not define. Returns "" +## when home itself is unresolvable so `expand` leaves the token alone: rooting +## these at an empty home yields a RELATIVE path, not an absent one — +## `"".path_join(".config")` is `.config`, which reads against the editor's +## working directory rather than the user's config dir. `USERPROFILE` has no +## fallback (it is the thing `_home()` itself falls back to). +static func _home_fallback(var_name: String) -> String: + var home := _home() + if home.is_empty(): + return "" + match var_name: + "XDG_CONFIG_HOME": + return home.path_join(".config") + "APPDATA": + return home.path_join("AppData/Roaming") + "LOCALAPPDATA": + return home.path_join("AppData/Local") + "HOME": + return home + return "" + + +static func _os_key() -> String: + match OS.get_name(): + "macOS": + return "darwin" + "Windows": + return "windows" + _: + return "linux" + + +static func _wildcard_segment_matches(value: String, prefix: String, ending: String) -> bool: + # Prefix/suffix tests alone allow the two fixed portions to overlap inside a + # too-short value. Glob semantics require room for both portions even when + # `*` matches an empty string. + if value.length() < prefix.length() + ending.length(): + return false + if OS.get_name() == "Windows": + return value.to_lower().begins_with(prefix.to_lower()) and value.to_lower().ends_with(ending.to_lower()) + return value.begins_with(prefix) and value.ends_with(ending) + + +static func _home() -> String: + var h := env_lookup("HOME") + if h.is_empty(): + h = env_lookup("USERPROFILE") + return h diff --git a/addons/godot_ai/clients/_path_template.gd.uid b/addons/godot_ai/clients/_path_template.gd.uid new file mode 100644 index 0000000..f2403d7 --- /dev/null +++ b/addons/godot_ai/clients/_path_template.gd.uid @@ -0,0 +1 @@ +uid://5pd418va35ms diff --git a/addons/godot_ai/clients/_registry.gd b/addons/godot_ai/clients/_registry.gd new file mode 100644 index 0000000..f61f667 --- /dev/null +++ b/addons/godot_ai/clients/_registry.gd @@ -0,0 +1,156 @@ +@tool +class_name McpClientRegistry +extends RefCounted + +## Central enumeration of every supported MCP client. Adding a new client +## means: drop a file in clients/, then append one path below. +## +## Paths, not preloads (#736): a preload array pulled all client descriptor +## scripts into the boot-time compile closure of everything that preloads +## this registry (plugin.gd via client_configurator.gd and mcp_dock.gd), +## stalling "Initializing plugins" on every editor boot. Descriptors are +## only needed when the dock refreshes client statuses or a client_* +## command runs, so they load lazily on first registry access. + +const _CLIENT_SCRIPT_PATHS := [ + "res://addons/godot_ai/clients/claude_code.gd", + "res://addons/godot_ai/clients/claude_desktop.gd", + "res://addons/godot_ai/clients/codex.gd", + "res://addons/godot_ai/clients/grok.gd", + "res://addons/godot_ai/clients/antigravity.gd", + "res://addons/godot_ai/clients/cursor.gd", + "res://addons/godot_ai/clients/windsurf.gd", + "res://addons/godot_ai/clients/vscode.gd", + "res://addons/godot_ai/clients/vscode_insiders.gd", + "res://addons/godot_ai/clients/zed.gd", + "res://addons/godot_ai/clients/gemini_cli.gd", + "res://addons/godot_ai/clients/cline.gd", + "res://addons/godot_ai/clients/kilo_code.gd", + "res://addons/godot_ai/clients/roo_code.gd", + "res://addons/godot_ai/clients/zoo_code.gd", + "res://addons/godot_ai/clients/kiro.gd", + "res://addons/godot_ai/clients/trae.gd", + "res://addons/godot_ai/clients/cherry_studio.gd", + "res://addons/godot_ai/clients/opencode.gd", + "res://addons/godot_ai/clients/qwen_code.gd", + "res://addons/godot_ai/clients/kimi_code.gd", + "res://addons/godot_ai/clients/hermes.gd", + "res://addons/godot_ai/clients/pi.gd", + "res://addons/godot_ai/clients/deepseek_harness.gd", +] + +static var _instances: Array[McpClient] = [] +static var _by_id: Dictionary = {} +## First registry access can come from the dock's client-status refresh +## worker thread while the main thread hits it via a client_* command — +## serialize the one-time load so a racing thread can never observe a +## half-built registry. load() itself is thread-safe via ResourceLoader. +static var _load_mutex := Mutex.new() +## True when even a fresh rebuild yields instances missing base-schema +## fields — the deep stale-script state after an in-session self-update +## (#850; docs/releasing.md release-shape rules). Only an editor restart +## heals it; callers surface RESTART_TO_FINISH_UPDATE instead of erroring +## per client. Never reset within a session: rebuilding again cannot help, +## it would only repeat the load work and warning on every dock sweep. +static var _stale_session := false + +const RESTART_TO_FINISH_UPDATE := ( + "Godot AI was updated in this editor session. Restart the editor to finish the update." +) + + +static func all() -> Array[McpClient]: + _ensure_loaded() + return _instances + + +static func get_by_id(id: String) -> McpClient: + _ensure_loaded() + return _by_id.get(id, null) + + +static func ids() -> PackedStringArray: + var out := PackedStringArray() + for c in all(): + out.append(c.id) + return out + + +static func has_id(id: String) -> bool: + _ensure_loaded() + return _by_id.has(id) + + +## True when this editor session is running a self-update whose script +## reloads left descriptor state unusable. Client operations short-circuit +## with RESTART_TO_FINISH_UPDATE rather than spamming per-field errors. +static func stale_session_detected() -> bool: + _ensure_loaded() + return _stale_session + + +## An instance is coherent when fields added to the CURRENT McpClient schema +## read back with their declared types. After an in-session self-update, +## hot-patched or pre-update instances answer Nil for vars the update added +## (#850: `config_path_candidates` and +## `config_file_env` read as Nil, crashing platform_key / String()). The +## reflected `get()` avoids typed-access errors on such instances. +static func _instance_is_coherent(inst: Object) -> bool: + if inst == null: + return false + return ( + inst.get("config_path_candidates") is Dictionary + and inst.get("config_file_env") is String + and inst.get("path_template") is Dictionary + and inst.get("server_key_path_aliases") is Array + and inst.get("config_merge_path_templates") is Dictionary + and inst.get("config_merge_project_paths") is PackedStringArray + ) + + +static func _cache_is_coherent() -> bool: + return not _instances.is_empty() and _instance_is_coherent(_instances[0]) + + +static func _ensure_loaded() -> void: + if _stale_session: + return + if _cache_is_coherent(): + return + _load_mutex.lock() + ## Re-check under the lock: another thread may have rebuilt (or concluded + ## staleness) while this one waited. + if not _stale_session and not _cache_is_coherent(): + ## Covers both the first load and the post-self-update rebuild: this + ## registry file can survive an update unchanged, so its statics keep + ## serving pre-update instances to freshly reloaded callers. A rebuild + ## instantiates from the reloaded descriptor scripts, which repairs + ## every case except a stale base Script object itself. + _load() + if not _instances.is_empty() and not _cache_is_coherent(): + _stale_session = true + push_warning("MCP | %s" % RESTART_TO_FINISH_UPDATE) + _load_mutex.unlock() + + +static func _load() -> void: + ## Build into locals and publish whole containers last, so the lock-free + ## fast path in _ensure_loaded can never see a partially-filled registry. + var instances: Array[McpClient] = [] + var by_id: Dictionary = {} + for path in _CLIENT_SCRIPT_PATHS: + var script := load(path) as GDScript + if script == null: + push_warning("MCP | failed to load client descriptor %s" % path) + continue + var inst: McpClient = script.new() + if inst.id.is_empty(): + push_warning("MCP | client descriptor %s has empty id" % path) + continue + if by_id.has(inst.id): + push_warning("MCP | duplicate client id: %s" % inst.id) + continue + instances.append(inst) + by_id[inst.id] = inst + _by_id = by_id + _instances = instances diff --git a/addons/godot_ai/clients/_registry.gd.uid b/addons/godot_ai/clients/_registry.gd.uid new file mode 100644 index 0000000..57edcf7 --- /dev/null +++ b/addons/godot_ai/clients/_registry.gd.uid @@ -0,0 +1 @@ +uid://bxougoq8xwg1 diff --git a/addons/godot_ai/clients/_toml_strategy.gd b/addons/godot_ai/clients/_toml_strategy.gd new file mode 100644 index 0000000..a929dbd --- /dev/null +++ b/addons/godot_ai/clients/_toml_strategy.gd @@ -0,0 +1,730 @@ +@tool +class_name McpTomlStrategy +extends RefCounted + +## TOML upsert for URL entries and client-owned command entries. +## +## This remains deliberately smaller than a general TOML parser, but the +## parts that affect migration are semantic: assignments retain their whole +## value span (including multiline arrays/strings), and command/args status +## verification decodes TOML strings and arrays rather than comparing text. + + +static func configure( + client: McpClient, + _server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty(): + return {"status": "error", "message": "Could not resolve config path for %s" % client.display_name} + + var seed_path := str(resolution.get("seed_path", "")) + var read_path := seed_path if not FileAccess.file_exists(path) and not seed_path.is_empty() else path + var read := _read_or_init(read_path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to overwrite %s: %s. Fix or move the file, then re-run Configure." % [read_path, read["error"]]} + + var rendered := render_body(client, server_url, launch) + if not bool(rendered.get("ok", false)): + return {"status": "error", "message": str(rendered.get("error", "Could not build the TOML entry."))} + + var lines: Array[String] = _split_lines(String(read["data"])) + var body: Array[String] = rendered["lines"] + var pinned_keys: Dictionary = rendered["pinned_keys"] + var initial_keys: Dictionary = rendered["initial_keys"] + var removed_keys: Dictionary = rendered["removed_keys"] + + var section := _find_section(lines, _all_headers(client)) + var header := _primary_header(client) + var new_lines: Array[String] = [header] + + if section.is_empty(): + new_lines.append_array(body) + var output_fresh: Array[String] = [] + output_fresh.append_array(lines) + if not output_fresh.is_empty() and not output_fresh[-1].strip_edges().is_empty(): + output_fresh.append("") + output_fresh.append_array(new_lines) + if not McpAtomicWrite.write(path, "\n".join(output_fresh)): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + + var old_items := _value_items(lines, int(section["start"]) + 1, int(section["end"])) + var old_by_key := {} + for item in old_items: + var old_key := str(item.get("key", "")) + if not old_key.is_empty() and not old_by_key.has(old_key): + old_by_key[old_key] = item + + var body_items := _value_items(body, 0, body.size()) + var emitted_keys := {} + for item in body_items: + var key := str(item.get("key", "")) + if key.is_empty(): + new_lines.append_array(item["lines"]) + continue + emitted_keys[key] = true + if initial_keys.has(key) and old_by_key.has(key): + new_lines.append_array(old_by_key[key]["lines"]) + else: + ## Pinned keys always use the freshly rendered span. A generated key + ## that is neither pinned nor initial is also rendered deterministically. + new_lines.append_array(item["lines"]) + + ## Carry unknown/user-owned assignments and standalone comments verbatim. + ## Whole item spans prevent multiline arrays/strings from being truncated. + for item in old_items: + var key := str(item.get("key", "")) + if not key.is_empty(): + if emitted_keys.has(key) or pinned_keys.has(key) or removed_keys.has(key): + continue + new_lines.append_array(item["lines"]) + continue + var item_lines: Array = item.get("lines", []) + for line in item_lines: + if not str(line).strip_edges().is_empty(): + new_lines.append(str(line)) + + var output: Array[String] = [] + output.append_array(_slice(lines, 0, int(section["start"]))) + output.append_array(new_lines) + output.append_array(_slice(lines, int(section["end"]), lines.size())) + output = _rewrite_legacy_descendant_headers(output, client) + + if not McpAtomicWrite.write(path, "\n".join(output)): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + + +static func check_status( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> McpClient.Status: + return check_status_details(client, server_name, server_url, launch).get("status", McpClient.Status.NOT_CONFIGURED) + + +static func check_status_details( + client: McpClient, + _server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var read := _read_or_init(path) + if not read["ok"]: + return {"status": McpClient.Status.ERROR, "error_msg": String(read["error"])} + var lines: Array[String] = _split_lines(String(read["data"])) + var section := _find_section(lines, _all_headers(client)) + if section.is_empty(): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + + var items := _value_items(lines, int(section["start"]) + 1, int(section["end"])) + var by_key := {} + for item in items: + var key := str(item.get("key", "")) + if not key.is_empty() and not by_key.has(key): + by_key[key] = item + + if client.command_shape != McpClient.CommandShape.NONE: + if not bool(launch.get("ok", false)): + return { + "status": McpClient.Status.ERROR, + "error_msg": str(launch.get("error", "No compatible attach launcher was found.")), + } + for legacy_key in client.command_legacy_keys: + if by_key.has(String(legacy_key)): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + if not by_key.has("command") or not by_key.has("args"): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + var command_value := _decode_toml_string(_item_value(by_key["command"])) + var args_value := _decode_toml_string_array(_item_value(by_key["args"])) + if not bool(command_value.get("ok", false)) or not bool(args_value.get("ok", false)): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + if str(command_value.get("value", "")) != str(launch.get("command", "")): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + if not _string_arrays_equal(args_value.get("value", []), launch.get("args", [])): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + if not client.command_transport_key.is_empty(): + var transport_key := client.command_transport_key + if not by_key.has(transport_key): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + var decoded_transport := _decode_toml_scalar(_item_value(by_key[transport_key])) + if not bool(decoded_transport.get("ok", false)) or decoded_transport.get("value") != client.command_transport_value: + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + + if not by_key.has("url"): + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + var url_value := _decode_toml_string(_item_value(by_key["url"])) + if not bool(url_value.get("ok", false)) or str(url_value.get("value", "")) != server_url: + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + + +static func remove(client: McpClient, _server_name: String) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": "ok", "message": "Not configured"} + var read := _read_or_init(path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to rewrite %s: %s." % [path, read["error"]]} + var lines: Array[String] = _split_lines(String(read["data"])) + var headers := _all_headers(client) + var subtable_prefixes := _subtable_prefixes(headers) + + var output: Array[String] = [] + var i := 0 + while i < lines.size(): + if _matches_any_header(lines[i], headers) or _matches_subtable_prefix(lines[i], subtable_prefixes): + i += 1 + while i < lines.size() and not _is_any_section_header(lines[i]): + i += 1 + continue + output.append(lines[i]) + i += 1 + + if not McpAtomicWrite.write(path, "\n".join(output)): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + + +## Substitute `{url}` in every legacy URL body-template line. +static func format_body(template: PackedStringArray, server_url: String) -> PackedStringArray: + var out := PackedStringArray() + for line in template: + out.append(String(line).replace("{url}", server_url)) + return out + + +## Encode a TOML basic string. This is intentionally public for the +## cross-language fixture test that parses the rendered sample with tomllib. +static func encode_basic_string(value: String) -> String: + return '"%s"' % value.replace("\\", "\\\\").replace('"', '\\"').replace("\b", "\\b").replace("\t", "\\t").replace("\n", "\\n").replace("\f", "\\f").replace("\r", "\\r") + + +## Multi-line string-array encoding used by command-shape entries. +static func encode_string_array(values: Variant) -> Array[String]: + var out: Array[String] = ["["] + for value in values: + out.append(" %s," % encode_basic_string(str(value))) + out.append("]") + return out + + +static func render_body(client: McpClient, server_url: String, launch: Dictionary) -> Dictionary: + if client.command_shape == McpClient.CommandShape.NONE: + if client.toml_body_template.is_empty(): + return {"ok": false, "error": "%s descriptor missing toml_body_template" % client.display_name} + var legacy_body := format_body(client.toml_body_template, server_url) + var legacy_lines: Array[String] = [] + var pinned := {} + var initial := {} + for idx in range(legacy_body.size()): + legacy_lines.append(String(legacy_body[idx])) + var key := _line_key(String(client.toml_body_template[idx])) + if key.is_empty(): + continue + if String(client.toml_body_template[idx]).contains("{url}"): + pinned[key] = true + else: + initial[key] = true + return { + "ok": true, + "lines": legacy_lines, + "pinned_keys": pinned, + "initial_keys": initial, + "removed_keys": {}, + } + + if client.command_shape != McpClient.CommandShape.COMMAND_ARRAY: + return {"ok": false, "error": "%s uses a command shape not supported by TOML yet" % client.display_name} + if not bool(launch.get("ok", false)): + return {"ok": false, "error": str(launch.get("error", "No compatible attach launcher was found."))} + + var command_lines: Array[String] = [ + "command = %s" % encode_basic_string(str(launch.get("command", ""))), + ] + command_lines.append_array(_encode_assignment("args", launch.get("args", []))) + + var pinned_keys := {"command": true, "args": true} + if not client.command_transport_key.is_empty(): + var encoded_transport := _encode_scalar(client.command_transport_value) + if encoded_transport.is_empty(): + return { + "ok": false, + "error": "Unsupported TOML transport `%s` for %s" % [ + client.command_transport_key, client.display_name, + ], + } + command_lines.append("%s = %s" % [client.command_transport_key, encoded_transport]) + pinned_keys[client.command_transport_key] = true + + var initial_keys := {} + for key in client.command_initial_fields: + var encoded := _encode_assignment(str(key), client.command_initial_fields[key]) + if encoded.is_empty(): + return {"ok": false, "error": "Unsupported TOML default `%s` for %s" % [key, client.display_name]} + command_lines.append_array(encoded) + initial_keys[str(key)] = true + + var removed_keys := {} + for key in client.command_legacy_keys: + removed_keys[String(key)] = true + return { + "ok": true, + "lines": command_lines, + "pinned_keys": pinned_keys, + "initial_keys": initial_keys, + "removed_keys": removed_keys, + } + + +static func _encode_assignment(key: String, value: Variant) -> Array[String]: + if value is Array or value is PackedStringArray: + var lines := encode_string_array(value) + lines[0] = "%s = %s" % [key, lines[0]] + return lines + var encoded := _encode_scalar(value) + var lines: Array[String] = [] + if not encoded.is_empty(): + lines.append("%s = %s" % [key, encoded]) + return lines + + +static func _encode_scalar(value: Variant) -> String: + if value is String: + return encode_basic_string(value) + if value is bool: + return "true" if value else "false" + if value is int or value is float: + return str(value) + return "" + + +# --- span-aware merge helpers ------------------------------------------- + +static func _value_items(lines: Array[String], from: int, to: int) -> Array[Dictionary]: + var out: Array[Dictionary] = [] + var i := from + while i < to: + var key := _line_key(lines[i]) + if key.is_empty(): + out.append({"key": "", "lines": [lines[i]]}) + i += 1 + continue + var end := _value_span_end(lines, i, to) + out.append({"key": key, "lines": _slice(lines, i, end)}) + i = end + return out + + +static func _value_span_end(lines: Array[String], start: int, limit: int) -> int: + var state := {"quote": "", "square": 0, "curly": 0, "escaped": false} + for i in range(start, limit): + var begin := 0 + if i == start: + var eq := _assignment_equal(lines[i]) + begin = eq + 1 if eq >= 0 else 0 + _scan_toml_value_line(lines[i], begin, state) + if str(state["quote"]).is_empty() and int(state["square"]) == 0 and int(state["curly"]) == 0: + return i + 1 + return limit + + +static func _scan_toml_value_line(line: String, begin: int, state: Dictionary) -> void: + var i := begin + while i < line.length(): + var quote := str(state["quote"]) + if quote == '"""' or quote == "'''": + if line.substr(i).begins_with(quote): + state["quote"] = "" + i += 3 + continue + if quote == '"""' and line.unicode_at(i) == 92 and not bool(state["escaped"]): + state["escaped"] = true + i += 1 + continue + state["escaped"] = false + i += 1 + continue + if quote == '"' or quote == "'": + var c := line.unicode_at(i) + if quote == '"' and c == 92 and not bool(state["escaped"]): + state["escaped"] = true + i += 1 + continue + if c == quote.unicode_at(0) and not bool(state["escaped"]): + state["quote"] = "" + state["escaped"] = false + i += 1 + continue + + if line.substr(i).begins_with('"""'): + state["quote"] = '"""' + i += 3 + continue + if line.substr(i).begins_with("'''"): + state["quote"] = "'''" + i += 3 + continue + var c := line.unicode_at(i) + if c == 34: + state["quote"] = '"' + elif c == 39: + state["quote"] = "'" + elif c == 35: + break + elif c == 91: + state["square"] = int(state["square"]) + 1 + elif c == 93: + state["square"] = maxi(0, int(state["square"]) - 1) + elif c == 123: + state["curly"] = int(state["curly"]) + 1 + elif c == 125: + state["curly"] = maxi(0, int(state["curly"]) - 1) + i += 1 + + +static func _line_key(line: String) -> String: + var eq := _assignment_equal(line) + if eq <= 0: + return "" + return line.substr(0, eq).strip_edges() + + +static func _assignment_equal(line: String) -> int: + var quote := 0 + var escaped := false + for i in range(line.length()): + var c := line.unicode_at(i) + if quote != 0: + if quote == 34 and c == 92 and not escaped: + escaped = true + continue + if c == quote and not escaped: + quote = 0 + escaped = false + continue + if c == 34 or c == 39: + quote = c + elif c == 35: + return -1 + elif c == 61: + return i + return -1 + + +# --- semantic value decoding -------------------------------------------- + +static func _item_value(item: Dictionary) -> String: + var item_lines: Array = item.get("lines", []) + if item_lines.is_empty(): + return "" + var first := str(item_lines[0]) + var eq := _assignment_equal(first) + if eq < 0: + return "" + var parts: Array[String] = [first.substr(eq + 1)] + for i in range(1, item_lines.size()): + parts.append(str(item_lines[i])) + return "\n".join(parts) + + +static func _decode_toml_scalar(raw: String) -> Dictionary: + var cleaned := _without_comments(raw).strip_edges() + if cleaned == "true": + return {"ok": true, "value": true} + if cleaned == "false": + return {"ok": true, "value": false} + var string_value := _decode_toml_string(cleaned) + if bool(string_value.get("ok", false)): + return string_value + if cleaned.is_valid_int(): + return {"ok": true, "value": cleaned.to_int()} + if cleaned.is_valid_float(): + return {"ok": true, "value": cleaned.to_float()} + return {"ok": false} + + +static func _decode_toml_string(raw: String) -> Dictionary: + var cleaned := _without_comments(raw).strip_edges() + if cleaned.length() >= 2 and cleaned.begins_with("'") and cleaned.ends_with("'"): + return {"ok": true, "value": cleaned.substr(1, cleaned.length() - 2)} + if cleaned.length() < 2 or not cleaned.begins_with('"') or not cleaned.ends_with('"'): + return {"ok": false} + var parsed: Variant = JSON.parse_string(cleaned) + if parsed is String: + return {"ok": true, "value": parsed} + return {"ok": false} + + +static func _decode_toml_string_array(raw: String) -> Dictionary: + var cleaned := _without_comments(raw).strip_edges() + if not cleaned.begins_with("["): + return {"ok": false} + var i := 1 + var values: Array[String] = [] + while true: + i = _skip_space(cleaned, i) + if i >= cleaned.length(): + return {"ok": false} + if cleaned.unicode_at(i) == 93: + i = _skip_space(cleaned, i + 1) + return {"ok": i == cleaned.length(), "value": values} + var parsed := _parse_string_at(cleaned, i) + if not bool(parsed.get("ok", false)): + return {"ok": false} + values.append(str(parsed.get("value", ""))) + i = _skip_space(cleaned, int(parsed.get("next", i))) + if i >= cleaned.length(): + return {"ok": false} + var c := cleaned.unicode_at(i) + if c == 44: + i += 1 + continue + if c == 93: + continue + return {"ok": false} + return {"ok": false} # Unreachable; keeps GDScript's return analysis explicit. + + +static func _parse_string_at(text: String, start: int) -> Dictionary: + if start >= text.length(): + return {"ok": false} + var quote := text.unicode_at(start) + if quote != 34 and quote != 39: + return {"ok": false} + var i := start + 1 + var escaped := false + while i < text.length(): + var c := text.unicode_at(i) + if quote == 34 and c == 92 and not escaped: + escaped = true + i += 1 + continue + if c == quote and not escaped: + var raw := text.substr(start, i - start + 1) + if quote == 39: + return {"ok": true, "value": raw.substr(1, raw.length() - 2), "next": i + 1} + var parsed: Variant = JSON.parse_string(raw) + if parsed is String: + return {"ok": true, "value": parsed, "next": i + 1} + return {"ok": false} + escaped = false + i += 1 + return {"ok": false} + + +static func _without_comments(raw: String) -> String: + var out: Array[String] = [] + for line in raw.split("\n"): + var quote := 0 + var escaped := false + var kept := "" + for i in range(line.length()): + var c := line.unicode_at(i) + if quote != 0: + kept += line.substr(i, 1) + if quote == 34 and c == 92 and not escaped: + escaped = true + continue + if c == quote and not escaped: + quote = 0 + escaped = false + continue + if c == 34 or c == 39: + quote = c + kept += line.substr(i, 1) + elif c == 35: + break + else: + kept += line.substr(i, 1) + out.append(kept) + return "\n".join(out) + + +static func _skip_space(text: String, start: int) -> int: + var i := start + while i < text.length() and text.substr(i, 1) in [" ", "\t", "\r", "\n"]: + i += 1 + return i + + +static func _string_arrays_equal(left: Variant, right: Variant) -> bool: + if not (left is Array or left is PackedStringArray): + return false + if not (right is Array or right is PackedStringArray): + return false + if left.size() != right.size(): + return false + for i in range(left.size()): + if str(left[i]) != str(right[i]): + return false + return true + + +# --- file / section helpers --------------------------------------------- + +static func _read_or_init(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {"ok": true, "data": ""} + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + var err := FileAccess.get_open_error() + return {"ok": false, "error": "could not open for reading (error %d)" % err} + var text := f.get_as_text() + f.close() + return {"ok": true, "data": text} + + +static func _split_lines(content: String) -> Array[String]: + var out: Array[String] = [] + for line in content.split("\n"): + out.append(line) + return out + + +static func _slice(lines: Array[String], from: int, to: int) -> Array[String]: + var out: Array[String] = [] + for i in range(from, to): + out.append(lines[i]) + return out + + +static func _primary_header(client: McpClient) -> String: + var parts := client.toml_section_path + if parts.size() < 2: + return "[%s]" % ".".join(parts) + var section := ".".join(McpClient._packed_slice(parts, 0, parts.size() - 1)) + var name := parts[parts.size() - 1] + return "[%s.\"%s\"]" % [section, name] + + +static func _all_headers(client: McpClient) -> Array[String]: + var primary := _primary_header(client) + var out: Array[String] = [primary] + var bare := _bare_key_header(client) + if not bare.is_empty() and bare != primary: + out.append(bare) + for legacy in client.toml_legacy_section_aliases: + out.append("[%s]" % legacy) + return out + + +static func _bare_key_header(client: McpClient) -> String: + var parts := client.toml_section_path + if parts.is_empty(): + return "" + for part in parts: + if not _is_bare_key(String(part)): + return "" + return "[%s]" % ".".join(parts) + + +static func _is_bare_key(value: String) -> bool: + if value.is_empty(): + return false + for i in range(value.length()): + var c := value.unicode_at(i) + var alpha := (c >= 65 and c <= 90) or (c >= 97 and c <= 122) + var digit := c >= 48 and c <= 57 + if not (alpha or digit or c == 45 or c == 95): + return false + return true + + +static func _subtable_prefixes(headers: Array[String]) -> Array[String]: + var out: Array[String] = [] + for header in headers: + if header.length() > 2 and header.ends_with("]"): + out.append(header.substr(0, header.length() - 1) + ".") + return out + + +static func _matches_subtable_prefix(line: String, prefixes: Array[String]) -> bool: + var trimmed := line.strip_edges() + for prefix in prefixes: + if not trimmed.begins_with(prefix): + continue + var rest := trimmed.substr(prefix.length()) + var bracket := rest.find("]") + if bracket < 0: + continue + var remainder := rest.substr(bracket + 1).strip_edges() + if remainder.is_empty() or remainder.begins_with("#"): + return true + return false + + +static func _matches_any_header(line: String, headers: Array[String]) -> bool: + var trimmed := line.strip_edges() + for header in headers: + if not trimmed.begins_with(header): + continue + var remainder := trimmed.substr(header.length()).strip_edges() + if remainder.is_empty() or remainder.begins_with("#"): + return true + return false + + +static func _find_section(lines: Array[String], headers: Array[String]) -> Dictionary: + for i in range(lines.size()): + if _matches_any_header(lines[i], headers): + var end := lines.size() + for j in range(i + 1, lines.size()): + if _is_any_section_header(lines[j]): + end = j + break + return {"start": i, "end": end} + return {} + + +static func _is_any_section_header(line: String) -> bool: + var trimmed := line.strip_edges() + if not trimmed.begins_with("["): + return false + var bracket := trimmed.find("]") + if bracket < 0: + return false + var remainder := trimmed.substr(bracket + 1).strip_edges() + return remainder.is_empty() or remainder.begins_with("#") + + +static func _rewrite_legacy_descendant_headers( + lines: Array[String], client: McpClient +) -> Array[String]: + if client.toml_legacy_section_aliases.is_empty(): + return lines + var primary := _primary_header(client) + var primary_prefix := primary.substr(0, primary.length() - 1) + "." + var out: Array[String] = [] + for line in lines: + var rewritten := line + var trimmed := line.strip_edges() + var indent_length := line.find("[") + var indent := line.substr(0, indent_length) if indent_length >= 0 else "" + for alias in client.toml_legacy_section_aliases: + var legacy_prefix := "[%s." % String(alias) + if trimmed.begins_with(legacy_prefix): + rewritten = indent + primary_prefix + trimmed.substr(legacy_prefix.length()) + break + out.append(rewritten) + return out diff --git a/addons/godot_ai/clients/_toml_strategy.gd.uid b/addons/godot_ai/clients/_toml_strategy.gd.uid new file mode 100644 index 0000000..723cb79 --- /dev/null +++ b/addons/godot_ai/clients/_toml_strategy.gd.uid @@ -0,0 +1 @@ +uid://cwdvxgn0aurqv diff --git a/addons/godot_ai/clients/_yaml_strategy.gd b/addons/godot_ai/clients/_yaml_strategy.gd new file mode 100644 index 0000000..0efd515 --- /dev/null +++ b/addons/godot_ai/clients/_yaml_strategy.gd @@ -0,0 +1,549 @@ +@tool +class_name McpYamlStrategy +extends RefCounted + +## Minimal YAML upsert for Hermes Agent MCP config. +## +## Hermes reads MCP servers from ~/.hermes/config.yaml under the +## `mcp_servers` key (snake_case, YAML). HTTP entries are transport-inferred: +## just `url` (plus optional `headers`), no `type` field. We only parse the +## `mcp_servers` block and re-emit it; other top-level keys in the user's +## config.yaml are preserved verbatim by round-tripping the raw lines around +## that block. No general YAML parser — Godot has none in stdlib, and Hermes +## only needs this one shape. See issue #640. + +const INDENT := " " # YAML forbids tab indentation; match the 2-space style of ~/.hermes/config.yaml + + +static func configure( + client: McpClient, + server_name: String, + server_url: String, + launch: Dictionary = {}, +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty(): + return {"status": "error", "message": "Could not resolve config path for %s on this OS" % client.display_name} + ## Fail closed before touching the file — same contract as JSON/TOML. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": "error", "message": launch_error} + + var seed_path := str(resolution.get("seed_path", "")) + var read_path := seed_path if not FileAccess.file_exists(path) and not seed_path.is_empty() else path + var read := _read(read_path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to overwrite %s: %s. Fix or move the file, then re-run Configure." % [read_path, read["error"]]} + + var text: String = read["data"] + var block := _extract_block(text) + var entries: Dictionary = block["entries"] + + # Preserve existing entry's user-mutable keys; force the transport keys. + var existing: Dictionary = entries.get(server_name, {}) + var new_entry := build_entry(client, server_url, existing, launch) + entries[server_name] = new_entry + + var out := _assemble(text, block["prefix_lines"], entries, block["suffix_lines"]) + if not McpAtomicWrite.write(path, out): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": McpClient.configured_message(client, server_url)} + + +static func check_status( + client: McpClient, server_name: String, server_url: String, launch: Dictionary = {} +) -> McpClient.Status: + return check_status_details(client, server_name, server_url, launch)["status"] + + +## Same contract as the JSON/TOML strategies (#711): {status, error_msg}. +## An existing-but-unreadable config is ERROR with the diagnostic — not +## NOT_CONFIGURED — so the dock row can tell "no config" from "config the +## editor can't read" instead of offering a Configure that would fail. +static func check_status_details( + client: McpClient, server_name: String, server_url: String, launch: Dictionary = {} +) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var read := _read(path) + if not read["ok"]: + return { + "status": McpClient.Status.ERROR, + "error_msg": "Cannot read %s: %s" % [path, read["error"]], + } + var block := _extract_block(String(read["data"])) + var entries: Dictionary = block["entries"] + if not entries.has(server_name): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + var entry: Variant = entries[server_name] + if not (entry is Dictionary): + return {"status": McpClient.Status.NOT_CONFIGURED, "error_msg": ""} + ## An entry exists but no verified launcher does — mirror JSON/TOML: this + ## is an environment ERROR, not entry drift. + var launch_error := command_launch_error(client, launch) + if not launch_error.is_empty(): + return {"status": McpClient.Status.ERROR, "error_msg": launch_error} + if verify_entry(client, entry, server_url, launch): + return {"status": McpClient.Status.CONFIGURED, "error_msg": ""} + return {"status": McpClient.Status.CONFIGURED_MISMATCH, "error_msg": ""} + + +static func remove(client: McpClient, server_name: String) -> Dictionary: + var resolution := client.resolved_config_path_details() + var path := str(resolution.get("path", "")) + var path_error := str(resolution.get("error", "")) + if not path_error.is_empty(): + return {"status": "error", "message": path_error} + if path.is_empty() or not FileAccess.file_exists(path): + return {"status": "ok", "message": "Not configured"} + var read := _read(path) + if not read["ok"]: + return {"status": "error", "message": "Refusing to rewrite %s: %s." % [path, read["error"]]} + var text: String = read["data"] + var block := _extract_block(text) + var entries: Dictionary = block["entries"] + if not entries.has(server_name): + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + entries.erase(server_name) + var out := _assemble(text, block["prefix_lines"], entries, block["suffix_lines"]) + if not McpAtomicWrite.write(path, out): + return {"status": "error", "message": "Cannot write to %s" % path} + return {"status": "ok", "message": "%s configuration removed" % client.display_name} + + +## Build the entry dict written under mcp_servers[server_name]. +## +## URL mode (`CommandShape.NONE`): Hermes HTTP entries are transport-inferred +## — { url: } plus whatever user-mutable keys (headers, enabled, tools, +## ...) the existing entry carries. Stdio-bridge keys are the one exception +## (see _STDIO_BRIDGE_KEYS). No `type` field. +## +## Command mode (`CommandShape.FLAT`, #838): flat `command` + `args` keys, +## transport inferred the same way — which is exactly why the descriptor's +## `command_legacy_keys` (url, headers) must be scrubbed: a Hermes entry with +## both a url and a command picks the wrong transport. User keys survive. +static func build_entry( + client: McpClient, + server_url: String, + existing: Variant = null, + launch: Dictionary = {}, +) -> Dictionary: + if client.command_shape == McpClient.CommandShape.FLAT: + var command_entry: Dictionary = (existing as Dictionary).duplicate(true) if existing is Dictionary else {} + command_entry["command"] = str(launch.get("command", "")) + command_entry["args"] = _array_copy(launch.get("args", [])) + if not client.command_transport_key.is_empty(): + command_entry[client.command_transport_key] = client.command_transport_value + for key in client.command_initial_fields: + if not command_entry.has(key): + command_entry[key] = client.command_initial_fields[key] + for key in client.command_legacy_keys: + command_entry.erase(String(key)) + return command_entry + if client.command_shape != McpClient.CommandShape.NONE: + ## Every production caller checks command_launch_error first. Keep this + ## builder defensive too so a future unsupported shape cannot silently + ## degrade into a flat YAML entry. + return {} + var entry: Dictionary = {} + if existing is Dictionary: + ## User-mutable keys (headers, enabled, tools, ...) survive a + ## reconfigure — the same preservation contract the JSON strategy's + ## entry_initial_fields split implements. Only the stdio-bridge keys + ## are scrubbed (see _STDIO_BRIDGE_KEYS), then the url is repointed. + entry = (existing as Dictionary).duplicate(true) + for stale_key in _STDIO_BRIDGE_KEYS: + entry.erase(stale_key) + entry[client.entry_url_field] = server_url + return entry + + +## Keys a prior stdio-bridge entry (e.g. `command: uvx mcp-proxy`) may carry. +## These must NOT survive a URL reconfigure: a Hermes entry with both a url +## and a command picks the wrong transport. +const _STDIO_BRIDGE_KEYS := ["command", "args", "env"] + + +## Empty string when this client's launch requirements are satisfied. +## Mirrors `McpJsonStrategy.command_launch_error`; YAML supports FLAT only. +static func command_launch_error(client: McpClient, launch: Dictionary) -> String: + if client.command_shape == McpClient.CommandShape.NONE: + return "" + if client.command_shape != McpClient.CommandShape.FLAT: + return "%s uses a command shape not supported by YAML yet" % client.display_name + if not bool(launch.get("ok", false)): + return str(launch.get("error", "No compatible attach launcher was found.")) + return "" + + +## Verify a stored entry matches. +## +## URL mode: Hermes entries have no transport type pin, so verification is: +## url matches. Extra keys (headers, enabled, tools) are user-mutable and +## intentionally NOT checked (mirrors json entry_initial_fields). +## +## Command mode: every launch-affecting value must match exactly and legacy +## URL-transport keys must be gone — their presence is migration drift. +static func verify_entry( + client: McpClient, + entry: Dictionary, + server_url: String, + launch: Dictionary = {}, +) -> bool: + if client.command_shape != McpClient.CommandShape.NONE: + if client.command_shape != McpClient.CommandShape.FLAT or not bool(launch.get("ok", false)): + return false + for key in client.command_legacy_keys: + if entry.has(String(key)): + return false + if entry.get("command") != launch.get("command"): + return false + if not _arrays_equal(entry.get("args", null), launch.get("args", null)): + return false + if not client.command_transport_key.is_empty(): + if entry.get(client.command_transport_key, null) != client.command_transport_value: + return false + return true + return entry.get(client.entry_url_field, "") == server_url + + +static func _array_copy(value: Variant) -> Array: + if value is Array: + return (value as Array).duplicate(true) + if value is PackedStringArray: + return McpClient._array_from_packed(value) + return [] + + +static func _arrays_equal(left: Variant, right: Variant) -> bool: + if not (left is Array or left is PackedStringArray): + return false + if not (right is Array or right is PackedStringArray): + return false + var left_array := _array_copy(left) + var right_array := _array_copy(right) + if left_array.size() != right_array.size(): + return false + for i in range(left_array.size()): + if left_array[i] != right_array[i]: + return false + return true + + +# --- YAML block handling (scoped to mcp_servers) ------------------------- + +## Parse the file into three regions: +## prefix_lines — everything before `mcp_servers:` (may be empty) +## entries — the map of server_name -> {url, ...} under mcp_servers +## suffix_lines — everything after the mcp_servers block (may be empty) +## This lets us rewrite only the mcp_servers block and keep the rest of the +## user's config.yaml byte-for-byte intact. +static func _extract_block(text: String) -> Dictionary: + ## allow_empty must stay true: dropping empty splits would silently strip + ## the user's blank lines from the preserved prefix/suffix regions on + ## every rewrite. The parse loops below already skip blank lines. + var lines := text.split("\n") + var prefix: PackedStringArray = [] + var entries: Dictionary = {} + var suffix: PackedStringArray = [] + var header_idx := -1 + for i in range(lines.size()): + if lines[i].strip_edges().begins_with("mcp_servers:"): + header_idx = i + break + if header_idx < 0: + # No mcp_servers yet — whole file is prefix; block will be appended. + prefix = lines.duplicate() + return {"prefix_lines": prefix, "entries": entries, "suffix_lines": [], "header_idx": -1} + + for i in range(0, header_idx): + prefix.append(lines[i]) + + # Determine the indent of the first entry so we can tell sibling + # entries (same indent) apart from nested keys (deeper indent) and + # parent-level keys (less indent). All server entries under + # `mcp_servers:` share one indent level; breaking on 0-indent alone + # mis-nests 2-space-indented siblings under the first entry. + var entry_indent := -1 + var probe := header_idx + 1 + while probe < lines.size() and _is_blank_or_comment(lines[probe]): + probe += 1 + if probe < lines.size(): + entry_indent = _indent_of(lines[probe]) + + # Empty block guard: the first nonblank line after the header must sit + # DEEPER than the header itself to be an entry. At or above the header's + # indent it is a sibling/parent key — parsing it as an entry would + # swallow the user's next top-level key and re-emit it nested under + # mcp_servers, corrupting the file. + if probe < lines.size() and entry_indent <= _indent_of(lines[header_idx]): + for j in range(header_idx + 1, lines.size()): + suffix.append(lines[j]) + return {"prefix_lines": prefix, "entries": entries, "suffix_lines": suffix, "header_idx": header_idx} + + var i := header_idx + 1 + while i < lines.size(): + var raw := lines[i] + ## Comment-only lines inside the block are skipped like blanks — + ## treating one as an entry header would re-emit it as a bogus + ## `# comment:` server on rewrite. (Comments INSIDE the rewritten + ## block are consequently dropped; comments outside the block live + ## in prefix/suffix and survive verbatim.) + if _is_blank_or_comment(raw): + i += 1 + continue + # Stop at any line indented less than a sibling entry (parent key + # or a new top-level section), or at the header's own level. + if _indent_of(raw) < entry_indent: + break + var entry := _parse_entry(raw, lines, i, entry_indent) + if not entry["name"].is_empty(): + entries[entry["name"]] = entry["data"] + i = entry["next_idx"] + + for j in range(i, lines.size()): + suffix.append(lines[j]) + + return {"prefix_lines": prefix, "entries": entries, "suffix_lines": suffix, "header_idx": header_idx} + + +## Parse one ` name:` entry starting at `lines[start]`. Consumes all deeper- +## indented sublines (url, headers, etc.) and returns the next sibling index. +static func _parse_entry(raw: String, lines: PackedStringArray, start: int, entry_indent: int) -> Dictionary: + var name := raw.strip_edges().trim_suffix(":").strip_edges() + var data: Dictionary = {} + var i := start + 1 + while i < lines.size(): + var l := lines[i] + ## Comments inside an entry (e.g. ` # auth for CI`) would parse + ## as a `# auth for CI` key — skip them like blanks. + if _is_blank_or_comment(l): + i += 1 + continue + # A line at or above the entry's indent is a sibling/parent key. + if _indent_of(l) <= entry_indent: + break + var stripped := l.strip_edges() + var colon := stripped.find(":") + if colon < 0: + i += 1 + continue + var key := stripped.substr(0, colon).strip_edges() + var val := stripped.substr(colon + 1).strip_edges() + if val.is_empty(): + # Nested block (e.g. headers:). Parse as raw sub-dict lines for + # preservation; we don't introspect deeper than url at the top. + var sub := _parse_subblock(lines, i + 1, entry_indent) + data[key] = sub["value"] + i = sub["next_idx"] + else: + data[key] = coerce_scalar(val) + i += 1 + return {"name": name, "data": data, "next_idx": i} + + +## Parse a nested block (e.g. headers:) as a preserved sub-dictionary of +## scalar key/values. Deeper nesting is flattened into scalar strings — fine +## for Hermes' known shape (headers are flat key: value). +static func _parse_subblock(lines: PackedStringArray, start: int, entry_indent: int) -> Dictionary: + var sub: Dictionary = {} + var i := start + while i < lines.size(): + var l := lines[i] + if _is_blank_or_comment(l): + i += 1 + continue + # A line at or above the parent entry's indent ends the nested block. + if _indent_of(l) <= entry_indent: + break + var stripped := l.strip_edges() + var colon := stripped.find(":") + if colon < 0: + i += 1 + continue + var key := stripped.substr(0, colon).strip_edges() + var val := stripped.substr(colon + 1).strip_edges() + if val.is_empty(): + i += 1 + continue + sub[key] = coerce_scalar(val) + i += 1 + return {"value": sub, "next_idx": i} + + +## Reassemble the full file text from prefix + a freshly built mcp_servers +## block + suffix. If the block didn't exist before, it is appended. +static func _assemble(_text: String, prefix: PackedStringArray, entries: Dictionary, suffix: PackedStringArray) -> String: + var out: PackedStringArray = [] + for l in prefix: + out.append(l) + # Trim trailing blank lines from prefix so we don't stack double blanks. + while out.size() > 0 and out[out.size() - 1].strip_edges().is_empty(): + out.remove_at(out.size() - 1) + + if not _text.contains("mcp_servers:"): + # File existed but had no mcp_servers block — append it. + if out.size() > 0: + out.append("") + out.append("mcp_servers:") + for name in entries: + out.append_array(_emit_entry(name, entries[name])) + else: + out.append("mcp_servers:") + for name in entries: + out.append_array(_emit_entry(name, entries[name])) + + # Suffix: keep as-is. + for l in suffix: + out.append(l) + return "\n".join(out) + + +## Public rendering seam for the dock's manual-instruction text, so the +## pasted YAML matches what Configure would write byte-for-byte. +static func render_entry_lines(name: String, data: Dictionary) -> PackedStringArray: + return _emit_entry(name, data) + + +## Emit one ` name:` entry with its scalar keys (top level only; headers +## sub-dict is re-emitted as nested scalars; arrays — the command entry's +## `args` — are emitted in flow style on one line). +static func _emit_entry(name: String, data: Dictionary) -> PackedStringArray: + var lines: PackedStringArray = [] + lines.append(INDENT + "%s:" % name) + for key in data: + var val = data[key] + if val is Dictionary: + lines.append(INDENT + INDENT + "%s:" % key) + for sk in val: + lines.append(INDENT + INDENT + INDENT + "%s: %s" % [sk, emit_scalar(val[sk])]) + elif val is Array or val is PackedStringArray: + lines.append(INDENT + INDENT + "%s: %s" % [key, emit_flow_array(_array_copy(val))]) + else: + lines.append(INDENT + INDENT + "%s: %s" % [key, emit_scalar(val)]) + return lines + + +## Flow-style sequence with every item double-quoted. JSON string quoting is +## valid YAML double-quote style (shared escape set), so the same encoding +## both writes the file and — via JSON.parse_string in `coerce_scalar` — +## reads it back for verification. Shared with `McpDshStrategy` for the +## DeepSeek Harness patch-list `args` lines. +static func emit_flow_array(values: Array) -> String: + var parts: Array[String] = [] + for v in values: + parts.append(JSON.stringify(str(v))) + return "[%s]" % ", ".join(parts) + + +static func emit_scalar(v: Variant) -> String: + match typeof(v): + TYPE_BOOL: + return "true" if bool(v) else "false" + TYPE_INT: + return str(int(v)) + TYPE_FLOAT: + return str(float(v)) + _: + return emit_string_scalar(str(v)) + + +## Plain YAML scalars cannot safely carry ": ", " #", quotes, flow +## indicators, or leading indicator characters — a Windows launcher path with +## spaces would silently corrupt the entry. Quote exactly when needed so +## existing plain values (urls, bools-as-strings) keep their current +## byte-shape on rewrite. Backslashes are quoted too: a Windows path parses +## either way, but quoting makes the written shape unambiguous for any +## consumer. Shared with `McpDshStrategy` for DeepSeek Harness patch entries. +static func emit_string_scalar(s: String) -> String: + if s.is_empty(): + return "\"\"" + var needs_quote := s.begins_with(" ") or s.ends_with(" ") + if not needs_quote: + for needle in [": ", " #", "\"", "'", "\n", "\t", "\\", "{", "}", "[", "]", ","]: + if s.contains(needle): + needs_quote = true + break + if not needs_quote: + for prefix in ["#", "-", "?", "&", "*", "!", "|", ">", "%", "@", "`"]: + if s.begins_with(prefix): + needs_quote = true + break + return JSON.stringify(s) if needs_quote else s + + +## Blank and comment-only lines carry no structure — every scan loop skips +## them the same way so a `# comment` can never be mistaken for an entry +## header or a key/value line. +static func _is_blank_or_comment(line: String) -> bool: + var stripped := line.strip_edges() + return stripped.is_empty() or stripped.begins_with("#") + + +## Returns the leading-whitespace indent width of a line (spaces + tabs +## counted as 1 each). Used to distinguish sibling entries (same indent) +## from nested keys (deeper indent) and parent-level keys (less indent). +static func _indent_of(line: String) -> int: + var n := 0 + while n < line.length() and (line[n] == " " or line[n] == "\t"): + n += 1 + return n + + +## Minimal scalar coercion for parsed YAML values. Quotes are stripped; +## bare true/false/numbers are typed; double-quoted flow sequences (the +## command entry's `args`) parse back into an Array. Good enough for Hermes' +## url/headers/command/args. A hand-edited args in block style or with +## unquoted items doesn't JSON-parse — it stays a raw string, compares +## unequal, and surfaces as CONFIGURED_MISMATCH, which Reconfigure +## normalizes back to the flow form. Public: the dsh strategy parses its +## patch-list scalars with the same rules, so both YAML dialects share one +## coercion (#867 review). +static func coerce_scalar(s: String) -> Variant: + var t := s.strip_edges() + if t.begins_with("[") and t.ends_with("]"): + var parsed_array: Variant = JSON.parse_string(t) + if parsed_array is Array: + return parsed_array + return t + if t.begins_with("\"") and t.ends_with("\""): + var parsed_string: Variant = JSON.parse_string(t) + if parsed_string is String: + return parsed_string + return t.substr(1, t.length() - 2) + if t.begins_with("'") and t.ends_with("'"): + return t.substr(1, t.length() - 2) + if t == "true": + return true + if t == "false": + return false + if t.is_valid_int(): + return t.to_int() + if t.is_valid_float(): + return t.to_float() + return t + + +## Returns {"ok": true, "data": String} when the file is absent or readable, +## and {"ok": false, "error": String} when unreadable. Callers must NOT fall +## back to an empty string on the error path — doing so blows away the user's +## other config.yaml entries on the next write. +static func _read(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {"ok": true, "data": ""} + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + var err := FileAccess.get_open_error() + return {"ok": false, "error": "could not open for reading (%s)" % error_string(err)} + var t := f.get_as_text() + f.close() + return {"ok": true, "data": t} diff --git a/addons/godot_ai/clients/_yaml_strategy.gd.uid b/addons/godot_ai/clients/_yaml_strategy.gd.uid new file mode 100644 index 0000000..d8adce8 --- /dev/null +++ b/addons/godot_ai/clients/_yaml_strategy.gd.uid @@ -0,0 +1 @@ +uid://cfnw4oe71ra1l diff --git a/addons/godot_ai/clients/antigravity.gd b/addons/godot_ai/clients/antigravity.gd new file mode 100644 index 0000000..a707735 --- /dev/null +++ b/addons/godot_ai/clients/antigravity.gd @@ -0,0 +1,39 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "antigravity" + display_name = "Antigravity" + config_type = "json" + ## Antigravity moved its shared MCP config from `~/.gemini/antigravity/` + ## to `~/.gemini/config/` (IDE + CLI now read the same file there); the + ## old path is left in `detect_paths` below so an existing install is + ## still recognized, but new/updated entries write to the current path. + path_template = { + "unix": "~/.gemini/config/mcp_config.json", + "windows": "$USERPROFILE/.gemini/config/mcp_config.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + entry_url_field = "serverUrl" + ## `disabled` is user-state (they may have flipped the entry off in the + ## UI); seeded on first Configure but preserved across reconfigure. + entry_initial_fields = {"disabled": false} + ## Attach migration (#838). Antigravity stdio entries are flat + ## command/args/env with no type discriminator — transport is inferred + ## from `command` vs `serverUrl` presence (antigravity.google/docs/mcp), + ## so the legacy `serverUrl` must not survive next to a command. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["serverUrl"]) + command_initial_fields = {"disabled": false} + command_user_fields = PackedStringArray(["disabled", "disabledTools", "authProviderType", "env"]) + command_supports_url_fallback = true + ## Antigravity's spawner hangs stdio tool calls when the entry launches a + ## GUI-subsystem pythonw.exe (#863), and it hides child console windows + ## itself, so the visible-terminal problem the bootstrap solves (#827) + ## never applies. Write the plain console launcher on Windows. + needs_consoleless_launcher = false + detect_paths = PackedStringArray(path_template.values() + [ + "~/.gemini/antigravity/mcp_config.json", + "$USERPROFILE/.gemini/antigravity/mcp_config.json", + ]) diff --git a/addons/godot_ai/clients/antigravity.gd.uid b/addons/godot_ai/clients/antigravity.gd.uid new file mode 100644 index 0000000..0721a2f --- /dev/null +++ b/addons/godot_ai/clients/antigravity.gd.uid @@ -0,0 +1 @@ +uid://b4l1g0apa2hch diff --git a/addons/godot_ai/clients/cherry_studio.gd b/addons/godot_ai/clients/cherry_studio.gd new file mode 100644 index 0000000..873b9fe --- /dev/null +++ b/addons/godot_ai/clients/cherry_studio.gd @@ -0,0 +1,18 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "cherry_studio" + display_name = "Cherry Studio" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/CherryStudio/mcp_servers.json", + "windows": "$APPDATA/CherryStudio/mcp_servers.json", + "linux": "$XDG_CONFIG_HOME/CherryStudio/mcp_servers.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + entry_extra_fields = {"type": "streamableHttp"} + ## `isActive` is user-state (they may have toggled the server off in the UI). + ## Seed on first Configure but preserve across reconfigure. + entry_initial_fields = {"isActive": true} diff --git a/addons/godot_ai/clients/cherry_studio.gd.uid b/addons/godot_ai/clients/cherry_studio.gd.uid new file mode 100644 index 0000000..7ada8cd --- /dev/null +++ b/addons/godot_ai/clients/cherry_studio.gd.uid @@ -0,0 +1 @@ +uid://dwbuykxvbv5f7 diff --git a/addons/godot_ai/clients/claude_code.gd b/addons/godot_ai/clients/claude_code.gd new file mode 100644 index 0000000..d0378b6 --- /dev/null +++ b/addons/godot_ai/clients/claude_code.gd @@ -0,0 +1,84 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "claude_code" + display_name = "Claude Code" + config_type = "cli" + cli_names = PackedStringArray(["claude", "claude.exe"] if OS.get_name() == "Windows" else ["claude"]) + ## Stdio registration through the client-owned `godot-ai attach` bridge + ## (#838). `--` stops claude's own flag parsing so the attach argv passes + ## through verbatim; stdio is the CLI's default transport. Scope comes from + ## the `godot_ai/mcp_client_scope` EditorSetting via the `{scope}` token; it + ## defaults to `user` — the same ~/.claude.json the pre-attach HTTP entry + ## lived in — and can be set to `project` to write /.mcp.json so the + ## server is not loaded in every unrelated workspace. + cli_register_template = PackedStringArray( + ["mcp", "add", "--scope", "{scope}", "{name}", "--", "{command}", "{args...}"] + ) + ## Explicit scope: an unscoped `mcp remove` deletes from whichever scope + ## matches first, so the flag keeps each removal aimed at one known place. + ## Note what that does and does not protect (#877): the dock's **Remove** + ## button runs this once, at the selected scope only. **Configure** runs it + ## once per scope in `CLIENT_SCOPES` before registering, so a Configure at + ## any setting does delete a `godot-ai` entry from /.mcp.json if one is + ## there — see the cwd caveat below for which directory that actually is. + cli_unregister_template = PackedStringArray(["mcp", "remove", "--scope", "{scope}", "{name}"]) + ## Scope caveat: `--scope project` resolves `.mcp.json` against the + ## *spawned CLI's* working directory, which is whatever the editor process + ## inherited at launch — not necessarily `res://`. Godot has no API to set + ## a child's cwd (`OS.execute_with_pipe` takes none), so this is an + ## accepted limitation rather than something the descriptor can pin. It is + ## self-consistent: `cli_status_args` runs from the same cwd, so the + ## read-back finds whatever the register wrote (see + ## `_scope_diverges_from_json_fallback` in client_configurator.gd). + cli_status_args = PackedStringArray(["mcp", "list"]) + ## `mcp list` prints the resolved entry for the cwd without saying which + ## scope won, so it cannot tell "registered at project scope" from "an old + ## user-scope entry is shadowing an empty project scope". `mcp get` prints + ## both the command and a `Scope: …` line, in the same single subprocess, + ## so scope-token clients probe with it instead (#872). Verified against + ## claude 2.1.241, which prints one of: + ## Scope: User config (available in all your projects) + ## Scope: Project config (shared via .mcp.json) + ## Scope: Local config (private to you in this project) + ## and exits 1 with "No MCP server named …" when the entry is absent. + cli_scope_status_template = PackedStringArray(["mcp", "get", "{name}"]) + ## #463: JSON fallback for when the `claude` binary isn't on PATH — e.g. + ## Claude Code installed only as a VS Code / Cursor extension. The CLI is + ## still preferred for Configure whenever it resolves; this is what gets + ## written otherwise. `claude mcp add --scope user -- ` + ## produces exactly this shape under `mcpServers` in ~/.claude.json + ## (verified live against claude CLI in an isolated CLAUDE_CONFIG_DIR): + ## "godot-ai": { "type": "stdio", "command": "", "args": [...], "env": {} } + ## The fallback writer omits the empty `env`; the verifier accepts both. + ## Status reads this file only while the selected scope is still `user` — + ## it is the CLI's own store for that scope, and file reads give exact + ## launch-drift detection that `mcp list` stdout scanning cannot. At + ## `project`/`local` the entry is somewhere `path_template` cannot see, so + ## `_scope_diverges_from_json_fallback` (client_configurator.gd) routes + ## status to `cli_scope_status_template` instead and this file is not read. + path_template = {"unix": "~/.claude.json", "windows": "~/.claude.json"} + server_key_path = PackedStringArray(["mcpServers"]) + ## URL-mode shape, used only for the manual-instruction fallback text — + ## `claude mcp add --scope --transport http` writes {type: http, url}, + ## where is whatever `godot_ai/mcp_client_scope` resolves to. + entry_extra_fields = {"type": "http"} + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + ## Legacy HTTP entries carried a `url`; Claude Code rejects an entry mixing + ## url with command fields, and the stale `type: "http"` is repinned to + ## "stdio" by the transport key above. + command_legacy_keys = PackedStringArray(["url"]) + command_user_fields = PackedStringArray(["env"]) + command_supports_url_fallback = true + ## Documented: $CLAUDE_CONFIG_DIR relocates Claude Code's config home, + ## including .claude.json ($CLAUDE_CONFIG_DIR/.claude.json). The preferred + ## CLI path needs no help — the spawned `claude` binary inherits the + ## editor's environment and resolves the dir itself — but the JSON + ## fallback above would otherwise write ~/.claude.json that a relocated + ## install never reads (#617). + config_home_env = "CLAUDE_CONFIG_DIR" + config_home_env_subpath = ".claude.json" diff --git a/addons/godot_ai/clients/claude_code.gd.uid b/addons/godot_ai/clients/claude_code.gd.uid new file mode 100644 index 0000000..3d3335f --- /dev/null +++ b/addons/godot_ai/clients/claude_code.gd.uid @@ -0,0 +1 @@ +uid://cp1u1hdpa6f8d diff --git a/addons/godot_ai/clients/claude_desktop.gd b/addons/godot_ai/clients/claude_desktop.gd new file mode 100644 index 0000000..c1aa9bb --- /dev/null +++ b/addons/godot_ai/clients/claude_desktop.gd @@ -0,0 +1,38 @@ +@tool +extends McpClient + +## Claude Desktop's mcpServers entries launch a local stdio process. The +## client-owned `godot-ai attach` bridge keeps that stdio session stable while +## adopting or starting the shared HTTP backend as Godot editors come and go. + + +func _init() -> void: + id = "claude_desktop" + display_name = "Claude Desktop" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Claude/claude_desktop_config.json", + "windows": "$APPDATA/Claude/claude_desktop_config.json", + "linux": "$XDG_CONFIG_HOME/Claude/claude_desktop_config.json", + } + ## Store-installed Claude runs inside MSIX AppData virtualization. Godot is + ## outside that container, so `%APPDATA%` names a different physical file + ## once Claude has created its private copy. A unique Store package root is + ## authoritative even before the config leaf exists: create the private file + ## directly so a later copy-on-write cannot hide an entry written to roaming. + ## With no Store package, use the conventional roaming path. The wildcard + ## avoids coupling to the publisher-hash suffix. + config_path_candidates = { + "windows": [ + "$LOCALAPPDATA/Packages/Claude_*/LocalCache/Roaming/Claude/claude_desktop_config.json", + "$APPDATA/Claude/claude_desktop_config.json", + ], + } + detect_paths = PackedStringArray([ + "$LOCALAPPDATA/Packages/Claude_*", + ]) + server_key_path = PackedStringArray(["mcpServers"]) + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url"]) + command_env_legacy_keys = PackedStringArray(["UV_LINK_MODE"]) + command_user_fields = PackedStringArray(["env", "disabled"]) diff --git a/addons/godot_ai/clients/claude_desktop.gd.uid b/addons/godot_ai/clients/claude_desktop.gd.uid new file mode 100644 index 0000000..9759a1a --- /dev/null +++ b/addons/godot_ai/clients/claude_desktop.gd.uid @@ -0,0 +1 @@ +uid://bilntn5n8oqe3 diff --git a/addons/godot_ai/clients/cline.gd b/addons/godot_ai/clients/cline.gd new file mode 100644 index 0000000..2a1f025 --- /dev/null +++ b/addons/godot_ai/clients/cline.gd @@ -0,0 +1,43 @@ +@tool +extends McpClient + +## Cline is a VS Code extension. Its MCP settings live in VS Code's +## globalStorage under the extension id `saoudrizwan.claude-dev`. + + +func _init() -> void: + id = "cline" + display_name = "Cline" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json", + "windows": "$APPDATA/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json", + "linux": "$XDG_CONFIG_HOME/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## Cline (like Roo) defaults a typeless entry to SSE transport, which + ## returns HTTP 400 against our streamable-http endpoint on `/mcp`. Pin + ## the type explicitly. Cline's schema uses "streamableHttp" (camelCase, + ## see src/services/mcp/schemas.ts in the cline repo) — distinct from + ## Roo's "streamable-http" string. Parallel to the Roo fix in #190. + entry_extra_fields = {"type": "streamableHttp"} + ## `disabled` and `autoApprove` are user-state (they may have flipped the + ## entry off, or auto-approved specific tools). Seed on first Configure + ## but preserve across reconfigure — see `entry_initial_fields` in `_base.gd`. + entry_initial_fields = {"disabled": false, "autoApprove": []} + ## Attach migration (#838). Cline stdio entries are flat command/args/env; + ## its schema accepts `type: "stdio"` and normalizes typeless command + ## entries to it (apps/vscode/src/services/mcp/schemas.ts), so pin the + ## type — that also repins the legacy "streamableHttp" value instead of + ## letting it survive the deep-copy and misroute the transport. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_initial_fields = {"disabled": false, "autoApprove": []} + command_user_fields = PackedStringArray([ + "disabled", "autoApprove", "timeout", "oauth", "metadata", + "remoteConfigured", "env", "cwd", + ]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/cline.gd.uid b/addons/godot_ai/clients/cline.gd.uid new file mode 100644 index 0000000..95e20f1 --- /dev/null +++ b/addons/godot_ai/clients/cline.gd.uid @@ -0,0 +1 @@ +uid://d36nywn2nkgts diff --git a/addons/godot_ai/clients/codex.gd b/addons/godot_ai/clients/codex.gd new file mode 100644 index 0000000..b8231bc --- /dev/null +++ b/addons/godot_ai/clients/codex.gd @@ -0,0 +1,45 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "codex" + display_name = "Codex" + config_type = "toml" + path_template = {"unix": "~/.codex/config.toml", "windows": "$USERPROFILE/.codex/config.toml"} + ## Documented: when $CODEX_HOME is set, Codex reads config.toml directly + ## from it instead of ~/.codex (#617). + config_home_env = "CODEX_HOME" + config_home_env_subpath = "config.toml" + toml_section_path = PackedStringArray(["mcp_servers", "godot-ai"]) + # Older Codex builds used the unquoted form with underscore-substituted ids. + toml_legacy_section_aliases = PackedStringArray(["mcp_servers.godot_ai"]) + command_shape = McpClient.CommandShape.COMMAND_ARRAY + command_supports_url_fallback = true + command_legacy_keys = PackedStringArray(["url"]) + ## Initial-only: users may disable the entry or tune either timeout and + ## Configure preserves that choice. Codex currently defaults to 10s for + ## startup and 60s per tool; test_run legitimately has a 300s server + ## budget, so the generated config leaves transport margin at the client. + command_initial_fields = { + "enabled": true, + "startup_timeout_sec": 60, + "tool_timeout_sec": 360, + } + command_timeout_fields = PackedStringArray([ + "startup_timeout_sec", + "tool_timeout_sec", + ]) + command_user_fields = PackedStringArray([ + "enabled", + "required", + "startup_timeout_sec", + "tool_timeout_sec", + "enabled_tools", + "disabled_tools", + "default_tools_approval_mode", + "env", + "env_vars", + "cwd", + ]) + detect_paths = PackedStringArray(path_template.values()) diff --git a/addons/godot_ai/clients/codex.gd.uid b/addons/godot_ai/clients/codex.gd.uid new file mode 100644 index 0000000..1e1c3ae --- /dev/null +++ b/addons/godot_ai/clients/codex.gd.uid @@ -0,0 +1 @@ +uid://hdlwcfdr8mdk diff --git a/addons/godot_ai/clients/cursor.gd b/addons/godot_ai/clients/cursor.gd new file mode 100644 index 0000000..e4fe98d --- /dev/null +++ b/addons/godot_ai/clients/cursor.gd @@ -0,0 +1,21 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "cursor" + display_name = "Cursor" + config_type = "json" + path_template = {"unix": "~/.cursor/mcp.json", "windows": "$USERPROFILE/.cursor/mcp.json"} + server_key_path = PackedStringArray(["mcpServers"]) + ## Attach migration (#838). Cursor's stdio entries are flat command/args/env + ## (cursor.com/docs/context/mcp). The docs' reference table documents + ## `type: "stdio"`; pinning it also repins any hand-added `type: "http"` + ## left on the legacy URL entry, which would otherwise survive the + ## deep-copy migration and misroute the transport. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url"]) + command_user_fields = PackedStringArray(["env", "envFile"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/cursor.gd.uid b/addons/godot_ai/clients/cursor.gd.uid new file mode 100644 index 0000000..e0c7ddf --- /dev/null +++ b/addons/godot_ai/clients/cursor.gd.uid @@ -0,0 +1 @@ +uid://bvpbssfanukef diff --git a/addons/godot_ai/clients/deepseek_harness.gd b/addons/godot_ai/clients/deepseek_harness.gd new file mode 100644 index 0000000..b9db2a5 --- /dev/null +++ b/addons/godot_ai/clients/deepseek_harness.gd @@ -0,0 +1,45 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "deepseek_harness" + display_name = "DeepSeek Harness" + ## DeepSeek Harness (dsh) has no `mcp` CLI verb — MCP servers register as + ## `@deepseek-ai/dsh-mcp-client` plugin entries in the HOME patch layer + ## `$DSH_HOME/cordis.patch.yml`, which dsh applies over every profile's + ## own patch layer (the web GUI included). config_type "dsh" routes to + ## `McpDshStrategy`. Verified live against dsh 0.1.0-rc.6: new entries + ## must be `insert` rows; plain rows only override existing bundle ids. + config_type = "dsh" + ## Home patch layer, not a per-profile file: one entry covers the web + ## GUI, headless, tui, and any custom profile. + path_template = { + "unix": "~/.dsh/cordis.patch.yml", + "windows": "~/.dsh/cordis.patch.yml", + } + ## Documented: `$DSH_HOME` relocates the whole harness home, and the + ## loader reads `$DSH_HOME/cordis.patch.yml` (homePatchPath) — same + ## false-success-write class as CODEX_HOME (#617), so the override must + ## be declared. + config_home_env = "DSH_HOME" + config_home_env_subpath = "cordis.patch.yml" + ## Installed detection: the harness home directory itself (dsh GUI and + ## CLI both live there), or the config file once one exists. + detect_paths = PackedStringArray(["~/.dsh"]) + ## Attach migration (#838). The loader entry nests the launch under + ## `config`; the mcp-client plugin requires `transport` next to + ## command/args, and a `url` must never coexist with command fields. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "transport" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url"]) + ## Fields the mcp-client plugin documents as user-owned; preserved on + ## reconfigure and never drift-checked. + command_user_fields = PackedStringArray([ + "env", "cwd", "toolCallTimeoutMs", "failOnStartupError", "reconnect", + ]) + command_timeout_fields = PackedStringArray(["toolCallTimeoutMs"]) + ## The bridge accepts `transport: streamable-http` with a `url`, so the + ## manual instructions may offer the HTTP alternative. + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/deepseek_harness.gd.uid b/addons/godot_ai/clients/deepseek_harness.gd.uid new file mode 100644 index 0000000..8cc2ed3 --- /dev/null +++ b/addons/godot_ai/clients/deepseek_harness.gd.uid @@ -0,0 +1 @@ +uid://cw3pghlevtql8 diff --git a/addons/godot_ai/clients/gemini_cli.gd b/addons/godot_ai/clients/gemini_cli.gd new file mode 100644 index 0000000..fda58a3 --- /dev/null +++ b/addons/godot_ai/clients/gemini_cli.gd @@ -0,0 +1,25 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "gemini_cli" + display_name = "Gemini CLI" + config_type = "json" + path_template = { + "unix": "~/.gemini/settings.json", + "windows": "$USERPROFILE/.gemini/settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + entry_url_field = "httpUrl" + ## Attach migration (#838). Gemini CLI stdio entries are flat + ## command/args/env(+cwd); the config is one-of `command` | `url` (SSE) | + ## `httpUrl` (docs/tools/mcp-server.md), so BOTH URL keys are legacy next + ## to a command. `trust` bypasses tool confirmations — never seed it. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["httpUrl", "url"]) + command_user_fields = PackedStringArray([ + "timeout", "trust", "includeTools", "excludeTools", "env", "cwd", + ]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/gemini_cli.gd.uid b/addons/godot_ai/clients/gemini_cli.gd.uid new file mode 100644 index 0000000..2d4e85a --- /dev/null +++ b/addons/godot_ai/clients/gemini_cli.gd.uid @@ -0,0 +1 @@ +uid://b8288pxninajy diff --git a/addons/godot_ai/clients/grok.gd b/addons/godot_ai/clients/grok.gd new file mode 100644 index 0000000..7b6710e --- /dev/null +++ b/addons/godot_ai/clients/grok.gd @@ -0,0 +1,35 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "grok" + display_name = "Grok Build" + config_type = "toml" + # Grok Build reads MCP servers from ~/.grok/config.toml + # (https://x.ai / Grok user guide: MCP servers section). + path_template = { + "unix": "~/.grok/config.toml", + "windows": "$USERPROFILE/.grok/config.toml", + } + toml_section_path = PackedStringArray(["mcp_servers", "godot-ai"]) + # Some docs / older notes used an underscore form. + toml_legacy_section_aliases = PackedStringArray(["mcp_servers.godot_ai"]) + ## Attach migration (#838). Grok's stdio sections are flat command/args/env + ## with no type discriminator (docs.x.ai/build/features/mcp-servers); + ## url/headers are the HTTP form and must not survive next to a command. + ## Docs default startup_timeout_sec to 30 — a cold `uvx` install of the + ## pinned package can exceed that, so new entries seed 60 (preserved once + ## the user tunes it). tool_timeout_sec's documented 6000s default already + ## clears test_run's 300s budget, so it is left alone. The old body + ## template's `enabled = true` line was never documented for Grok — it is + ## no longer seeded, and an existing value survives as a user key. + command_shape = McpClient.CommandShape.COMMAND_ARRAY + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_initial_fields = {"startup_timeout_sec": 60} + command_user_fields = PackedStringArray([ + "env", "enabled", "startup_timeout_sec", "tool_timeout_sec", + ]) + command_timeout_fields = PackedStringArray(["startup_timeout_sec", "tool_timeout_sec"]) + command_supports_url_fallback = true + detect_paths = PackedStringArray(path_template.values()) diff --git a/addons/godot_ai/clients/grok.gd.uid b/addons/godot_ai/clients/grok.gd.uid new file mode 100644 index 0000000..f2d12c2 --- /dev/null +++ b/addons/godot_ai/clients/grok.gd.uid @@ -0,0 +1 @@ +uid://ckchsj5s3q1b0 diff --git a/addons/godot_ai/clients/hermes.gd b/addons/godot_ai/clients/hermes.gd new file mode 100644 index 0000000..64a66bb --- /dev/null +++ b/addons/godot_ai/clients/hermes.gd @@ -0,0 +1,46 @@ +@tool +extends McpClient + +func _init() -> void: + id = "hermes" + display_name = "Hermes Agent" + config_type = "yaml" + + # Hermes reads MCP config from ~/.hermes/config.yaml (YAML), NOT mcp.json. + # Verified against the official docs: + # https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp + # Windows: Hermes stores config under $LOCALAPPDATA/hermes (NOT $APPDATA, + # which is Roaming) — confirmed by where the running Hermes process reads. + # NOTE: _path_template.expand() only substitutes $VAR tokens, not %VAR%. + path_template = { + "unix": "~/.hermes/config.yaml", + "windows": "$LOCALAPPDATA/hermes/config.yaml" + } + + # Hermes uses the snake_case `mcp_servers` key (not `mcpServers`). + # PackedStringArray explicitly, matching every other descriptor — an + # untyped Array literal relies on implicit conversion that newer Godot + # builds enforce more strictly (the #722 CI lesson for Array[String]). + server_key_path = PackedStringArray(["mcp_servers"]) + + # HTTP entries use `url` (+ optional `headers`); transport is inferred — + # there is no `type` field in Hermes MCP config. + entry_url_field = "url" + + # No transport pin: Hermes infers streamable-http from the URL. + entry_extra_fields = {} + entry_initial_fields = {} + + ## Attach migration (#838). Hermes stdio entries are flat command/args/env + ## (hermes-agent.nousresearch.com/docs/user-guide/features/mcp), transport + ## inferred exactly like the URL form — which is why `url` and the + ## HTTP-only `headers` must not survive next to a command: an entry with + ## both picks the wrong transport. `enabled`/`tools`/`env` stay user-owned. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_user_fields = PackedStringArray(["enabled", "tools", "env"]) + command_supports_url_fallback = true + + # Hermes is "installed" wherever the config.yaml lives; presence of the + # file is sufficient for the dock's installed badge. + detect_paths = PackedStringArray() diff --git a/addons/godot_ai/clients/hermes.gd.uid b/addons/godot_ai/clients/hermes.gd.uid new file mode 100644 index 0000000..14cabd8 --- /dev/null +++ b/addons/godot_ai/clients/hermes.gd.uid @@ -0,0 +1 @@ +uid://ewmadhrvs5d7 diff --git a/addons/godot_ai/clients/kilo_code.gd b/addons/godot_ai/clients/kilo_code.gd new file mode 100644 index 0000000..4f7b3f7 --- /dev/null +++ b/addons/godot_ai/clients/kilo_code.gd @@ -0,0 +1,38 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "kilo_code" + display_name = "Kilo Code" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code/User/globalStorage/kilocode.kilo-code/settings/mcp_settings.json", + "windows": "$APPDATA/Code/User/globalStorage/kilocode.kilo-code/settings/mcp_settings.json", + "linux": "$XDG_CONFIG_HOME/Code/User/globalStorage/kilocode.kilo-code/settings/mcp_settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## Kilo Code (like Roo) defaults a typeless entry to SSE transport, which + ## returns HTTP 400 against our streamable-http endpoint on `/mcp`. Pin + ## the type explicitly. Parallel to the Roo fix in #190. + entry_extra_fields = {"type": "streamable-http"} + ## `disabled` and `alwaysAllow` are user-state (they may have flipped the + ## entry off, or auto-approved specific tools). Seed on first Configure + ## but preserve across reconfigure — see `entry_initial_fields` in `_base.gd`. + entry_initial_fields = {"disabled": false, "alwaysAllow": []} + ## Attach migration (#838). UNLIKE its Roo siblings the stdio entry must be + ## TYPELESS: Kilo's v7 platform treats this file as a migration source and + ## routes on `type` — any http type value sends the entry down the remote + ## branch where it is dropped for lack of a url, and only a bare + ## command/args/env entry is verified to work in BOTH the legacy extension + ## and the v7 migrator (packages/opencode/src/kilocode/mcp-migrator.ts). + ## `type` therefore joins the legacy keys instead of being repinned. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "type", "headers"]) + command_initial_fields = {"disabled": false, "alwaysAllow": []} + command_user_fields = PackedStringArray([ + "disabled", "alwaysAllow", "timeout", "cwd", "watchPaths", + "disabledTools", "env", + ]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/kilo_code.gd.uid b/addons/godot_ai/clients/kilo_code.gd.uid new file mode 100644 index 0000000..3ee5152 --- /dev/null +++ b/addons/godot_ai/clients/kilo_code.gd.uid @@ -0,0 +1 @@ +uid://dc1x77i1cmb6w diff --git a/addons/godot_ai/clients/kimi_code.gd b/addons/godot_ai/clients/kimi_code.gd new file mode 100644 index 0000000..a80fef8 --- /dev/null +++ b/addons/godot_ai/clients/kimi_code.gd @@ -0,0 +1,34 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "kimi_code" + display_name = "Kimi Code" + ## Kimi Code has no `mcp` CLI subcommand (verified against v0.28.1 — + ## `kimi mcp` falls through to the root --help, and the docs at + ## moonshotai.github.io/kimi-code/en/customization/mcp confirm servers are + ## managed via ~/.kimi-code/mcp.json, not a CLI verb). JSON is therefore + ## the only working config method, not a fallback. + config_type = "json" + path_template = {"unix": "~/.kimi-code/mcp.json", "windows": "~/.kimi-code/mcp.json"} + server_key_path = PackedStringArray(["mcpServers"]) + entry_extra_fields = {"transport": "http"} + ## Documented: `$KIMI_CODE_HOME/mcp.json` relocates the config + ## (moonshotai.github.io/kimi-code/en/customization/mcp) — same + ## false-success-write class as CODEX_HOME (#617). + config_home_env = "KIMI_CODE_HOME" + config_home_env_subpath = "mcp.json" + ## Attach migration (#838). Kimi Code stdio entries are flat + ## command/args/env(+cwd): "Entries with a `command` field are stdio + ## servers". `transport` is only defined for SSE-with-url, so the legacy + ## `transport: "http"` must be removed alongside `url`. Timeout fields are + ## camelCase, unlike Codex's snake_case. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "transport"]) + command_user_fields = PackedStringArray([ + "enabled", "startupTimeoutMs", "toolTimeoutMs", "enabledTools", + "disabledTools", "env", "cwd", + ]) + command_timeout_fields = PackedStringArray(["startupTimeoutMs", "toolTimeoutMs"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/kimi_code.gd.uid b/addons/godot_ai/clients/kimi_code.gd.uid new file mode 100644 index 0000000..5a05a0e --- /dev/null +++ b/addons/godot_ai/clients/kimi_code.gd.uid @@ -0,0 +1 @@ +uid://d2whd6a5fofhg diff --git a/addons/godot_ai/clients/kiro.gd b/addons/godot_ai/clients/kiro.gd new file mode 100644 index 0000000..c9d4247 --- /dev/null +++ b/addons/godot_ai/clients/kiro.gd @@ -0,0 +1,23 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "kiro" + display_name = "Kiro" + config_type = "json" + path_template = { + "unix": "~/.kiro/settings/mcp.json", + "windows": "$USERPROFILE/.kiro/settings/mcp.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## `disabled` is user-state — preserved across reconfigure. + entry_initial_fields = {"disabled": false} + ## Attach migration (#838). Kiro stdio entries are flat command/args/env + ## with no type discriminator (kiro.dev/docs/mcp/configuration). + ## `autoApprove` is user-state, same contract as the URL entry's fields. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url"]) + command_initial_fields = {"disabled": false} + command_user_fields = PackedStringArray(["disabled", "autoApprove", "disabledTools", "env"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/kiro.gd.uid b/addons/godot_ai/clients/kiro.gd.uid new file mode 100644 index 0000000..dde3e87 --- /dev/null +++ b/addons/godot_ai/clients/kiro.gd.uid @@ -0,0 +1 @@ +uid://dqdmd2jw5qen7 diff --git a/addons/godot_ai/clients/opencode.gd b/addons/godot_ai/clients/opencode.gd new file mode 100644 index 0000000..cee555b --- /dev/null +++ b/addons/godot_ai/clients/opencode.gd @@ -0,0 +1,39 @@ +@tool +extends McpClient + +## OpenCode stores MCP servers under `mcp.` (not the typical mcpServers +## map) and uses `type: "remote"` for HTTP servers. + + +func _init() -> void: + id = "opencode" + display_name = "OpenCode" + config_type = "json" + ## `$HOME` on Windows is deliberate: OpenCode reads ~/.config/... on ALL + ## platforms (verified via `opencode debug paths`), and + ## McpPathTemplate._home() falls back to USERPROFILE when HOME is unset — + ## pinned by test_opencode_client_uses_home_config_on_windows. The documented + ## `OPENCODE_CONFIG` override names an exact file and must win over this + ## default for configure, status, remove, and manual instructions. + path_template = { + "unix": "~/.config/opencode/opencode.json", + "windows": "$HOME/.config/opencode/opencode.json", + } + config_file_env = "OPENCODE_CONFIG" + server_key_path = PackedStringArray(["mcp"]) + entry_extra_fields = {"type": "remote"} + ## `enabled` is user-state (they may have toggled the server off). + entry_initial_fields = {"enabled": true} + ## Attach migration (#838). OpenCode local entries carry the launch as ONE + ## argv array — `"command": ["uvx", …]` with no separate args key — plus a + ## schema-REQUIRED `type: "local"` (McpLocalConfig in opencode.ai/config.json; + ## env lives under `environment`, not `env`). The pin rewrites the legacy + ## `type: "remote"` in place; url/headers are remote-only and must go. + command_shape = McpClient.CommandShape.COMMAND_ARRAY + command_transport_key = "type" + command_transport_value = "local" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_initial_fields = {"enabled": true} + command_user_fields = PackedStringArray(["enabled", "timeout", "environment", "cwd"]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/opencode.gd.uid b/addons/godot_ai/clients/opencode.gd.uid new file mode 100644 index 0000000..dc2ad00 --- /dev/null +++ b/addons/godot_ai/clients/opencode.gd.uid @@ -0,0 +1 @@ +uid://s8n0vfirf2pj diff --git a/addons/godot_ai/clients/pi.gd b/addons/godot_ai/clients/pi.gd new file mode 100644 index 0000000..849fbb4 --- /dev/null +++ b/addons/godot_ai/clients/pi.gd @@ -0,0 +1,63 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "pi" + display_name = "Pi Agent" + config_type = "json" + # pi-codemode-mcp reads MCP server definitions from ~/.pi/agent/mcp.json + # (first merge tier; ~/.pi/agent/.mcp.json, .pi/mcp.json, and + # .mcp.json merge after, project-scope last). Documented at + # github.com/mitsuhiko/pi-codemode-mcp README "Configuration files" + # section. Windows path mirrors antigravity's $USERPROFILE choice so + # the descriptor round-trips on every supported platform. + path_template = { + "unix": "~/.pi/agent/mcp.json", + "windows": "$USERPROFILE/.pi/agent/mcp.json", + } + # Pi merges these files in order; later definitions of the same server win. + # Keep this separate from config_path_candidates, whose entries are alternatives + # rather than merge tiers. + config_merge_path_templates = { + "unix": PackedStringArray([ + "~/.pi/agent/mcp.json", + "~/.pi/agent/.mcp.json", + ]), + "windows": PackedStringArray([ + "$USERPROFILE/.pi/agent/mcp.json", + "$USERPROFILE/.pi/agent/.mcp.json", + ]), + } + config_merge_project_paths = PackedStringArray([".pi/mcp.json", ".mcp.json"]) + server_key_path = PackedStringArray(["mcpServers"]) + # pi-codemode-mcp resolves these with nullish precedence: + # mcpServers ?? mcp-servers ?? servers. Reuse whichever map already exists + # so Configure cannot shadow and deactivate the user's existing servers. + var aliases: Array[PackedStringArray] = [ + PackedStringArray(["mcp-servers"]), + PackedStringArray(["servers"]), + ] + server_key_path_aliases = aliases + entry_url_field = "url" + # pi-codemode-mcp selects stdio from `command` and remote transport from + # `url`; it ignores `type`. Keep generated stdio entries minimal and typeless. + entry_extra_fields = {} + entry_initial_fields = {} + # Attach migration (#838). Pi stdio entries are flat command/args/env. + # When Configure replaces a legacy URL entry, remove `url`, `headers`, and + # any redundant `type` field so the generated stdio entry stays canonical. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "headers", "type"]) + # `env` is the only user-mutable field pi's docs surface. Future + # fields still survive — the strategy deep-copies unknown keys. + command_user_fields = PackedStringArray(["env"]) + # Pi's loader also accepts pure-URL entries (the example mcp.json in + # the pi-codemode-mcp repo ships stdio + URL entries side-by-side). + # Keep the manual-instruction URL fallback alive. + command_supports_url_fallback = true + # ~/.pi/agent/mcp.json is created by the first pi launch, so its + # presence is the strongest install signal. Mirror antigravity's + # `detect_paths = path_template.values()` pattern so the dock shows + # the installed badge before Configure has run. + detect_paths = PackedStringArray(path_template.values()) \ No newline at end of file diff --git a/addons/godot_ai/clients/pi.gd.uid b/addons/godot_ai/clients/pi.gd.uid new file mode 100644 index 0000000..53aeb7c --- /dev/null +++ b/addons/godot_ai/clients/pi.gd.uid @@ -0,0 +1 @@ +uid://it00ohwkm2nd diff --git a/addons/godot_ai/clients/qwen_code.gd b/addons/godot_ai/clients/qwen_code.gd new file mode 100644 index 0000000..63bc7b2 --- /dev/null +++ b/addons/godot_ai/clients/qwen_code.gd @@ -0,0 +1,26 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "qwen_code" + display_name = "Qwen Code" + config_type = "json" + path_template = { + "unix": "~/.qwen/settings.json", + "windows": "$USERPROFILE/.qwen/settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + entry_url_field = "httpUrl" + ## Attach migration (#838). Qwen Code is a gemini-cli fork with the same + ## flat stdio shape and one-of `command` | `url` | `httpUrl` rule + ## (docs/users/features/mcp.md). Qwen adds `discoveryTimeoutMs` (stdio + ## discovery handshake cap, default 30s). + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["httpUrl", "url"]) + command_user_fields = PackedStringArray([ + "timeout", "trust", "includeTools", "excludeTools", "env", "cwd", + "discoveryTimeoutMs", + ]) + command_timeout_fields = PackedStringArray(["timeout", "discoveryTimeoutMs"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/qwen_code.gd.uid b/addons/godot_ai/clients/qwen_code.gd.uid new file mode 100644 index 0000000..5f2eb1a --- /dev/null +++ b/addons/godot_ai/clients/qwen_code.gd.uid @@ -0,0 +1 @@ +uid://qwb5udkf423q diff --git a/addons/godot_ai/clients/roo_code.gd b/addons/godot_ai/clients/roo_code.gd new file mode 100644 index 0000000..5d7bd6a --- /dev/null +++ b/addons/godot_ai/clients/roo_code.gd @@ -0,0 +1,42 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "roo_code" + display_name = "Roo Code" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json", + "windows": "$APPDATA/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json", + "linux": "$XDG_CONFIG_HOME/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## Roo defaults an entry with no "type" to SSE transport — which returns + ## HTTP 400 against our streamable-http endpoint on `/mcp`. Pin the type + ## explicitly so Roo negotiates streamable-http (the current MCP spec's + ## recommended remote transport). See issue #189. The default verifier + ## requires every entry_extra_fields key to match, so a pre-#189 typeless + ## entry surfaces as drift instead of silently passing as configured. + entry_extra_fields = {"type": "streamable-http"} + ## `disabled` and `alwaysAllow` are user-state (they may have flipped the + ## entry off, or auto-approved specific tools like `session_manage`). + ## Seed on first Configure but preserve across reconfigure — without this + ## split, the Configure-All-Mismatched sweep silently wipes the user's + ## auto-approval list every time the type pin or URL drifts. + entry_initial_fields = {"disabled": false, "alwaysAllow": []} + ## Attach migration (#838). Roo stdio entries are flat command/args/env + ## (+cwd); docs state `type` defaults to "stdio" for command configs and + ## the stdio schema forbids url/headers. Pin type=stdio — it is documented + ## and repins the legacy "streamable-http" value in place. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_initial_fields = {"disabled": false, "alwaysAllow": []} + command_user_fields = PackedStringArray([ + "disabled", "alwaysAllow", "timeout", "disabledTools", "watchPaths", + "env", "cwd", + ]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/roo_code.gd.uid b/addons/godot_ai/clients/roo_code.gd.uid new file mode 100644 index 0000000..1dcae84 --- /dev/null +++ b/addons/godot_ai/clients/roo_code.gd.uid @@ -0,0 +1 @@ +uid://denjdf50qrf66 diff --git a/addons/godot_ai/clients/trae.gd b/addons/godot_ai/clients/trae.gd new file mode 100644 index 0000000..afc7a68 --- /dev/null +++ b/addons/godot_ai/clients/trae.gd @@ -0,0 +1,23 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "trae" + display_name = "Trae" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Trae/User/mcp.json", + "windows": "$APPDATA/Trae/User/mcp.json", + "linux": "$XDG_CONFIG_HOME/Trae/User/mcp.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## Attach migration (#838). Trae stdio entries are flat command/args/env + ## with no type discriminator (docs.trae.cn/ide/add-mcp-servers); transport + ## is inferred from `command` vs `url`, so url/headers are legacy next to a + ## command. Entry stays minimal — Trae manages enable/disable in its UI, + ## and its startup/run timeouts ride user-owned env vars, which survive. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_user_fields = PackedStringArray(["env"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/trae.gd.uid b/addons/godot_ai/clients/trae.gd.uid new file mode 100644 index 0000000..f10046e --- /dev/null +++ b/addons/godot_ai/clients/trae.gd.uid @@ -0,0 +1 @@ +uid://cwpu48772vfj1 diff --git a/addons/godot_ai/clients/vscode.gd b/addons/godot_ai/clients/vscode.gd new file mode 100644 index 0000000..a18b97d --- /dev/null +++ b/addons/godot_ai/clients/vscode.gd @@ -0,0 +1,30 @@ +@tool +extends McpClient + +## VS Code (stable) reads MCP servers from per-user mcp.json under +## `servers.` with `{ "type": "http", "url": ... }`. + + +func _init() -> void: + id = "vscode" + display_name = "VS Code" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code/User/mcp.json", + "windows": "$APPDATA/Code/User/mcp.json", + "linux": "$XDG_CONFIG_HOME/Code/User/mcp.json", + } + server_key_path = PackedStringArray(["servers"]) + entry_extra_fields = {"type": "http"} + ## Attach migration (#838). VS Code stdio entries are flat command/args/env + ## under `servers` with a documented `type: "stdio"` discriminator + ## (code.visualstudio.com/docs/agents/reference/mcp-configuration). The + ## stdio schema is `additionalProperties: false` (mcpConfiguration.ts), so + ## removing the legacy url/headers is load-bearing — leftovers invalidate + ## the whole entry, and the pin flips the legacy `type: "http"` in place. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_user_fields = PackedStringArray(["env", "envFile", "cwd", "sandboxEnabled", "dev"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/vscode.gd.uid b/addons/godot_ai/clients/vscode.gd.uid new file mode 100644 index 0000000..1c79881 --- /dev/null +++ b/addons/godot_ai/clients/vscode.gd.uid @@ -0,0 +1 @@ +uid://dl6cm044pihub diff --git a/addons/godot_ai/clients/vscode_insiders.gd b/addons/godot_ai/clients/vscode_insiders.gd new file mode 100644 index 0000000..7f6a65b --- /dev/null +++ b/addons/godot_ai/clients/vscode_insiders.gd @@ -0,0 +1,23 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "vscode_insiders" + display_name = "VS Code Insiders" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code - Insiders/User/mcp.json", + "windows": "$APPDATA/Code - Insiders/User/mcp.json", + "linux": "$XDG_CONFIG_HOME/Code - Insiders/User/mcp.json", + } + server_key_path = PackedStringArray(["servers"]) + entry_extra_fields = {"type": "http"} + ## Attach migration (#838). Identical format to vscode.gd — Insiders ships + ## the same mcpConfiguration.ts schema; see that descriptor for citations. + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_user_fields = PackedStringArray(["env", "envFile", "cwd", "sandboxEnabled", "dev"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/vscode_insiders.gd.uid b/addons/godot_ai/clients/vscode_insiders.gd.uid new file mode 100644 index 0000000..c763703 --- /dev/null +++ b/addons/godot_ai/clients/vscode_insiders.gd.uid @@ -0,0 +1 @@ +uid://cad5w4ofyg8a2 diff --git a/addons/godot_ai/clients/windsurf.gd b/addons/godot_ai/clients/windsurf.gd new file mode 100644 index 0000000..b3ef210 --- /dev/null +++ b/addons/godot_ai/clients/windsurf.gd @@ -0,0 +1,29 @@ +@tool +extends McpClient + + +func _init() -> void: + # #623: Windsurf was rebranded to Devin Desktop by Cognition (June 2026). + # The id stays "windsurf" — it is the stable registry key used for + # configured-status lookups. The MCP config path is unchanged by the + # rebrand: per the official docs (docs.devin.ai/desktop/cascade/mcp) the + # global config still lives under the platform's `.codeium/windsurf/` + # directory (~/.codeium/windsurf/ on unix, $USERPROFILE/.codeium/windsurf/ + # on Windows), and migrated installs carry their settings over in place. + id = "windsurf" + display_name = "Devin Desktop (Windsurf)" + config_type = "json" + path_template = { + "unix": "~/.codeium/windsurf/mcp_config.json", + "windows": "$USERPROFILE/.codeium/windsurf/mcp_config.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + entry_url_field = "serverUrl" + ## Attach migration (#838). Stdio entries are flat command/args/env + ## (docs.devin.ai/desktop/cascade/mcp); transport is inferred from + ## `command` vs `serverUrl` presence and no type field is documented — + ## do not write one. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["serverUrl"]) + command_user_fields = PackedStringArray(["env"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/windsurf.gd.uid b/addons/godot_ai/clients/windsurf.gd.uid new file mode 100644 index 0000000..af34b60 --- /dev/null +++ b/addons/godot_ai/clients/windsurf.gd.uid @@ -0,0 +1 @@ +uid://b6pqiok2mlsmg diff --git a/addons/godot_ai/clients/zed.gd b/addons/godot_ai/clients/zed.gd new file mode 100644 index 0000000..fbd5f29 --- /dev/null +++ b/addons/godot_ai/clients/zed.gd @@ -0,0 +1,29 @@ +@tool +extends McpClient + +## Zed registers MCP servers under `context_servers.` and supports both +## stdio and streamable http transports. + + +func _init() -> void: + id = "zed" + display_name = "Zed" + config_type = "json" + path_template = { + "darwin": "~/.config/zed/settings.json", + "linux": "$XDG_CONFIG_HOME/zed/settings.json", + "windows": "$APPDATA/Zed/settings.json", + } + server_key_path = PackedStringArray(["context_servers"]) + ## Attach migration (#838). Current Zed's context_servers entries are an + ## untagged serde enum discriminated by shape: `command` (string) + args/env + ## → stdio, `url` → HTTP (zed.dev/docs/ai/mcp; settings_content/project.rs). + ## BECAUSE the enum is untagged, HTTP-only keys left next to `command` + ## (`url`, `headers`, `oauth`) make the entry match no variant and break it — + ## removing them on migration is load-bearing, not cosmetic. `enabled`, + ## `remote`, and `timeout` are user-state on the stdio variant. + command_shape = McpClient.CommandShape.FLAT + command_legacy_keys = PackedStringArray(["url", "headers", "oauth"]) + command_user_fields = PackedStringArray(["enabled", "remote", "timeout", "env"]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/zed.gd.uid b/addons/godot_ai/clients/zed.gd.uid new file mode 100644 index 0000000..b9b313a --- /dev/null +++ b/addons/godot_ai/clients/zed.gd.uid @@ -0,0 +1 @@ +uid://d152l0u0r6fsc diff --git a/addons/godot_ai/clients/zoo_code.gd b/addons/godot_ai/clients/zoo_code.gd new file mode 100644 index 0000000..870ff39 --- /dev/null +++ b/addons/godot_ai/clients/zoo_code.gd @@ -0,0 +1,36 @@ +@tool +extends McpClient + + +func _init() -> void: + id = "zoo_code" + display_name = "Zoo Code" + config_type = "json" + path_template = { + "darwin": "~/Library/Application Support/Code/User/globalStorage/zoocodeorganization.zoo-code/settings/mcp_settings.json", + "windows": "$APPDATA/Code/User/globalStorage/zoocodeorganization.zoo-code/settings/mcp_settings.json", + "linux": "$XDG_CONFIG_HOME/Code/User/globalStorage/zoocodeorganization.zoo-code/settings/mcp_settings.json", + } + server_key_path = PackedStringArray(["mcpServers"]) + ## Local validation against the installed extension shows Zoo stores MCP + ## entries in `settings/mcp_settings.json` under `mcpServers`, matching Roo's + ## shape. Its changelog also references Streamable HTTP support, so pin the + ## transport explicitly to avoid any typeless entry falling back to SSE. + entry_extra_fields = {"type": "streamable-http"} + ## Preserve user-controlled state across reconfigure, parallel to Roo/Kilo. + entry_initial_fields = {"disabled": false, "alwaysAllow": []} + ## Attach migration (#838). Zoo's stdio zod schema is Roo's: flat + ## command/args/env(+cwd), `type: z.enum(["stdio"]).optional()`, and + ## url/headers explicitly forbidden on stdio entries (McpHub.ts) — so both + ## are legacy keys and the documented type pin repins "streamable-http". + command_shape = McpClient.CommandShape.FLAT + command_transport_key = "type" + command_transport_value = "stdio" + command_legacy_keys = PackedStringArray(["url", "headers"]) + command_initial_fields = {"disabled": false, "alwaysAllow": []} + command_user_fields = PackedStringArray([ + "disabled", "alwaysAllow", "timeout", "watchPaths", "disabledTools", + "env", "cwd", + ]) + command_timeout_fields = PackedStringArray(["timeout"]) + command_supports_url_fallback = true diff --git a/addons/godot_ai/clients/zoo_code.gd.uid b/addons/godot_ai/clients/zoo_code.gd.uid new file mode 100644 index 0000000..dd3713e --- /dev/null +++ b/addons/godot_ai/clients/zoo_code.gd.uid @@ -0,0 +1 @@ +uid://fmp0nlzcm3ukl diff --git a/addons/godot_ai/connection.gd b/addons/godot_ai/connection.gd new file mode 100644 index 0000000..753a49e --- /dev/null +++ b/addons/godot_ai/connection.gd @@ -0,0 +1,1058 @@ +@tool +class_name McpConnection +extends Node + +## WebSocket transport to the Godot AI Python server. +## Only handles connect, reconnect, send, and receive. +## Command dispatch is owned by McpDispatcher. + +const RECONNECT_DELAYS: Array[float] = [1.0, 2.0, 4.0, 8.0, 16.0, 30.0, 60.0] +const RECONNECT_VERBOSE_ATTEMPTS := 5 +const RECONNECT_LOG_HEARTBEAT_MSEC := 60_000 +## Backpressure policy: do not queue responses once the WebSocket's current +## outbound buffer plus the next payload would exceed this cap. Command +## responses get a compact structured error when that can still be sent; +## state events report failure so their callers can retry on a later tick. +const OUTBOUND_BUFFER_LIMIT_BYTES := 4 * 1024 * 1024 +## Cap the inbound packet drain per `_process` tick. A flooding peer or a +## fast batch could otherwise saturate `_handle_message` in one frame and +## blow the documented 4ms budget. Packets beyond this cap spill to the +## next frame; the cumulative spill counter is logged so flood patterns +## are observable in `logs_read`. See audit-v2 finding #12 (issue #356). +const PACKET_DRAIN_CAP_PER_TICK := 32 +## Mirror of the server's application close code for a handshake carrying a +## wrong auth token (#690; `websocket.py::_CLOSE_CODE_AUTH_TOKEN_MISMATCH`). +const CLOSE_CODE_AUTH_TOKEN_MISMATCH := 4003 +## After this many consecutive post-OPEN token-mismatch rejections, drop the +## token and handshake token-less (see `_note_post_open_close`). Two, not +## one: a transient stale-record race during a server swap gets one chance +## to resolve before the token is given up. +const AUTH_MISMATCH_FALLBACK_CLOSES := 2 +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Emitted whenever the underlying WebSocket open/closed state flips. +## Subscribers (e.g. the plugin-side telemetry helper) use this to drain +## events that were enqueued before the socket was ready. Emitted with +## ``true`` on first OPEN per connect, ``false`` on transition to CLOSED +## (including ``disconnect_from_server()``). +signal connection_state_changed(is_open: bool) + +var _peer := WebSocketPeer.new() +## Seeded by plugin.gd from the configured EditorSettings port before the +## first dial, then republished with the fully resolved port once the +## deferred startup walk (#678) finishes resolving/spawning. Each connect +## attempt recomputes the URL from the latest value, so reconnects keep +## dialing the port the Python server was asked to bind. +var ws_port := ClientConfigurator.DEFAULT_WS_PORT +## Per-launch handshake auth token (#690). Set by plugin.gd from the value +## it generated for the server spawn (also persisted in the managed-server +## editor-settings record so a reloaded plugin instance adopting the same +## server keeps sending it). Empty means "don't send the field" — servers +## we didn't spawn (dev servers, older servers) have no token to match. +var auth_token := "" +var _url := "" +var _connected := false +var _reconnect_attempt := 0 +var _reconnect_timer := 0.0 +## Pull-based reconnect observability. The peer owns CONNECTING/CLOSING +## timing; tracking entry time here lets logs and the dock distinguish those +## phases from the plugin-owned CLOSED-state backoff without changing policy. +var _observed_peer_state := WebSocketPeer.STATE_CLOSED +var _peer_state_entered_msec := 0 +var _last_reconnect_transition_log_msec := -1 +var _transient_diagnostic: Dictionary = {} +## One pre-OPEN failure diagnostic per WebSocketPeer. Without this guard the +## CLOSED state is polled every frame and would flood the editor log. +var _preopen_failure_logged_for_peer := false +var _session_id := "" +## Consecutive post-OPEN closes with CLOSE_CODE_AUTH_TOKEN_MISMATCH. NOT +## reset by `_clear_on_disconnect` — the streak is counted exactly at the +## close events it exists to observe, across reconnect attempts. Reset on +## any other close code and on a successful `handshake_ack`. +var _auth_mismatch_closes := 0 +## Godot-AI Python package version reported by the server in its `handshake_ack` +## reply. Empty until the ack lands. Older servers (pre-handshake_ack) leave +## this empty forever — callers that gate on it (the dock's mismatch banner) +## must treat empty as "unknown, don't raise a false alarm". +var server_version := "" + +var dispatcher +var log_buffer +var surfaced_error_tracker +## Set by plugin.gd. Lets the per-frame play-state poll end game-run +## bookkeeping when the game exits on its own (self-quit, crash) — the +## debugger session's stopped signal is not reliably connected, and no MCP +## stop op runs in that path (#642). +var debugger_plugin +## Set by plugin.gd when the HTTP port is occupied by an incompatible or +## unverified server. Keeping the Connection node alive lets handlers and the +## dock share one object, but no WebSocket is opened to the wrong server. +var connect_blocked := false +var connect_block_reason := "" +var _blocked_notice_logged := false +## Compatibility property used by existing handlers. Setting true increments +## the pause depth; setting false decrements it. Processing stays paused until +## every nested pause has resumed. +var pause_processing: bool: + get: return _pause_depth > 0 + set(value): + if value: + pause() + else: + resume() +var _pause_depth := 0 +## Cumulative count of inbound packets that didn't fit in their tick's drain +## budget and got deferred to a subsequent tick. Reset on disconnect so each +## connection starts with a clean spillover history. Logged whenever new +## spillover occurs so flood patterns surface in `logs_read`. +var _packet_spillover_total := 0 + + +func _ready() -> void: + _session_id = _make_session_id(ProjectSettings.globalize_path("res://")) + ## Increase outbound buffer for large messages (e.g. screenshot base64). + ## Default is 64 KB; screenshots can be several MB. + _peer.outbound_buffer_size = OUTBOUND_BUFFER_LIMIT_BYTES + ## Symmetric inbound bump (#690): the server sends up to 4 MB + ## (websocket.py max_size), but Godot's inbound default is 64 KB — a + ## large script/text write or batch_execute payload used to overflow + ## the peer buffer, drop the frame, and surface as an opaque 5s + ## timeout + reconnect with no error naming the size. + _peer.inbound_buffer_size = OUTBOUND_BUFFER_LIMIT_BYTES + if connect_blocked: + _log_blocked_notice_once() + set_process(false) + return + _connect_to_server() + _hook_editor_signals() + + +func _process(delta: float) -> void: + if pause_processing: + return + _peer.poll() + ## Run-stop bookkeeping must not wait behind the socket-state machine: + ## if the game stops while disconnected, the first command drained on + ## reconnect would still observe stale "live" state (PR #642 review). + _check_game_run_play_state(EditorInterface.is_playing_scene()) + + var peer_state := _peer.get_ready_state() + var transition := _observe_peer_state(peer_state, Time.get_ticks_msec()) + match peer_state: + WebSocketPeer.STATE_OPEN: + if not _connected: + _connected = true + _reconnect_attempt = 0 + log_buffer.log("connected to server") + _send_handshake() + ## Reset the edge detectors so the next _check_state_changes + ## tick re-emits any non-default scene/play state — the + ## handshake carries readiness only, so without this a + ## (re)connected server never learns the current scene. + _last_scene_path = "" + _last_play_state = false + connection_state_changed.emit(true) + + _drain_inbound_packets(_peer) + + _check_state_changes() + + if dispatcher: + for response in dispatcher.tick(): + _send_json(response) + + WebSocketPeer.STATE_CLOSED: + if _connected: + _connected = false + ## This peer reached OPEN, so its one close diagnostic is the + ## post-OPEN line below. Mark the peer consumed; otherwise a + ## stale reconnect delay leaves it in CLOSED for another frame + ## and the pre-OPEN branch emits a mislabeled duplicate. + _preopen_failure_logged_for_peer = true + _clear_on_disconnect() + var code := _peer.get_close_code() + var reason := _peer.get_close_reason() + var open_elapsed_sec := float(transition.get("previous_elapsed_sec", 0.0)) + var close_diagnostic := _note_post_open_close(code) + if close_diagnostic.is_empty(): + close_diagnostic = { + "reason_code": "connection_lost", + "reason": _close_reason_text(code, reason), + } + _transient_diagnostic = close_diagnostic + _log_reconnect_transition( + _postopen_close_diagnostic( + open_elapsed_sec, + code, + reason, + _url, + close_diagnostic, + ), + maxi(1, _reconnect_attempt), + true, + ) + connection_state_changed.emit(false) + elif not _preopen_failure_logged_for_peer: + _preopen_failure_logged_for_peer = true + ## A failed attempt never reached OPEN, so any post-OPEN reason + ## belongs to the previous peer and must not describe this one. + _transient_diagnostic.clear() + ## Initial failure is attempt 1 for diagnostics. Later transition + ## summaries are time-throttled so a missing listener stays + ## observable without tying log volume to attempt duration. + var failed_attempt := maxi(1, _reconnect_attempt) + var connecting_elapsed_sec := float( + transition.get("previous_elapsed_sec", 0.0) + ) + _log_reconnect_transition( + _preopen_failure_diagnostic( + failed_attempt, + connecting_elapsed_sec, + _reconnect_timer, + _peer.get_close_code(), + _peer.get_close_reason(), + _url + ), + failed_attempt, + ) + _reconnect_timer -= delta + if _reconnect_timer <= 0.0: + _attempt_reconnect() + + WebSocketPeer.STATE_CLOSING: + pass + WebSocketPeer.STATE_CONNECTING: + pass + +func get_session_id() -> String: + return _session_id + +## Drain up to PACKET_DRAIN_CAP_PER_TICK inbound packets and dispatch each +## via `_handle_message`. Anything past the cap stays in the peer's queue +## and gets picked up next tick. The cumulative spillover count is logged +## (via `log_buffer`) only when the cap was actually hit AND packets remain +## — sustained flood thus emits one log line per tick with the running +## total, while a normal-traffic frame stays silent. +## +## `peer` is untyped (Variant) so tests can inject a duck-typed fake with +## `get_available_packet_count()` + `get_packet()`. Production passes the +## real `_peer: WebSocketPeer`. +func _drain_inbound_packets(peer) -> Dictionary: + var drained := 0 + while peer.get_available_packet_count() > 0 and drained < PACKET_DRAIN_CAP_PER_TICK: + var raw: String = peer.get_packet().get_string_from_utf8() + _handle_message(raw) + drained += 1 + + var spilled := 0 + if drained >= PACKET_DRAIN_CAP_PER_TICK and peer.get_available_packet_count() > 0: + spilled = peer.get_available_packet_count() + _packet_spillover_total += spilled + if log_buffer: + log_buffer.log( + ( + "[backpressure] inbound drain capped at %d/tick;" + + " %d packets spilled to next frame (cumulative %d)" + ) + % [PACKET_DRAIN_CAP_PER_TICK, spilled, _packet_spillover_total] + ) + + return {"drained": drained, "spilled": spilled} + + +var is_connected: bool: + get: return _connected + + +func disconnect_from_server() -> void: + if _connected: + _peer.close(1000, "Plugin unloading") + _connected = false + ## This peer reached OPEN and is being closed deliberately, so neither + ## the post-OPEN nor pre-OPEN close diagnostic applies. Consume its one + ## diagnostic before the CLOSED tick observes the pre-cleared flag. + _preopen_failure_logged_for_peer = true + ## Pre-clearing _connected makes the STATE_CLOSED branch skip its + ## _clear_on_disconnect() — run it here so deliberate closes don't + ## leak the old server's version/deferred state into the next one. + _clear_on_disconnect() + connection_state_changed.emit(false) + + +## Reset per-connection state that was filled in by the previous server +## and must NOT bleed into the next one. `force_restart_server` swaps +## servers without reloading the plugin, so without this reset the dock +## would keep showing the killed server's version until the next ack. +## Also fires on plain reconnect-loop drops — correct either way. +func _clear_on_disconnect() -> void: + server_version = "" + ## Reset the spillover counter so a flood pattern from the previous + ## connection doesn't pollute the next one's `logs_read` baseline. + _packet_spillover_total = 0 + if dispatcher: + dispatcher.clear_deferred_responses() + ## Queued-but-unexecuted commands from the dead connection must not + ## run under the next one (#712): their requester's futures were + ## already failed server-side, so executing them after reconnect is + ## an uncorrelatable surprise write. + dispatcher.clear_command_queue() + + +## Full pre-free cleanup for plugin unload: stop _process, close the +## socket, and drop dispatcher/log_buffer refs so their Callable-held +## RefCounted handlers decref before plugin.gd clears _handlers. +## See issue #46 and plugin.gd::_exit_tree. +func teardown() -> void: + set_process(false) + disconnect_from_server() + dispatcher = null + log_buffer = null + + +func _connect_to_server() -> void: + _url = "ws://127.0.0.1:%d" % ws_port + var err := _peer.connect_to_url(_url) + if err != OK: + log_buffer.log("failed to initiate connection (error %d)" % err) + _observed_peer_state = _peer.get_ready_state() + _peer_state_entered_msec = Time.get_ticks_msec() + + +func _attempt_reconnect() -> void: + if connect_blocked: + _log_blocked_notice_once() + set_process(false) + return + var delay := _reconnect_delay_for_attempt(_reconnect_attempt) + _reconnect_attempt += 1 + _reconnect_timer = delay + _log_reconnect_transition( + "connecting to server (attempt %d)" % _reconnect_attempt, + _reconnect_attempt, + ) + ## Always create a fresh WebSocketPeer before reconnecting. A peer that has + ## reached STATE_CLOSED is terminal; reusing it can leave the editor stuck in + ## a quiet reconnect loop after the Python server restarts. + _peer = WebSocketPeer.new() + _preopen_failure_logged_for_peer = false + _peer.outbound_buffer_size = OUTBOUND_BUFFER_LIMIT_BYTES + ## Keep the reconnect peer symmetric with _ready()'s (#690). + _peer.inbound_buffer_size = OUTBOUND_BUFFER_LIMIT_BYTES + _connect_to_server() + + +func pause() -> void: + _pause_depth += 1 + + +func resume() -> void: + _pause_depth = maxi(0, _pause_depth - 1) + + +func pause_depth() -> int: + return _pause_depth + + +static func _reconnect_delay_for_attempt(attempt_index: int) -> float: + var delay_idx := mini(attempt_index, RECONNECT_DELAYS.size() - 1) + return RECONNECT_DELAYS[delay_idx] + + +static func _should_log_reconnect_transition( + attempt_number: int, + now_msec: int, + last_log_msec: int +) -> bool: + ## Keep the first few transitions visible, then emit at most one summary per + ## minute. Attempt-number throttling goes quiet for minutes when the engine + ## spends a long time in CONNECTING, which is the state this log explains. + return ( + attempt_number <= RECONNECT_VERBOSE_ATTEMPTS + or last_log_msec < 0 + or now_msec - last_log_msec >= RECONNECT_LOG_HEARTBEAT_MSEC + ) + + +func _log_reconnect_transition(message: String, attempt_number: int, force := false) -> void: + if not log_buffer: + return + var now_msec := Time.get_ticks_msec() + if not force and not _should_log_reconnect_transition( + attempt_number, + now_msec, + _last_reconnect_transition_log_msec, + ): + return + _last_reconnect_transition_log_msec = now_msec + log_buffer.log(message) + + +static func _preopen_failure_diagnostic( + attempt_number: int, + connecting_elapsed_sec: float, + retry_in_sec: float, + code: int, + reason: String, + url: String +) -> String: + var retry_text := "retrying now" + if retry_in_sec > 0.0: + retry_text = "retrying in %.0fs" % retry_in_sec + return ( + "connection attempt %d failed before OPEN after %.1fs; %s" + + " (code %d, reason %s, url %s)" + ) % [ + attempt_number, + maxf(0.0, connecting_elapsed_sec), + retry_text, + code, + _sanitized_close_reason(reason), + url, + ] + + +static func _postopen_close_diagnostic( + open_elapsed_sec: float, + code: int, + reason: String, + url: String, + diagnostic: Dictionary = {} +) -> String: + var message := ( + "connection lost after being open for %.1fs (code %d, reason %s, url %s); reconnecting" + % [maxf(0.0, open_elapsed_sec), code, _sanitized_close_reason(reason), url] + ) + match str(diagnostic.get("recovery_action", "")): + "retry_authenticated": + message += " with the current auth token (rejection 1/%d)" % AUTH_MISMATCH_FALLBACK_CLOSES + "retry_tokenless": + message += " with a token-less handshake (rejection %d/%d)" % [ + int(diagnostic.get("occurrence", AUTH_MISMATCH_FALLBACK_CLOSES)), + AUTH_MISMATCH_FALLBACK_CLOSES, + ] + return message + + +static func _sanitized_close_reason(reason: String) -> String: + var reason_label := reason.strip_edges() + if reason_label.is_empty(): + return "" + return reason_label.replace("\r", "\\r").replace("\n", "\\n") + + +static func _close_reason_text(code: int, reason: String) -> String: + return "Close code %d: %s" % [code, _sanitized_close_reason(reason)] + + +## Token-mismatch fallback (#690 follow-up). The server's auth token is +## fixed for its whole launch, so redialing with the same wrong token can +## never succeed — without this the reconnect loop 4003s forever. The +## reproduced multi-editor failure: a duplicate spawn overwrites the shared +## managed-server record with its fresh token, dies unable to bind, and +## this editor is left holding a token the surviving server never saw. +## After AUTH_MISMATCH_FALLBACK_CLOSES consecutive rejections, drop to a +## token-less handshake, which the server accepts by design (older plugins +## and adopted servers have no token, and the field is attacker-omittable — +## see websocket.py; omitting it gives up no security). Scope note: only +## this connection's copy of the token is dropped — the plugin static and +## the persisted record heal via the startup walk's adoption arms. +func _note_post_open_close(code: int) -> Dictionary: + if code != CLOSE_CODE_AUTH_TOKEN_MISMATCH or auth_token.is_empty(): + _auth_mismatch_closes = 0 + return {} + _auth_mismatch_closes += 1 + var occurrence := _auth_mismatch_closes + if _auth_mismatch_closes < AUTH_MISMATCH_FALLBACK_CLOSES: + return { + "reason_code": "auth_token_mismatch", + "reason": "Server rejected the editor auth token; retrying once in case of a server-swap race.", + "occurrence": occurrence, + "recovery_action": "retry_authenticated", + } + auth_token = "" + _auth_mismatch_closes = 0 + return { + "reason_code": "auth_token_mismatch", + "reason": "Server rejected the editor auth token twice; the next handshake will omit it.", + "occurrence": occurrence, + "recovery_action": "retry_tokenless", + } + + +## Record one peer-state transition and return the duration of the state that +## just ended. Kept separate from `_transport_status_snapshot` so tests can +## exercise the status contract with injected values and no live socket. +func _observe_peer_state(state: int, now_msec: int) -> Dictionary: + if _peer_state_entered_msec <= 0: + _observed_peer_state = state + _peer_state_entered_msec = now_msec + return {"changed": false, "previous_elapsed_sec": 0.0} + if state == _observed_peer_state: + return {"changed": false, "previous_elapsed_sec": 0.0} + var previous_elapsed_sec := maxf( + 0.0, + (now_msec - _peer_state_entered_msec) / 1000.0, + ) + var previous_state := _observed_peer_state + _observed_peer_state = state + _peer_state_entered_msec = now_msec + return { + "changed": true, + "previous_state": previous_state, + "previous_elapsed_sec": previous_elapsed_sec, + } + + +## Pure transport-status contract shared by the connection log and dock. It +## intentionally knows nothing about lifecycle diagnoses; the thin public +## wrapper below applies generic `blocked`, while server_lifecycle.gd remains +## authoritative for exact terminal states such as incompatible/foreign port. +static func _transport_status_snapshot( + state: int, + state_elapsed_sec: float, + attempt: int, + retry_timer: float +) -> Dictionary: + var phase := "closing" + match state: + WebSocketPeer.STATE_OPEN: + phase = "connected" + WebSocketPeer.STATE_CONNECTING: + phase = "connecting" + WebSocketPeer.STATE_CLOSED: + phase = "retrying" + WebSocketPeer.STATE_CLOSING: + phase = "closing" + var snapshot := { + "phase": phase, + "attempt": maxi(0, attempt), + "state_elapsed_sec": maxf(0.0, state_elapsed_sec), + } + ## `retry_in_sec` is deliberately unrepresentable outside CLOSED-state + ## backoff. CONNECTING is an in-flight attempt, never "retrying in 0s". + if phase == "retrying": + snapshot["retry_in_sec"] = maxf(0.0, retry_timer) + return snapshot + + +func get_transport_status() -> Dictionary: + var now_msec := Time.get_ticks_msec() + var elapsed_sec := 0.0 + if _peer_state_entered_msec > 0: + elapsed_sec = maxf(0.0, (now_msec - _peer_state_entered_msec) / 1000.0) + var snapshot := _transport_status_snapshot( + _peer.get_ready_state(), + elapsed_sec, + _reconnect_attempt, + _reconnect_timer, + ) + if connect_blocked: + snapshot["phase"] = "blocked" + snapshot.erase("retry_in_sec") + snapshot["reason_code"] = "connection_blocked" + if not connect_block_reason.is_empty(): + snapshot["reason"] = connect_block_reason + elif not _transient_diagnostic.is_empty(): + for key in _transient_diagnostic: + snapshot[key] = _transient_diagnostic[key] + return snapshot + + +func _log_blocked_notice_once() -> void: + if _blocked_notice_logged: + return + _blocked_notice_logged = true + if log_buffer and not connect_block_reason.is_empty(): + log_buffer.log(connect_block_reason) + + +func _send_handshake() -> void: + _last_readiness = get_readiness() + _send_json(_build_handshake()) + + +## Split from _send_handshake so tests can assert the payload shape +## without a live WebSocket peer. +func _build_handshake() -> Dictionary: + var payload := { + "type": "handshake", + "session_id": _session_id, + "godot_version": Engine.get_version_info().get("string", "unknown"), + "project_path": ProjectSettings.globalize_path("res://"), + "plugin_version": ClientConfigurator.get_plugin_version(), + "protocol_version": 1, + "readiness": _last_readiness, + "editor_pid": OS.get_process_id(), + "server_launch_mode": ClientConfigurator.get_server_launch_mode(), + } + ## Omit rather than send "" — the server treats an ABSENT token as a + ## compat-accepted older plugin, but a PRESENT wrong one as hostile. + if not auth_token.is_empty(): + payload["auth_token"] = auth_token + return payload + + +## Classify one raw inbound frame. Shared by the normal dispatch path +## (`_handle_message`, which enqueues commands) and the exclusive-run +## service path (`_service_handle_message`, which rejects them) — one +## parser, two sinks, so the paths can't drift. `kind` is one of: +## "ack", "command", "malformed_command", "ignore". +func _classify_message(raw: String) -> Dictionary: + var parsed = JSON.parse_string(raw) + if parsed == null: + push_warning("MCP: failed to parse message: %s" % raw) + return {"kind": "ignore", "parsed": null} + if not (parsed is Dictionary): + return {"kind": "ignore", "parsed": null} + if parsed.get("type", "") == "handshake_ack": + return {"kind": "ack", "parsed": parsed} + if parsed.has("request_id") and parsed.has("command"): + if ( + parsed.get("request_id") is String + and parsed.get("command") is String + and (not parsed.has("params") or parsed.get("params") is Dictionary) + ): + return {"kind": "command", "parsed": parsed} + return {"kind": "malformed_command", "parsed": parsed} + return {"kind": "ignore", "parsed": parsed} + + +func _handle_message(raw: String) -> void: + var classified := _classify_message(raw) + match classified["kind"]: + "ack": + _handle_handshake_ack(classified["parsed"]) + "command": + if dispatcher: + dispatcher.enqueue(classified["parsed"]) + "malformed_command": + _reply_malformed_command(classified["parsed"]) + + +func _handle_handshake_ack(parsed: Dictionary) -> void: + server_version = str(parsed.get("server_version", "")) + ## The server accepted our handshake — any token-mismatch streak is + ## over; a later unrelated 4003 starts a fresh one. + _auth_mismatch_closes = 0 + _transient_diagnostic.clear() + + +## Never enqueue a malformed command frame: the dispatcher's typed casts +## would error on the queue head every tick, wedging every later command +## behind it. Reply with an error when the request_id is usable so the +## server's pending future resolves instead of waiting out the full +## command timeout. +func _reply_malformed_command(parsed: Dictionary) -> void: + push_warning("MCP: dropping malformed command frame (request_id/command must be String, params a Dictionary)") + var rid: Variant = parsed.get("request_id") + if rid is String and not String(rid).is_empty(): + var response := ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Malformed command frame: request_id/command must be strings and params a dict" + ) + response["request_id"] = rid + response["readiness"] = get_readiness() + _stamp_error_watermark(response) + _send_json(response) + + +## Send a state event to the server (not a command response). +func send_event(event_name: String, data: Dictionary = {}) -> bool: + return _send_json({"type": "event", "event": event_name, "data": data}) + + +## Push a command response for a request_id whose handler deferred its reply +## (see McpDispatcher.DEFERRED_RESPONSE). `payload` must carry either a `data` +## or `error` field in the same shape handlers normally return. +func send_deferred_response(request_id: String, payload: Dictionary) -> void: + if dispatcher != null and not dispatcher.has_pending_deferred_response(request_id): + if log_buffer: + log_buffer.log("[defer] dropped late response for expired request %s" % request_id) + return + var response := payload.duplicate() + response["request_id"] = request_id + if not response.has("status"): + response["status"] = "ok" if payload.has("data") else "error" + ## Symmetric with McpDispatcher::_dispatch — stamp live readiness on the + ## deferred reply so the server's session cache self-heals from any + ## response, not just the synchronous ones. Lets `project_stop` (the + ## main deferred-response producer) stay correct even if its bespoke + ## `readiness_after` payload field were ever dropped. + if not response.has("readiness"): + response["readiness"] = get_readiness() + if not response.has("error_watermark"): + _stamp_error_watermark(response) + if _send_json(response) and dispatcher != null: + dispatcher.complete_deferred_response(request_id) + + +## Result of one cooperative transport-servicing pass during an exclusive +## synchronous run (currently only the test runner). PAUSED is an +## invariant violation for callers, not a healthy state: a pause held +## across servicing checkpoints would silently starve the heartbeat. +enum ServiceStatus { SERVICED, DISCONNECTED, PAUSED, BLOCKED } + +## Cumulative cap on application packets processed across ONE exclusive +## run. Counts every drained packet — valid command, malformed frame, or +## ack-like — so no frame kind evades it. Past the cap the connection is +## closed (1013): bounded rejects, never unbounded stale buffering. 2048 +## leaves headroom under Godot's default max_queued_packets (4096) and +## sits above stormtest's ~1000-call default workload; tune with +## telemetry/benchmarks if rejection traffic ever extends a checkpoint. +const EXCLUSIVE_RUN_PACKET_CAP := 2048 +const CLOSE_CODE_EXCLUSIVE_RUN_FLOOD := 1013 +## Reject-log throttle: first few rejects verbatim, then periodic totals. +const _SERVICE_REJECT_LOG_FIRST := 5 +const _SERVICE_REJECT_LOG_EVERY := 100 + +## Service the WebSocket transport from inside a long synchronous handler +## (an "exclusive run" — the test runner). The editor main thread is +## blocked, so `_process` cannot poll; without this the server keepalive +## (20s ping interval / 20s timeout) closes the session mid-run. See +## docs/test-run-transport-starvation-plan.md. +## +## Contract — do NOT extend this method to dispatch: +## - `WebSocketPeer.poll()` has no heartbeat-only mode; it also buffers +## application frames. Buffering them past this call would replay them +## STALE after their server-side futures expire (the #712 hazard), so +## every drained command frame is REJECTED immediately with a retryable +## EDITOR_NOT_READY / EDITOR_TEST_RUNNING error instead. +## - Drains to quiescence: poll → drain everything available → poll again, +## until no packets remain. A full packet queue could hide a ping deeper +## in the TCP stream, so nothing may spill to a later checkpoint. +## - `run_state` is caller-owned mutable state carrying the cumulative +## packet counter under "packets_serviced" — no connection-global +## lifecycle that could leak if the run dies. +func service_transport_during_exclusive_run(run_state: Dictionary) -> ServiceStatus: + if connect_blocked: + return ServiceStatus.BLOCKED + if pause_processing: + return ServiceStatus.PAUSED + while true: + _peer.poll() + if _peer.get_ready_state() != WebSocketPeer.STATE_OPEN: + return ServiceStatus.DISCONNECTED + if _peer.get_available_packet_count() == 0: + return ServiceStatus.SERVICED + while _peer.get_available_packet_count() > 0: + var raw: String = _peer.get_packet().get_string_from_utf8() + if _service_note_packet(run_state): + if log_buffer: + log_buffer.log( + "[busy] packet flood during test run (%d > cap %d) — closing connection" + % [int(run_state.get("packets_serviced", 0)), EXCLUSIVE_RUN_PACKET_CAP] + ) + _peer.close(CLOSE_CODE_EXCLUSIVE_RUN_FLOOD, "command flood during test run") + return ServiceStatus.DISCONNECTED + _service_handle_message(raw, int(run_state.get("packets_serviced", 0))) + ## Unreachable: every exit above returns. Keeps the typed signature happy. + return ServiceStatus.SERVICED + + +## Shared between-phase checkpoint for exclusive runs: deadline first +## (cheap), then transport servicing via `service_cb`. Returns "" to +## continue, or a terminal outcome: "timeout" | "transport_lost" | +## "paused". Static and stateless so the runner's between-test checkpoints +## and the handler's discovery checkpoints share ONE outcome mapping — +## PAUSED is abort-worthy (a held pause would silently skip every later +## poll and starve the heartbeat), and DISCONNECTED/BLOCKED both mean "no +## live transport". +static func exclusive_run_checkpoint( + service_cb: Callable, deadline_ticks_ms: int, run_state: Dictionary +) -> String: + if deadline_ticks_ms > 0 and Time.get_ticks_msec() >= deadline_ticks_ms: + return "timeout" + if not service_cb.is_valid(): + return "" + var status: int = service_cb.call(run_state) + if status == ServiceStatus.SERVICED: + return "" + if status == ServiceStatus.PAUSED: + return "paused" + return "transport_lost" + + +## Count one application packet against the exclusive-run cap. Counts EVERY +## drained packet regardless of kind (valid command, malformed, ack-like) +## so no frame kind can evade the flood limit. Returns true once the cap is +## exceeded — the caller closes the connection. +static func _service_note_packet(run_state: Dictionary) -> bool: + var count: int = int(run_state.get("packets_serviced", 0)) + 1 + run_state["packets_serviced"] = count + return count > EXCLUSIVE_RUN_PACKET_CAP + + +## Exclusive-run sink for `_classify_message`: acks are still processed, +## malformed frames keep their normal reply, and valid commands are +## rejected without touching the dispatcher. +func _service_handle_message(raw: String, packets_serviced: int) -> void: + var classified := _classify_message(raw) + match classified["kind"]: + "ack": + _handle_handshake_ack(classified["parsed"]) + "command": + _service_reject_command(classified["parsed"], packets_serviced) + "malformed_command": + _reply_malformed_command(classified["parsed"]) + + +func _service_reject_command(parsed: Dictionary, packets_serviced: int) -> void: + _send_json(_build_service_reject(parsed)) + if log_buffer and ( + packets_serviced <= _SERVICE_REJECT_LOG_FIRST + or packets_serviced % _SERVICE_REJECT_LOG_EVERY == 0 + ): + ## Ring-buffer only (echo=false): a flood must not bury the console. + log_buffer.log( + "[busy] rejected '%s' during test run (packet %d)" + % [parsed.get("command", ""), packets_serviced], + false, + ) + + +## Build the busy-reject response for a valid command frame that arrived +## mid-run. Split from the send so tests can assert the exact wire shape. +func _build_service_reject(parsed: Dictionary) -> Dictionary: + var command: String = parsed.get("command", "") + var response := ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_TEST_RUNNING, + ( + "A test run is in progress on this editor — '%s' was not executed. " + + "Retry when the run completes, or fetch results afterward with " + + "test_manage(op=\"results_get\")." + ) % command, + true, + ) + response["request_id"] = parsed.get("request_id", "") + response["readiness"] = get_readiness() + _stamp_error_watermark(response) + return response + + +func _hook_editor_signals() -> void: + # Scene change: poll in _process since there's no direct signal for scene switch + # Play state: EditorInterface signals + EditorInterface.get_editor_settings() # ensure interface is ready + _last_scene_path = _get_current_scene_path() + _last_play_state = EditorInterface.is_playing_scene() + _last_play_state_for_run = _last_play_state + + +var _last_scene_path := "" +var _last_play_state := false +## Separate edge tracker for game-run bookkeeping: _last_play_state only +## advances when the play_state_changed event sends successfully, but ending +## run tracking must not depend on the websocket being up. +var _last_play_state_for_run := false +var _last_readiness := "" + + +## Compute current editor readiness from live Godot state. +static func get_readiness() -> String: + if EditorInterface.get_resource_filesystem().is_scanning(): + return "importing" + if EditorInterface.is_playing_scene(): + return "playing" + if EditorInterface.get_edited_scene_root() == null: + return "no_scene" + return "ready" + + +## Check for scene/play state changes each frame (lightweight polling). +func _check_state_changes() -> void: + var scene_path := _get_current_scene_path() + if scene_path != _last_scene_path: + if send_event("scene_changed", {"current_scene": scene_path}): + _last_scene_path = scene_path + if log_buffer: + log_buffer.log("[event] scene_changed -> %s" % scene_path) + + var playing := EditorInterface.is_playing_scene() + if playing != _last_play_state: + var state := "playing" if playing else "stopped" + if send_event("play_state_changed", {"play_state": state}): + _last_play_state = playing + if log_buffer: + log_buffer.log("[event] play_state_changed -> %s" % state) + + var readiness := get_readiness() + if readiness != _last_readiness: + if send_event("readiness_changed", {"readiness": readiness}): + _last_readiness = readiness + if log_buffer: + ## echo=false: readiness flips on every filesystem scan + ## (each import cycles importing -> ready), so echoing to + ## console spams every install during normal editing (#626). + ## The line stays in the ring for the dock's log panel. + log_buffer.log("[event] readiness -> %s" % readiness, false) + + +## Stopped↔playing edge handler for game-run bookkeeping. Handles both the +## stopped→playing edge (adopting editor-started runs) and the playing→stopped +## edge (ending runs). Runs every process tick (any socket state) so a +## self-quit game's run ends even while the transport is down or reconnecting. +func _check_game_run_play_state(playing: bool) -> void: + if playing == _last_play_state_for_run: + return + if debugger_plugin != null: + if playing: + ## #891: adopt a play the user started from the editor. The + ## debugger session's own adoption in `_setup_session` only fires + ## when `is_playing_scene()` is already true when the session + ## attaches, which an F5/F6 launch routinely misses; this edge is + ## the other half of that race. Polled every tick regardless of + ## socket state, same as the stop edge below. + debugger_plugin.note_editor_play_started() + else: + debugger_plugin.note_editor_play_stopped() + _last_play_state_for_run = playing + + +func _get_current_scene_path() -> String: + var scene_root := EditorInterface.get_edited_scene_root() + return scene_root.scene_file_path if scene_root else "" + + +func _send_json(data: Dictionary) -> bool: + if not _connected: + return false + var text := JSON.stringify(data) + var buffered_bytes := _peer.get_current_outbound_buffered_amount() + ## `send_text` encodes the string to UTF-8 internally, so an exact + ## `to_utf8_buffer().size()` here would encode every payload twice. Almost + ## all payloads sit far below the limit, so gate on a cheap upper bound + ## (<= 4 UTF-8 bytes per code point) and only pay for the exact count when + ## the estimate lands near the backpressure ceiling. + if _might_exceed_outbound_backpressure(buffered_bytes, text.length()): + var message_bytes := text.to_utf8_buffer().size() + if _would_exceed_outbound_backpressure(buffered_bytes, message_bytes): + return _handle_outbound_backpressure(data, buffered_bytes, message_bytes) + var err := _peer.send_text(text) + if err != OK: + if log_buffer: + log_buffer.log("[send] websocket send_text failed: %s" % error_string(err)) + return false + return true + + +static func _would_exceed_outbound_backpressure(buffered_bytes: int, message_bytes: int) -> bool: + return buffered_bytes + message_bytes > OUTBOUND_BUFFER_LIMIT_BYTES + + +## Cheap pre-check on the code-point count: UTF-8 uses at most 4 bytes per code +## point, so `char_count * 4` upper-bounds the encoded size. When even that +## upper bound fits under the ceiling the payload is definitely safe and we can +## skip the exact encode; only a positive here warrants `to_utf8_buffer()`. +static func _might_exceed_outbound_backpressure(buffered_bytes: int, char_count: int) -> bool: + return buffered_bytes + char_count * 4 > OUTBOUND_BUFFER_LIMIT_BYTES + + +func _handle_outbound_backpressure( + data: Dictionary, + buffered_bytes: int, + message_bytes: int, +) -> bool: + var request_id: String = data.get("request_id", "") + if request_id.is_empty(): + if log_buffer: + log_buffer.log( + "[send] requestless payload blocked by websocket backpressure " + + "(buffered=%d, message=%d, limit=%d)" + % [buffered_bytes, message_bytes, OUTBOUND_BUFFER_LIMIT_BYTES] + ) + return false + + var err_response := _make_backpressure_error(request_id, buffered_bytes, message_bytes) + _stamp_error_watermark(err_response) + var err_text := JSON.stringify(err_response) + var err_bytes := err_text.to_utf8_buffer().size() + if _would_exceed_outbound_backpressure(buffered_bytes, err_bytes): + if log_buffer: + log_buffer.log( + "[send] dropped response for request %s due to websocket backpressure " + + "(buffered=%d, message=%d, limit=%d)" + % [request_id, buffered_bytes, message_bytes, OUTBOUND_BUFFER_LIMIT_BYTES] + ) + return false + + var send_err := _peer.send_text(err_text) + if send_err != OK: + if log_buffer: + log_buffer.log("[send] websocket backpressure error send failed: %s" % error_string(send_err)) + return false + if log_buffer: + log_buffer.log( + "[send] %s -> error: outbound websocket backpressure" + % data.get("command", "response") + ) + return true + + +static func _make_backpressure_error( + request_id: String, + buffered_bytes: int, + message_bytes: int, +) -> Dictionary: + return { + "request_id": request_id, + "status": "error", + "data": {}, + ## Stamp readiness on the backpressure error too — the server's + ## per-response self-heal applies to every response shape the + ## plugin emits, and the next legitimate reply may already be + ## queued behind this one. + "readiness": get_readiness(), + "error": { + "code": ErrorCodes.INTERNAL_ERROR, + "message": ( + "Outbound WebSocket buffer is full; dropped response before queueing " + + "more data. Retry with a smaller payload (for screenshots, lower " + + "max_resolution or set include_image=false)." + ), + "data": { + "buffered_bytes": buffered_bytes, + "message_bytes": message_bytes, + "limit_bytes": OUTBOUND_BUFFER_LIMIT_BYTES, + }, + }, + } + + +func _stamp_error_watermark(response: Dictionary) -> void: + McpSurfacedErrorTracker.stamp_watermark(response, surfaced_error_tracker) + + +## Build a human-readable session ID of form "@<4hex>" from the project path. +## The slug is derived from the project directory name so agents can recognize +## which editor they're targeting; the hex suffix disambiguates same-project twins. +static func _make_session_id(project_path: String) -> String: + var base := project_path.rstrip("/\\").get_file() + if base == "": + base = "project" + var slug := _slugify(base) + if slug == "": + slug = "project" + var suffix := _rand_hex(4) + return "%s@%s" % [slug, suffix] + + +static func _slugify(s: String) -> String: + var out := "" + var prev_dash := false + for c in s.to_lower(): + if (c >= "a" and c <= "z") or (c >= "0" and c <= "9"): + out += c + prev_dash = false + elif not prev_dash and out != "": + out += "-" + prev_dash = true + return out.trim_suffix("-") + + +static func _rand_hex(n: int) -> String: + var bytes := PackedByteArray() + var byte_count := int(ceil(float(n) / 2.0)) + for i in byte_count: + bytes.append(randi() % 256) + return bytes.hex_encode().substr(0, n) diff --git a/addons/godot_ai/connection.gd.uid b/addons/godot_ai/connection.gd.uid new file mode 100644 index 0000000..ff78405 --- /dev/null +++ b/addons/godot_ai/connection.gd.uid @@ -0,0 +1 @@ +uid://bmnk8rsotiks2 diff --git a/addons/godot_ai/custom_tools/custom_tool_wrapper.gd b/addons/godot_ai/custom_tools/custom_tool_wrapper.gd new file mode 100644 index 0000000..45ace63 --- /dev/null +++ b/addons/godot_ai/custom_tools/custom_tool_wrapper.gd @@ -0,0 +1,66 @@ +@tool +extends RefCounted + +## bridge between dispatcher and addon handler + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +var _spec: McpCustomToolSpec +var _locator: McpServiceLocator +var _handler_instance = null # lazily loaded from _spec.script_path + +func _init(spec: McpCustomToolSpec, locator: McpServiceLocator) -> void: + _spec = spec + _locator = locator + +## Invoked by dispatcher._call_handler as .call(params) — SINGLE ARG. +## Internally splits into (clean_params, ctx) for the addon handler. +func invoke(params: Dictionary) -> Dictionary: + ## Dock enable/disable gate: a disabled tool is dropped from the + ## catalog push, but a client holding a stale list (or batch_execute) + ## can still name it — reject at dispatch too. + var registry := McpToolRegistry.get_instance() + if registry != null and not registry.is_tool_enabled(_spec.name): + return ErrorCodes.make(ErrorCodes.CUSTOM_TOOL_DISABLED, + "Custom tool '%s' is disabled in the Godot AI dock" % _spec.name) + ## Readiness gate (https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #1): block writes during play/import. + ## Checked BEFORE the lazy load so a gated tool's handler script (and any + ## _init side effects) never runs while the editor is busy. + var _readiness := McpConnection.get_readiness() + if _spec.requires_writable and (_readiness == "importing" or _readiness == "playing"): + return ErrorCodes.make(ErrorCodes.EDITOR_NOT_READY, "Editor is '%s' — write blocked for custom tool '%s'" % [_readiness, _spec.name]) + if _handler_instance == null: + var script := load(_spec.script_path) as GDScript + if script == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Cannot load %s" % _spec.script_path) + _handler_instance = script.new() # no-arg; per-call context arrives via ctx + if not _handler_instance.has_method(_spec.method): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "%s has no method '%s' for custom tool '%s'" % [_spec.script_path, _spec.method, _spec.name]) + ## Extract _request_id (dispatcher injected it) and strip from params + ## so the addon sees clean params matching its declared schema (https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #2). + var request_id: String= params.get("_request_id", "") + var clean_params := params.duplicate() + clean_params.erase("_request_id") + ## Construct ctx with transport metadata + live-object locator. + var ctx := McpCallContext.new() + ctx.request_id = request_id + ctx.session_id = _locator.get_connection().get_session_id() + ctx.spec = _spec + ctx.attach_locator(_locator) + ctx.deadline_msec = Time.get_ticks_msec() + _spec.timeout_ms + var result: Dictionary = _handler_instance.call(_spec.method, clean_params, ctx) + if result.get("_deferred", false): + ## Enforce the declared contract: batch_execute and the server's + ## timeout budget both trust spec.deferred, so a non-deferred spec + ## whose handler defers anyway would report success while its real + ## reply arrives uncorrelated later. + if not _spec.deferred: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Custom tool '%s' returned a deferred response but its spec declares deferred=false" % _spec.name) + if _spec.timeout_ms > 0: + ## Handlers return the SHARED McpDispatcher.DEFERRED_RESPONSE + ## const, which Godot makes read-only — stamping the per-spec + ## budget on it directly is a script error that aborts the call. + result = result.duplicate() + result["_deferred_timeout_ms"] = _spec.timeout_ms + return result diff --git a/addons/godot_ai/custom_tools/custom_tool_wrapper.gd.uid b/addons/godot_ai/custom_tools/custom_tool_wrapper.gd.uid new file mode 100644 index 0000000..ff02cb9 --- /dev/null +++ b/addons/godot_ai/custom_tools/custom_tool_wrapper.gd.uid @@ -0,0 +1 @@ +uid://b68uel6lsb7jr diff --git a/addons/godot_ai/custom_tools/mcp_call_context.gd b/addons/godot_ai/custom_tools/mcp_call_context.gd new file mode 100644 index 0000000..6e40d86 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_call_context.gd @@ -0,0 +1,44 @@ +@tool +class_name McpCallContext +extends RefCounted + +## Per-call context handed to addon handlers. +## +## STABLE addon-facing surface (see AGENTS.md — published class_names are +## permanent compat surface): `request_id`, `session_id`, `deadline_msec`, +## `spec` (read-only), `is_expired()`, `send_deferred()`. Anything +## underscore-prefixed is internal wiring owned by the wrapper and may +## change between releases — addons must not reach into it. Keeping this +## surface narrow now is deliberate: it is much cheaper than breaking +## published addons later (#875 review). + +var request_id: String = "" +var session_id: String = "" +var deadline_msec: int = 0 +var spec: McpCustomToolSpec = null + +## Internal — injected by custom_tool_wrapper via attach_locator(). Do not +## use from addon code; the capability methods below are the contract. +var _locator: McpServiceLocator = null + + +## Internal — called by the wrapper during ctx construction. +func attach_locator(locator: McpServiceLocator) -> void: + _locator = locator + + +func is_expired() -> bool: + if deadline_msec == 0: + return false + return Time.get_ticks_msec() > deadline_msec + + +func send_deferred(payload: Dictionary) -> void: + if _locator == null: + push_error("McpCallContext: cannot send deferred response, locator is null") + return + var conn := _locator.get_connection() + if conn == null: + push_error("McpCallContext: cannot send deferred response, connection is null") + return + conn.send_deferred_response(request_id, payload) diff --git a/addons/godot_ai/custom_tools/mcp_call_context.gd.uid b/addons/godot_ai/custom_tools/mcp_call_context.gd.uid new file mode 100644 index 0000000..e37765b --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_call_context.gd.uid @@ -0,0 +1 @@ +uid://bdgqe4gyian2o diff --git a/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd b/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd new file mode 100644 index 0000000..8c5a551 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd @@ -0,0 +1,66 @@ +@tool +class_name McpCustomToolSpec +extends RefCounted + +## Descriptor for one custom tool registered by an addon. Mirrors the +## clients/_base.gd data-only descriptor pattern: fields are set by the +## caller, NO Callables (handler instance is materialized lazily by the +## dispatcher from script_path + method, so hot-reload can't SEGV a +## worker mid-call — same rationale as McpClient, issue #229). +## +## Construction: instantiate and set fields, then pass to +## McpToolRegistry.register(spec). Do NOT subclass — custom tools are +## dynamic (one addon may register several), not file-system-scanned +## like clients. + +# --- identity --- +var name: String = "" ## tool name, e.g. "gdunit_run". Must not shadow a built-in. +var description: String = "" ## shown to the agent by the MCP server +var params_schema: Dictionary = {} ## JSON Schema; advertised to the agent for shaping calls. Params are forwarded UNVALIDATED — the handler must validate its own input. + +# --- handler resolution (lazy materialization by dispatcher) --- +var script_path: String = "" ## "res://addons/.../handler.gd"; load()ed on first call +var method: StringName = &"" ## method on the handler; signature: (params: Dictionary, ctx: McpCallContext) -> Dictionary + +# --- source identity (https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #8) --- +var source_path: String = "" ## "plugin.cfg" path: "res://addons/gdunit4_mcp/plugin.cfg". Same path = same addon (replace allowed); different path colliding = reject + dock warning. NOTE: self-declared — a collision/ownership policy for cooperating addons, NOT a security boundary (any in-editor code can claim any path). +var source: String = "" ## display: "gdunit4_mcp". If empty, registry reads [plugin] name from source_path. + +# --- exposure --- +var promoted: bool = false ## opt-in: ask the server to ALSO register this tool as a first-class MCP tool ("custom_") with params_schema attached, so agents get native schemas/validation instead of the custom_manage indirection. The server caps promoted count; overflow stays reachable via custom_manage. + +# --- execution contract --- +var timeout_ms: int = 4500 ## deferred timeout → DEFERRED_TIMEOUT_MS_BY_COMMAND["custom:"] +var deferred: bool = false ## true → handler may return DEFERRED_RESPONSE, push later via ctx.send_deferred(payload) +var requires_writable: bool = false ## https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #1: readiness gate. false → reads run any time; true → blocks during play/import +var undoable: bool = false ## https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #6: must be true to participate in undo=true batch_execute + +# --- budgets (https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #5, enforced at register time) --- +const MAX_DESCRIPTION_CHARS := 600 +const MAX_SCHEMA_BYTES := 8192 +const MAX_TIMEOUT_MS := 120000 +const MIN_TIMEOUT_MS := 500 + + +## Returns an array of human-readable validation errors (empty = valid). +## Called by McpToolRegistry.register() and usable standalone for early +## feedback in addon _enter_tree before the registry is even live. +func validate() -> Array[String]: + var errors: Array[String] = [] + if name.is_empty(): + errors.append("name is empty\n") + if not name.is_valid_ascii_identifier(): + errors.append("name '%s' is not a valid identifier\n" % name) + if description.length() > MAX_DESCRIPTION_CHARS: + errors.append("description exceeds %d chars\n" % MAX_DESCRIPTION_CHARS) + if JSON.stringify(params_schema).to_utf8_buffer().size() > MAX_SCHEMA_BYTES: + errors.append("params_schema exceeds %d bytes\n" % MAX_SCHEMA_BYTES) + if script_path.is_empty() or not ResourceLoader.exists(script_path): + errors.append("script_path '%s' does not exist" % script_path) + if method.is_empty(): + errors.append("method is empty") + if timeout_ms < MIN_TIMEOUT_MS or timeout_ms > MAX_TIMEOUT_MS: + errors.append("timeout_ms %d out of range [%d, %d]" % [timeout_ms, MIN_TIMEOUT_MS, MAX_TIMEOUT_MS]) + if source_path.is_empty() or not source_path.ends_with("plugin.cfg") or not FileAccess.file_exists(source_path): + errors.append("source_path '%s' must be an existing plugin.cfg path" % source_path) + return errors diff --git a/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd.uid b/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd.uid new file mode 100644 index 0000000..42fe408 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_custom_tool_spec.gd.uid @@ -0,0 +1 @@ +uid://h7k8j5tpscwy diff --git a/addons/godot_ai/custom_tools/mcp_service_locator.gd b/addons/godot_ai/custom_tools/mcp_service_locator.gd new file mode 100644 index 0000000..4e50ac5 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_service_locator.gd @@ -0,0 +1,16 @@ +@tool +class_name McpServiceLocator +extends RefCounted + +var _connection: McpConnection = null +var _log_buffer: McpLogBuffer = null + +func setup(connection: McpConnection, log_buffer: McpLogBuffer) -> void: + _connection = connection + _log_buffer = log_buffer + +func get_connection() -> McpConnection: + return _connection + +func get_log_buffer() -> McpLogBuffer: + return _log_buffer diff --git a/addons/godot_ai/custom_tools/mcp_service_locator.gd.uid b/addons/godot_ai/custom_tools/mcp_service_locator.gd.uid new file mode 100644 index 0000000..1815007 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_service_locator.gd.uid @@ -0,0 +1 @@ +uid://dfvphmvo7en3i diff --git a/addons/godot_ai/custom_tools/mcp_tool_registry.gd b/addons/godot_ai/custom_tools/mcp_tool_registry.gd new file mode 100644 index 0000000..407d405 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_tool_registry.gd @@ -0,0 +1,277 @@ +@tool +class_name McpToolRegistry +extends RefCounted + +## Central registry for custom tools. INSTANCE SINGLETON (not static) — +## unlike McpClientRegistry which is read-only/loaded-once/query-only (static +## is fine there), this registry is MUTABLE, has LIFECYCLE (clear on teardown), +## must EMIT SIGNALS to multiple consumers, and needs DEPENDENCY INJECTION +## (dispatcher, locator). Static funcs can't emit instance signals in GDScript, +## and static vars create #46 freed-instance regressions across reloads. +## +## plugin.gd owns the instance (new + setup + clear). Addons access it via +## get_instance() so they don't hold a reference. Source identity is +## spec.source_path (explicit plugin.cfg path, https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #8) — same source_path +## = same addon (hot-reload replace); different source_path colliding on +## a name = reject + dock warning. + +## singleton instance +static var _instance: McpToolRegistry = null + +## Singleton accessor for addons. Returns null if Godot AI isn't loaded. +static func get_instance() -> McpToolRegistry: + return _instance + + +## Instance fields (NOT static — lifecycle tied to plugin.gd) +var _specs: Dictionary = {} # name -> McpCustomToolSpec +var _by_source_path: Dictionary = {} # source_path -> Array[McpCustomToolSpec] (batch unregister index) +var _dispatcher: McpDispatcher = null # injected by plugin.gd via setup() +var _locator: McpServiceLocator = null # injected by plugin.gd via setup() +var _ready: bool = false +var _promoted_cnt = 0 + +## Instance signals (LEGAL — instance funcs can emit these). Multiple consumers +## (plugin.gd, dock, addons) can connect. +signal tools_changed # triggers custom_tools_changed push to server +signal registry_ready # https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #8: emit after Godot AI reload so addons can re-register + + +## Called by plugin.gd in _enter_tree. Injects live dependencies and registers +## the singleton. Addons can now reach the registry via get_instance(). +func setup(dispatcher: McpDispatcher, locator: McpServiceLocator) -> void: + _dispatcher = dispatcher + _locator = locator + _load_disabled_tools() + _instance = self + + +func register(spec: McpCustomToolSpec) -> bool: + if not _validate_one(spec): + return false + _commit_one(spec) + tools_changed.emit() + return true + + +## Atomic batch registration: validate ALL specs first (phase 1, zero +## mutation), then commit ALL (phase 2, cannot fail), then emit ONCE. +## A phase-1 failure leaves the registry AND dispatcher untouched — a +## per-spec register-then-bail loop would leave earlier specs committed +## and dispatchable while the server's tool list never hears about them. +func batch_register(specs: Array[McpCustomToolSpec]) -> bool: + if specs.is_empty(): + return true + ## Phase 1 — validate only. Also reject duplicate names WITHIN the + ## batch: _validate_one checks against committed state (nothing from + ## this batch is committed yet), and silently letting the last + ## duplicate win would hide an addon packaging bug. + var batch_names := {} + for spec in specs: + if not _validate_one(spec): + return false + if batch_names.has(spec.name): + push_warning("McpToolRegistry: duplicate name '%s' within batch — rejected" % spec.name) + return false + batch_names[spec.name] = true + ## Phase 2 — commit everything, emit once. + for spec in specs: + _commit_one(spec) + tools_changed.emit() + return true + + +## Phase 1 helper: validation + collision policy. NO registry/dispatcher +## mutation — the only side effect is filling the display-source fallback +## on the spec itself, which is harmless on reject. +func _validate_one(spec: McpCustomToolSpec) -> bool: + var errors := spec.validate() + if not errors.is_empty(): + push_error("McpToolRegistry: rejecting spec '%s': %s" % [spec.name, ", ".join(errors)]) + return false + ## Fill display source from plugin.cfg if addon left it empty. + if spec.source.is_empty(): + spec.source = _read_plugin_name(spec.source_path) + ## reject-on-collision: same source_path (hot-reload) replaces, different rejects + var existing: McpCustomToolSpec= _specs.get(spec.name) + if existing != null and existing.source_path != spec.source_path: + push_warning("McpToolRegistry: name '%s' collision between %s and %s — rejected" % [spec.name, existing.source_path, spec.source_path]) + return false + return true + + +## Phase 2 helper: commit one ALREADY-VALIDATED spec. Handles the +## hot-reload replace (same source_path — guaranteed by _validate_one). +## Never fails, never emits — callers own the tools_changed emit. +func _commit_one(spec: McpCustomToolSpec) -> void: + var existing: McpCustomToolSpec = _specs.get(spec.name) + if existing != null: + ## Replace: purge the OLD registration from all four dispatcher + ## dicts. Command name is "custom_tool:" — passing the bare + ## name would leave a materialized Callable in _handlers and the + ## hot-reloaded spec would silently never take effect. + _dispatcher.unregister("custom_tool:" + existing.name, "custom:" + existing.name) + _erase_from_source_path_index_locked(existing) + _specs[spec.name] = spec + _by_source_path.get_or_add(spec.source_path, []).append(spec) + ## Bridge to dispatcher lazy registration: register_lazy_handler + register_lazy. + ## handler_key = "custom:"; wrapper is CustomToolWrapper (https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #2). + + var handler_key := "custom:" + spec.name + var wrapper_path := "res://addons/godot_ai/custom_tools/custom_tool_wrapper.gd" + _dispatcher.register_lazy_handler(handler_key, wrapper_path, [spec, _locator]) + _dispatcher.register_lazy("custom_tool:" + spec.name, handler_key, &"invoke") + + +func unregister(name: String) -> bool: + var spec: McpCustomToolSpec = _specs.get(name) + if spec == null: + return false + if _dispatcher != null: + _dispatcher.unregister("custom_tool:" + name, "custom:" + name) + _specs.erase(name) + _erase_from_source_path_index_locked(spec) + tools_changed.emit() + return true + + +## https://github.com/hi-godot/godot-ai/issues/781#issuecomment-5036376599 #8: batch-unregister all tools from one addon. Pass the source_path +## (plugin.cfg path) — the registry removes every spec whose source_path matches. +func unregister_source(source_path: String) -> int: + var specs: Array = _by_source_path.get(source_path, []) + var count := specs.size() + for spec in specs.duplicate(): + if _dispatcher != null: + _dispatcher.unregister("custom_tool:" + spec.name, "custom:" + spec.name) + _specs.erase(spec.name) + _by_source_path.erase(source_path) + if count > 0: + tools_changed.emit() + return count + + +func all() -> Array[McpCustomToolSpec]: + var out: Array[McpCustomToolSpec] = [] + for spec in _specs.values(): + out.append(spec) + return out + + +## Enabled specs only — the catalog-push source. Disabled tools stay +## registered (the dock still lists them for re-enabling) but are never +## advertised to the server and are rejected at dispatch. +func enabled() -> Array[McpCustomToolSpec]: + var out: Array[McpCustomToolSpec] = [] + for spec in _specs.values(): + if is_tool_enabled(spec.name): + out.append(spec) + return out + + +# --- per-tool enable state (dock UI) --- +## Persisted per-project via EditorSettings project metadata (the same +## store the editor uses for per-project UI state — no project.godot +## churn, no cross-project bleed). Applies LIVE: toggling re-emits +## tools_changed, which re-pushes the filtered catalog to the server. + +const _META_SECTION := "godot_ai" +const _META_KEY_DISABLED := "disabled_custom_tools" + +var _disabled_tools: Dictionary = {} # name -> true + + +func is_tool_enabled(name: String) -> bool: + return not _disabled_tools.has(name) + + +func set_tool_enabled(name: String, tool_enabled: bool) -> void: + if tool_enabled: + if not _disabled_tools.has(name): + return + _disabled_tools.erase(name) + else: + if _disabled_tools.has(name): + return + _disabled_tools[name] = true + _save_disabled_tools() + tools_changed.emit() + + +func _load_disabled_tools() -> void: + _disabled_tools.clear() + var es := _editor_settings() + if es == null: + return + var stored: Variant = es.get_project_metadata(_META_SECTION, _META_KEY_DISABLED, PackedStringArray()) + for name in PackedStringArray(stored): + _disabled_tools[String(name)] = true + + +func _save_disabled_tools() -> void: + var es := _editor_settings() + if es == null: + return + var names := PackedStringArray() + for name in _disabled_tools.keys(): + names.append(String(name)) + es.set_project_metadata(_META_SECTION, _META_KEY_DISABLED, names) + + +static func _editor_settings() -> EditorSettings: + if not Engine.is_editor_hint(): + return null + return EditorInterface.get_editor_settings() + + +func get_spec(name: String) -> McpCustomToolSpec: + var out: McpCustomToolSpec = _specs.get(name) + return out + + +func is_ready() -> bool: + return _ready + + +## Called from plugin.gd teardown — wipes everything so stale specs/Callables +## don't survive a Godot AI reload (#46 regression class). Signals die with +## the instance (consumers disconnect via plugin.gd's own teardown). +func clear() -> void: + _specs.clear() + _by_source_path.clear() + _disabled_tools.clear() # in-memory only; persistence reloads on next setup() + _ready = false + _dispatcher = null + _locator = null + _instance = null + + +## Called from plugin.gd _enter_tree after setup(). Addons that missed +## _enter_tree during a Godot AI reload listen for registry_ready (via +## get_instance().registry_ready.connect(...)) and re-register deterministically. +func mark_ready() -> void: + _ready = true + registry_ready.emit() + + +# --- internal helpers --- + +func _erase_from_source_path_index_locked(spec: McpCustomToolSpec) -> void: + var specs: Array = _by_source_path.get(spec.source_path, []) + specs.erase(spec) + if specs.is_empty(): + _by_source_path.erase(spec.source_path) + + +## Read [plugin] name from a plugin.cfg for display purposes. +## Returns "" on any error — display source is best-effort. +static func _read_plugin_name(plugin_cfg_path: String) -> String: + var cfg := ConfigFile.new() + if cfg.load(plugin_cfg_path) != OK: + return "" + return cfg.get_value("plugin", "name", "") + +static func _get_command_name(spec: McpCustomToolSpec) -> String: + return "custom_tool:" + spec.name + +static func _get_handler_name(spec: McpCustomToolSpec) -> String: + return "custom:" + spec.name diff --git a/addons/godot_ai/custom_tools/mcp_tool_registry.gd.uid b/addons/godot_ai/custom_tools/mcp_tool_registry.gd.uid new file mode 100644 index 0000000..23b9822 --- /dev/null +++ b/addons/godot_ai/custom_tools/mcp_tool_registry.gd.uid @@ -0,0 +1 @@ +uid://bq2btxtm8flhb diff --git a/addons/godot_ai/debugger/mcp_debugger_plugin.gd b/addons/godot_ai/debugger/mcp_debugger_plugin.gd new file mode 100644 index 0000000..bfa8e10 --- /dev/null +++ b/addons/godot_ai/debugger/mcp_debugger_plugin.gd @@ -0,0 +1,1699 @@ +@tool +class_name McpDebuggerPlugin +extends EditorDebuggerPlugin + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Editor-side half of the game-process capture bridge. +## +## The game-side counterpart (`plugin/addons/godot_ai/runtime/game_helper.gd`, +## registered as autoload `_mcp_game_helper`) listens on EngineDebugger's +## message channel. This plugin sends "mcp:take_screenshot" requests and +## routes the replies back through the WebSocket McpConnection using the +## request_id the MCP dispatcher threaded through params. +## +## Why this exists: the game always runs as a separate OS process. Even +## "Embed Game Mode" on Windows/Linux (and macOS 4.5+) just reparents the +## game's window into the editor — the game's framebuffer is never reachable +## from the editor's Viewport. The debugger channel is the engine's own +## supported IPC and works identically regardless of embed mode. + +const CAPTURE_PREFIX := "mcp" +## CI runners under xvfb can be slow to spin up the game subprocess and +## register the autoload's capture. 8s keeps the message responsive for +## interactive users while still covering slow-CI startup. +const DEFAULT_TIMEOUT_SEC := 8.0 +## How long to wait for the game-side autoload to beacon mcp:hello +## before sending the screenshot request. Godot's debugger drops +## messages whose prefix has no registered capture, so sending +## take_screenshot before the game registers its "mcp" capture is a +## silent black hole. On CI the game subprocess has been observed +## taking ~15s to boot + register. +const GAME_READY_WAIT_SEC := 20.0 +## #500: how long to wait for the game-side autoload to beacon mcp:hello before +## issuing a game_eval. This is deliberately MUCH shorter than the 20s +## screenshot wait above: the eval path's total editor-side budget is this wait +## plus the 250ms liveness probe and 10s eval backstop +## (request_game_eval's timeout_sec), and that total MUST stay below the 15s +## game_eval timeout enforced at two layers: the Python server's send_command +## budget (src/godot_ai/handlers/editor.py::game_eval) and this plugin's own +## deferred budget (dispatcher.gd's 15000ms game_eval entry, editor/plugin-side +## — not server-side). Either firing produces the opaque tail. +## With the 20s screenshot wait, a not-yet-ready game made the editor poll past +## the 15s deadline, so the server gave up first with an opaque +## ~15s TimeoutError instead of the actionable "Is the game actually running?" +## error below ever reaching the client (#500's residual TimeoutError bucket). +## 3s wait + 0.25s probe + 10s backstop = 13.25s, comfortably under the 15s +## server timeout, so the actionable error always wins. A game launched moments +## before the eval still has the 3s grace to register; if it needs longer, the +## user gets a fast, clear "is it running?" rather than a 15s hang. +const EVAL_READY_WAIT_SEC := 3.0 +## #859: once the helper has registered, confirm its game loop is still +## advancing before dispatching an eval. The helper replies synchronously from +## the debugger capture, so 250ms is ample while keeping not-ready failures +## below the telemetry target of 0.5s. +const EVAL_LIVENESS_WAIT_SEC := 0.25 +## #490: how long to wait for the game's mcp:eval_compiled beacon before +## concluding the eval source failed to compile. A parse error aborts the +## game-side handler before it can reply, so without this we'd wait the +## full eval timeout for a syntax mistake. reload() of valid source is +## sub-millisecond, so 3s is comfortably clear of false positives. +const EVAL_COMPILE_GRACE_SEC := 3.0 +## #490: once an eval compiles, the editor polls the game every this many +## seconds with mcp:eval_check. A backgrounded play-in-editor game has a +## frozen idle loop (no _process / SceneTreeTimer ticks) so it can't +## self-report a runtime error that aborted the eval — but its debugger +## capture callback still answers a probe. The editor's own loop keeps +## ticking, so it drives the poll. 0.35s keeps detection well under a second +## without flooding the channel; most evals reply before the first probe. +const EVAL_PROBE_INTERVAL_SEC := 0.35 + +const VisionRoutingScript := preload("res://addons/godot_ai/vision_routing.gd") + +var _log_buffer: McpLogBuffer +var _game_log_buffer: McpGameLogBuffer +var _editor_log_buffer: McpEditorLogBuffer +var _surfaced_error_tracker +var vision_routing: VisionRoutingScript = null + +## Pending request_id -> phase-specific data. Every eval phase carries kind +## and connection; timer-backed phases also retain their bound timeout lambda +## so `_clear_pending` can disconnect it on success/error. Otherwise the +## SceneTreeTimer pins the captured request_id until its timeout elapses. +var _pending: Dictionary = {} + +## Testing seam for the readiness wait below. Production leaves this invalid +## and awaits SceneTree.process_frame; editor tests inject a synchronous +## callable because their runner does not pump frames while a test is running. +var _eval_ready_frame_waiter: Callable = Callable() + +## Flipped true when the game-side autoload sends its "mcp:hello" boot +## beacon for the current project_run. Reset as soon as a new run is +## requested, before Godot has attached the fresh debugger session, so +## editor_state cannot leak readiness from the previous game process. +var _game_ready := false +var _game_run_token := 0 +var _ready_run_token := -1 +var _game_session_id := -1 +var _game_run_active := false +## Debugger session id of an `mcp:hello` that arrived before the run was +## adopted, or -1 when none is held (#891). A manually started play can beat +## its own adoption: the helper's boot beacon is a one-shot, so discarding it +## left the runtime bridge dead for the whole run with no retry. Buffer it and +## replay on adoption instead. Cleared whenever a run ends, so a beacon can +## never carry across into a later run. +var _pending_hello_session_id := -1 +## True when holding a beacon already rotated the game-log run id, so the +## adoption that consumes it must not rotate again (#891 review). +var _pre_adoption_log_rotated := false +var _manual_run_armed := false +var _game_run_started_msec := 0 +var _game_run_started_editor_cursor := 0 +var _game_run_started_debugger_cursor := 0 +var _game_helper_expected := true + +## #645: a GDScript parse error hit while an editor-launched game boots calls +## GDScriptLanguage::debug_break_parse — the game parks in a remote-debugger +## break BEFORE the helper's mcp:hello and before any record reaches the +## Errors tab, the editor Logger, or the game log. The only editor-side traces +## are the debugger break signals; the stack frames land in the Stack Trace +## panel a few frames later. Track the break here so game_status can report +## status="break" and a synthesized error record can name the failure. +var _break_active := false +var _break_can_debug := false +var _break_reason := "" +var _break_pre_live := false +var _break_run_token := -1 +var _break_record_synthesized := false + +## #645: how long after the break signal to scrape the Stack Trace panel for +## frames. The editor requests the stack dump from the game separately, so the +## panel is empty at signal time; ~0.5s has it populated. The late tick +## synthesizes with whatever is available so a scrape failure still yields a +## record carrying the break reason. +const BREAK_FRAME_SCRAPE_DELAYS_SEC: Array[float] = [0.5, 2.0] + + + +func _init(log_buffer: McpLogBuffer = null, game_log_buffer: McpGameLogBuffer = null, editor_log_buffer: McpEditorLogBuffer = null, surfaced_error_tracker = null, vision_routing: VisionRoutingScript = null) -> void: + _log_buffer = log_buffer + _game_log_buffer = game_log_buffer + _editor_log_buffer = editor_log_buffer + _surfaced_error_tracker = surfaced_error_tracker + self.vision_routing = vision_routing + + +func _has_capture(prefix: String) -> bool: + return prefix == CAPTURE_PREFIX + + +## Fires when a debugger session attaches — once for the editor's own +## self-session at startup, and again each time the user hits Play and a +## new game subprocess connects. Reset _game_ready so the next capture +## request waits for the (new) game's mcp:hello beacon before sending, +## avoiding stale-flag timeouts across Play→Stop→Play cycles. +## +## Do NOT log here: add_debugger_plugin() triggers this virtual before +## plugin.gd's _enter_tree logs "plugin loaded", and ci-reload-test +## asserts "plugin loaded" is the first line after a plugin reload. +func _setup_session(session_id: int) -> void: + _connect_session_stopped(session_id) + _connect_session_break_signals(session_id) + if EditorInterface.is_playing_scene() and not _game_run_active: + _begin_game_run_tracking(_editor_log_cursor(), true, true, true, true, true) + else: + _game_ready = false + _ready_run_token = -1 + _game_session_id = session_id + + +func begin_game_run(editor_log_cursor: int = 0, helper_expected: bool = true) -> void: + _begin_game_run_tracking(editor_log_cursor, helper_expected, true, true) + + +func _begin_game_run_tracking( + editor_log_cursor: int = 0, + helper_expected: bool = true, + rotate_game_log: bool = true, + sticky_debugger_scan: bool = true, + quiet: bool = false, + manual_armed: bool = false, + keep_session_id: int = -1, +) -> void: + _game_run_token += 1 + _game_run_active = true + _manual_run_armed = manual_armed + _game_ready = false + _ready_run_token = -1 + ## Adopting a run whose game is ALREADY attached keeps that session id + ## (#891 review): clearing it would leave every staleness guard comparing + ## against -1, so a foreign session's `stopped` could end this live run — + ## `_on_debugger_session_stopped` lets a manual-armed run end on any + ## session while the id is unknown. Spawn-first callers pass -1 and keep + ## the historical clear, since their game has not attached yet. + _game_session_id = keep_session_id + clear_debug_break() + _game_run_started_msec = Time.get_ticks_msec() + _game_run_started_editor_cursor = maxi(0, editor_log_cursor) + if _surfaced_error_tracker != null: + _surfaced_error_tracker.note_game_run_started(sticky_debugger_scan) + _game_run_started_debugger_cursor = _surfaced_error_tracker.debugger_promoted_total() + else: + _game_run_started_debugger_cursor = 0 + _game_helper_expected = helper_expected + var run_id := "" + if _game_log_buffer and rotate_game_log: + if _pre_adoption_log_rotated: + ## Already rotated when this game's beacon was held, so its boot + ## output is tagged with the run id this adoption is about to + ## announce. Rotating again here would orphan those lines under a + ## superseded id and `logs_read(source="game")` — which returns the + ## CURRENT run only — would report an empty log for a game whose + ## only output happens in `_ready()` (#891 review). + run_id = _game_log_buffer.run_id() + else: + run_id = _game_log_buffer.clear_for_new_run() + _pre_adoption_log_rotated = false + if _log_buffer and not quiet: + var log_text := "[debug] game capture pending run token %d" % _game_run_token + if not run_id.is_empty(): + log_text += " (run %s)" % run_id + _log_buffer.log(log_text) + ## #891: a beacon that beat this adoption is held rather than dropped — + ## consume it now so the bridge comes up without waiting for a second + ## hello the game will never send. + _replay_pending_hello() + + +func _editor_log_cursor() -> int: + return _editor_log_buffer.appended_total() if _editor_log_buffer != null else 0 + + +func end_game_run() -> void: + _fail_pending_evals_not_ready( + "The game run ended before game_eval completed — the game stopped, crashed, or is restarting. Confirm it is running and retry." + ) + ## Never carry a held beacon across a run boundary (#891). + _pending_hello_session_id = -1 + _pre_adoption_log_rotated = false + _game_run_active = false + _manual_run_armed = false + _game_ready = false + _ready_run_token = -1 + _game_session_id = -1 + clear_debug_break() + if _surfaced_error_tracker != null: + _surfaced_error_tracker.note_game_run_stopped() + + +## Editor play-state edge, stopped -> playing (#891). `_setup_session` adopts a +## manually started play only when `EditorInterface.is_playing_scene()` is +## ALREADY true at the instant Godot attaches the debugger session — an F5/F6 +## launch routinely loses that race, and the run was then never adopted at all, +## leaving game_eval, game logs and runtime inspection silently dead for its +## whole lifetime. This closes the race from the other side: whichever of the +## two edges lands second performs the adoption. No-op for MCP-started runs, +## which `project_run` already adopted via `begin_game_run`. +func note_editor_play_started() -> void: + if _game_run_active: + return + ## State belonging to the game that is already talking must survive the + ## adoption that is about to reset run bookkeeping (#891 review). + var attached_session := _game_session_id + var had_break := _break_active + var break_can_debug := _break_can_debug + var break_reason := _break_reason + _begin_game_run_tracking( + _editor_log_cursor(), true, true, true, true, true, attached_session + ) + if had_break: + ## A boot parse error can break the game before the play-state edge + ## lands. `_begin_game_run_tracking` clears break state, which would + ## drop the actionable #645 diagnosis and leave game_status reporting + ## "not_live" instead of "break". Re-record it against the new run so + ## `_break_pre_live` and the synthetic-error scan are computed for THIS + ## run — the beacon will never arrive for a game parked at a break. + note_debug_break(break_can_debug, break_reason) + + +## Authoritative fallback for runs whose debugger `stopped` signal never +## fired or was never connected: the editor's play state falling to stopped +## means the game process is gone. A game that exits on its own +## (get_tree().quit(), crash) has no MCP stop op to run the bookkeeping, and +## without this game_status stayed "live" until the next run (#642 smoke). +## Called on the playing→stopped edge only, so the pre-play launch window +## (run tracking begun, is_playing_scene() not yet true) is never clipped. +func note_editor_play_stopped() -> void: + if not _game_run_active: + ## A beacon held for an adoption that never happened must not survive + ## into the next run (#891). + _pending_hello_session_id = -1 + _pre_adoption_log_rotated = false + return + end_game_run() + + +## Apply the game helper's boot beacon: the game has registered its "mcp" +## capture and is safe to send take_screenshot / eval requests to — before +## this, Godot's debugger drops our messages silently. Shared by the live +## `mcp:hello` branch in `_capture` and by the buffered replay in +## `_replay_pending_hello`, so a held beacon produces exactly the same state +## and side effects as one that arrived after adoption (#891). +func _accept_game_hello(session_id: int) -> void: + _pending_hello_session_id = -1 + ## Bind the run to the game that actually announced itself. Adoption + ## clears `_game_session_id`, so without this a replayed beacon would + ## leave the run bound to nothing and the staleness checks toothless + ## until Godot's next `_setup_session` (#891 review). + if session_id != -1: + _game_session_id = session_id + _game_ready = true + _ready_run_token = _game_run_token + ## #641: boot-time parse errors race the hello beacon — both ride + ## the same debugger channel, and the editor inserts Errors-tab + ## rows with a per-frame throttle, so rows can land moments after + ## the run is declared live. Arm forced scans so those rows get + ## promoted into the watermark even if no tool call follows. + if _surfaced_error_tracker != null: + _surfaced_error_tracker.schedule_deferred_scans() + if _log_buffer: + if _game_log_buffer: + _log_buffer.log("[debug] <- mcp:hello from game_helper (run %s)" % _game_log_buffer.run_id()) + else: + _log_buffer.log("[debug] <- mcp:hello from game_helper") + + +## Consume a beacon that arrived before this run was adopted. Called at the end +## of run-tracking setup; no-op when nothing is held (#891). +func _replay_pending_hello() -> void: + if _pending_hello_session_id == -1: + return + var held := _pending_hello_session_id + if _game_session_id != -1 and held != _game_session_id: + ## Belongs to a different debugger session than the one this run is + ## bound to — drop it rather than declare the wrong game live. + _pending_hello_session_id = -1 + if _log_buffer: + _log_buffer.log("[debug] dropped held mcp:hello from debugger session %d (current %d)" % [held, _game_session_id]) + return + if _log_buffer: + _log_buffer.log("[debug] replaying held mcp:hello from debugger session %d" % held) + _accept_game_hello(held) + + +func _connect_session_stopped(session_id: int) -> void: + var session = get_session(session_id) + if session == null: + return + var stopped := Callable(self, "_on_debugger_session_stopped").bind(session_id) + if not session.stopped.is_connected(stopped): + session.stopped.connect(stopped) + + +func _on_debugger_session_stopped(session_id: int) -> void: + if _game_session_id != -1 and session_id != _game_session_id: + return + ## MCP-started runs normally end via project_manage(op="stop"), but a game + ## that exits on its own (get_tree().quit(), crash) emits only this signal. + ## Without ending the run here, game_status stays "live" until the next + ## run's bookkeeping rewrites it (#642 live smoke). Before the game session + ## attaches (_game_session_id == -1) only manual runs may end on this + ## signal — a foreign session's stop must not cancel a launching MCP run. + if not _manual_run_armed and _game_session_id == -1: + return + end_game_run() + + +## #859: a closed debugger session is authoritative. Do not leave evals on +## their 10s backstop after the game process has already gone away. Other +## pending request kinds keep their existing ownership and timeout behavior. +func _fail_pending_evals_not_ready(message: String) -> void: + for request_id in _pending.keys(): + var pending: Dictionary = _pending.get(request_id, {}) + if str(pending.get("kind", "")) not in [ + "eval_ready_wait", "eval_liveness", "eval" + ]: + continue + var connection: McpConnection = pending.get("connection") + _clear_pending(str(request_id)) + if connection != null and is_instance_valid(connection): + _send_error(connection, str(request_id), ErrorCodes.EVAL_GAME_NOT_READY, message) + + +func _is_current_game_run(run_token: int) -> bool: + return _game_run_active and _game_run_token == run_token + + +func _fail_eval_not_ready(request_id: String, message: String) -> void: + var pending: Dictionary = _pending.get(request_id, {}) + var connection: McpConnection = pending.get("connection") + _clear_pending(request_id) + if connection != null and is_instance_valid(connection): + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, message) + + +## --- #645: boot-time debugger breaks --------------------------------------- + +func _connect_session_break_signals(session_id: int) -> void: + var session = get_session(session_id) + if session != null: + var breaked_cb := Callable(self, "_on_debugger_session_breaked").bind(session_id) + if not session.breaked.is_connected(breaked_cb): + session.breaked.connect(breaked_cb) + var continued_cb := Callable(self, "_on_debugger_session_continued").bind(session_id) + if not session.continued.is_connected(continued_cb): + session.continued.connect(continued_cb) + _connect_script_debugger_breaked() + + +## The session-level `breaked` signal carries only can_debug; the underlying +## ScriptEditorDebugger's own `breaked` also carries the human-readable break +## reason ("Parser Error: ..."), which is otherwise visible only in the +## Debugger UI. EditorDebuggerSession does not expose its debugger node, so +## locate ScriptEditorDebugger instances by walking the editor UI — the same +## approach as the tracker's Errors-tab scrape. +func _connect_script_debugger_breaked() -> void: + var base := EditorInterface.get_base_control() + if base == null: + return + var debuggers: Array[Node] = [] + _collect_nodes_of_class(base, "ScriptEditorDebugger", debuggers) + for dbg in debuggers: + if not dbg.has_signal("breaked"): + continue + var cb := Callable(self, "_on_script_debugger_breaked") + if not dbg.is_connected("breaked", cb): + dbg.connect("breaked", cb) + + +static func _collect_nodes_of_class(node: Node, klass: String, out: Array[Node]) -> void: + if node.get_class() == klass: + out.append(node) + for child in node.get_children(): + _collect_nodes_of_class(child, klass, out) + + +func _on_debugger_session_breaked(can_debug: bool, session_id: int) -> void: + if _game_session_id != -1 and session_id != _game_session_id: + return + note_debug_break(can_debug, "") + + +func _on_debugger_session_continued(session_id: int) -> void: + if _game_session_id != -1 and session_id != _game_session_id: + return + clear_debug_break() + + +## reallydid=false is Godot's "left the break" notification (debug_exit). +func _on_script_debugger_breaked(reallydid: bool, can_debug: bool, reason: String, _has_stackdump: bool) -> void: + if not reallydid: + clear_debug_break() + return + note_debug_break(can_debug, reason) + + +## Record that the game process is parked in a remote-debugger break. Fires +## once per break from the session signal (no reason text) and again moments +## later from the ScriptEditorDebugger signal (with reason) — the notices +## merge into one break. Public so tests can drive break state directly. +func note_debug_break(can_debug: bool, reason: String) -> void: + var first_notice := not _break_active + _break_active = true + _break_can_debug = can_debug + if not reason.is_empty(): + _break_reason = reason + if not first_notice: + return + _break_run_token = _game_run_token + _break_pre_live = _game_run_active and not is_game_capture_ready() + _break_record_synthesized = false + if _log_buffer: + _log_buffer.log("[debug] debugger break (pre_live=%s can_debug=%s)" % [str(_break_pre_live), str(can_debug)]) + if _break_pre_live: + _schedule_break_record_synthesis() + + +func clear_debug_break() -> void: + _break_active = false + _break_can_debug = false + _break_reason = "" + _break_pre_live = false + _break_run_token = -1 + _break_record_synthesized = false + + +## Stack frames land in the Stack Trace panel a few frames after the break +## signal (the editor requests the stack dump separately), so the record is +## synthesized on short timers rather than at signal time. +func _schedule_break_record_synthesis() -> void: + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + return + var token := _break_run_token + for i in BREAK_FRAME_SCRAPE_DELAYS_SEC.size(): + var final := i == BREAK_FRAME_SCRAPE_DELAYS_SEC.size() - 1 + var timer := tree.create_timer(BREAK_FRAME_SCRAPE_DELAYS_SEC[i]) + timer.timeout.connect(func() -> void: _on_break_scrape_tick(token, final)) + + +func _on_break_scrape_tick(run_token: int, final: bool) -> void: + if not _break_active or _break_record_synthesized or run_token != _break_run_token: + return + var frames := _scrape_break_stack_frames() + if frames.is_empty() and not final: + return + synthesize_break_error_record(frames) + + +## Read the debugger's Stack Trace panel rows. Row metadata is a Dictionary +## {frame, file, function, line} regardless of editor locale, so stack trees +## are identified by metadata shape rather than the translated column title. +func _scrape_break_stack_frames() -> Array[Dictionary]: + var base := EditorInterface.get_base_control() + if base == null: + return [] + var debuggers: Array[Node] = [] + _collect_nodes_of_class(base, "ScriptEditorDebugger", debuggers) + for dbg in debuggers: + var trees: Array[Node] = [] + _collect_nodes_of_class(dbg, "Tree", trees) + for t in trees: + var frames := _frames_from_stack_tree(t as Tree) + if not frames.is_empty(): + return frames + return [] + + +static func _frames_from_stack_tree(tree: Tree) -> Array[Dictionary]: + var frames: Array[Dictionary] = [] + var root := tree.get_root() + if root == null: + return frames + var item := root.get_first_child() + while item != null: + var meta = item.get_metadata(0) + if not (meta is Dictionary and meta.has("file") and meta.has("frame")): + return [] + frames.append({ + "path": str(meta.get("file", "")), + "line": int(meta.get("line", 0)), + "function": str(meta.get("function", "")), + }) + item = item.get_next() + return frames + + +## Build the Errors-tab-shaped record for a boot-time break and promote it via +## the tracker so recent_editor_errors_since / logs_read / the watermark all +## surface it — the break itself produces no record anywhere else (#645). +## Public so tests can synthesize without waiting on scrape timers. +func synthesize_break_error_record(frames: Array[Dictionary]) -> void: + if _break_record_synthesized: + return + _break_record_synthesized = true + if _surfaced_error_tracker == null: + return + var reason := _break_reason + if reason.is_empty(): + reason = "Game process broke into the debugger during startup (script parse/load error; reason not captured)" + var top: Dictionary = frames[0] if not frames.is_empty() else {} + var location := { + "path": str(top.get("path", "")), + "line": int(top.get("line", 0)), + "function": str(top.get("function", "")), + } + var entry := { + "source": "editor", + "level": "error", + "text": reason, + "path": location["path"], + "line": location["line"], + "function": location["function"], + "details": { + "debugger_tab": "Stack Trace", + "message": reason, + "error_type_name": "debugger_break", + "source": location.duplicate(true), + "resolved": location.duplicate(true), + "frames": frames.duplicate(true), + }, + } + _surfaced_error_tracker.record_synthetic_error(entry) + if _log_buffer: + _log_buffer.log("[debug] synthesized boot-break error record: %s" % McpSurfacedErrorTracker.format_editor_error_summary(entry)) + + +## --- end #645 --------------------------------------------------------------- + + +func is_game_capture_ready() -> bool: + return _game_run_active and _game_ready and _ready_run_token == _game_run_token + + +static func with_liveness_flags(status: Dictionary) -> Dictionary: + var enriched := status.duplicate(true) + var state := str(enriched.get("status", "stopped")) + enriched["helper_live"] = state == "live" + enriched["session_active"] = not state in ["not_live", "stopped"] + return enriched + + +func get_game_status(now_msec: int = -1, ready_wait_sec: float = GAME_READY_WAIT_SEC) -> Dictionary: + var resolved_now := Time.get_ticks_msec() if now_msec < 0 else now_msec + var ready_wait_msec := maxi(0, int(ready_wait_sec * 1000.0)) + var elapsed_msec := maxi(0, resolved_now - _game_run_started_msec) if _game_run_active else 0 + ## "stopped" also covers idle/never-ran; no game run is currently active. + var status := "stopped" + if _game_run_active: + ## #645: a parked process takes precedence over "live" — a game frozen + ## in a remote-debugger break cannot service game-side tools even when + ## its helper registered before the break. + if _break_active: + status = "break" + elif is_game_capture_ready(): + status = "live" + elif not _game_helper_expected: + status = "no_helper" + elif elapsed_msec >= ready_wait_msec: + status = "not_live" + else: + status = "launching" + var out := { + "status": status, + "run_token": _game_run_token, + "active": _game_run_active, + "ready": is_game_capture_ready(), + "helper_expected": _game_helper_expected, + "run_started_msec": _game_run_started_msec, + "elapsed_msec": elapsed_msec, + "ready_wait_msec": ready_wait_msec, + "editor_log_cursor": _game_run_started_editor_cursor, + } + if status == "break": + out["break"] = { + "reason": _break_reason, + "can_debug": _break_can_debug, + "pre_live": _break_pre_live, + } + return with_liveness_flags(out) + + +func _explain_not_live(status: Dictionary, code: String = ErrorCodes.INTERNAL_ERROR) -> Dictionary: + var state := str(status.get("status", "stopped")) + var errors_info := recent_editor_errors_since(int(status.get("editor_log_cursor", 0))) + var recent_errors: Array = errors_info.get("errors", []) + var recent_errors_scope := str(errors_info.get("scope", "none")) + var truncated := bool(errors_info.get("truncated", false)) + var data := { + "game_status": status.duplicate(true), + "recent_errors": recent_errors, + "recent_errors_scope": recent_errors_scope, + "recent_errors_may_predate_run": recent_errors_scope == "retained_recent", + "recent_errors_truncated": truncated, + } + data.merge(split_errors_by_scope(recent_errors, recent_errors_scope), true) + var message := "" + match state: + "not_live": + if not recent_errors.is_empty() and recent_errors_scope == "run": + message = "The game failed to load or crashed before the Godot AI game helper registered: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(recent_errors[0]) + if truncated: + message += " Editor logs since this run may be truncated; showing retained errors." + elif not recent_errors.is_empty(): + message = "The game is not responding and reported no load errors during this run. A recent editor error may be related, but may predate this run: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(recent_errors[0]) + else: + message = "The game is not responding and reported no load errors before the helper-ready window elapsed. It may still be booting or may have failed silently; check logs_read(source='editor', include_details=true) and retry." + "break": + var break_info: Dictionary = status.get("break", {}) + var break_reason := str(break_info.get("reason", "")) + var reason_suffix := (": %s" % break_reason) if not break_reason.is_empty() else "" + if bool(break_info.get("pre_live", true)): + message = "The game hit a script error during startup and is frozen at a debugger break%s. It cannot become live; call project_manage(op='stop') to end the run, fix the error, and relaunch. Check logs_read(source='editor', include_details=true)." % reason_suffix + else: + message = "The game is paused at a debugger break%s. Resume it from the editor's Debugger panel or call project_manage(op='stop')." % reason_suffix + "no_helper": + message = "The running game has no _mcp_game_helper autoload, so game-side tools cannot connect. If this is a headless or custom-main-loop project, use editor_screenshot(source='viewport') where applicable. Otherwise, re-enable the plugin and relaunch the game." + "launching": + message = "The game is still starting (%.1fs elapsed); the Godot AI game helper has not registered yet. Retry shortly." % (float(status.get("elapsed_msec", 0)) / 1000.0) + "stopped": + message = "The game is not running. Start the project and retry the game-side tool." + _: + message = "The game-side tool could not confirm the game is live (status=%s). Check logs_read(source='editor', include_details=true) and retry." % state + var err := ErrorCodes.make(code, message) + var inner: Dictionary = err.get("error", {}) + inner["data"] = data + err["error"] = inner + return err + + +static func split_errors_by_scope(recent_errors: Array, scope: String) -> Dictionary: + var current_run_errors: Array = [] + var retained_errors: Array = [] + if scope == "run": + current_run_errors = recent_errors + elif scope == "retained_recent": + retained_errors = recent_errors + return { + "current_run_errors": current_run_errors, + "retained_errors": retained_errors, + } + + +## `force_debugger_scan` bypasses the tracker's scan gate for one read. Keep it +## false on per-frame polling paths (the run-liveness loop) — a forced scan +## walks the Debugger dock UI — and pass true only for one-shot reads that must +## see rows which landed after the last gated scan (#641). +func recent_editor_errors_since(cursor: int, force_debugger_scan: bool = false) -> Dictionary: + return _recent_editor_errors_since(cursor, force_debugger_scan) + + +func _recent_editor_errors_since(cursor: int, force_debugger_scan: bool = false) -> Dictionary: + var out: Array[Dictionary] = [] + var truncated := false + if _surfaced_error_tracker != null: + var captured_by_tracker: Dictionary = _surfaced_error_tracker.editor_entries_since( + maxi(0, cursor), + _game_run_started_debugger_cursor, + force_debugger_scan, + ) + truncated = bool(captured_by_tracker.get("truncated", false)) + for raw_entry in captured_by_tracker.get("entries", []): + var compact := _compact_editor_error(raw_entry) + if compact.is_empty(): + continue + out.append(compact) + if out.size() >= 5: + break + if not out.is_empty(): + return {"errors": out, "truncated": truncated, "scope": "run"} + for raw_entry in _surfaced_error_tracker.retained_recent_editor_entries(): + var compact := _compact_editor_error(raw_entry, true) + if compact.is_empty(): + continue + out.append(compact) + if out.size() >= 5: + break + if not out.is_empty(): + return {"errors": out, "truncated": false, "scope": "retained_recent"} + return {"errors": out, "truncated": false, "scope": "none"} + if _editor_log_buffer == null: + return {"errors": out, "truncated": false, "scope": "none"} + var captured: Dictionary = _editor_log_buffer.get_since(maxi(0, cursor), -1) + truncated = bool(captured.get("truncated", false)) + for raw_entry in captured.get("entries", []): + var compact := _compact_editor_error(raw_entry) + if compact.is_empty(): + continue + out.append(compact) + if out.size() >= 5: + break + if not out.is_empty(): + return {"errors": out, "truncated": truncated, "scope": "run"} + + for raw_entry in _reversed_entries(_editor_log_buffer.get_recent(McpEditorLogBuffer.MAX_LINES)): + var compact := _compact_editor_error(raw_entry, true) + if compact.is_empty(): + continue + out.append(compact) + if out.size() >= 5: + break + if not out.is_empty(): + return {"errors": out, "truncated": false, "scope": "retained_recent"} + return {"errors": out, "truncated": false, "scope": "none"} + + +func _compact_editor_error(raw_entry: Variant, fallback_recent: bool = false) -> Dictionary: + if not raw_entry is Dictionary: + return {} + var entry := raw_entry as Dictionary + if str(entry.get("level", "info")) != "error": + return {} + var path := str(entry.get("path", "")) + if fallback_recent and _is_diagnostic_noise_path(path): + return {} + var compact := { + "source": "editor", + "level": "error", + "text": str(entry.get("text", "")), + "path": path, + "line": int(entry.get("line", 0)), + "function": str(entry.get("function", "")), + } + if entry.has("details"): + compact["details"] = entry["details"].duplicate(true) + return compact + + +func _is_diagnostic_noise_path(path: String) -> bool: + return path.begins_with("res://addons/godot_ai/") or path.begins_with("res://tests/") + + +func _reversed_entries(entries: Array[Dictionary]) -> Array[Dictionary]: + var out: Array[Dictionary] = [] + for i in range(entries.size() - 1, -1, -1): + out.append(entries[i]) + return out + + +func _format_editor_error_summary(entry: Dictionary) -> String: + return McpSurfacedErrorTracker.format_editor_error_summary(entry) + + +func _capture(message: String, data: Array, session_id: int) -> bool: + ## Godot passes the full "prefix:tail" string as `message`. + match message: + "mcp:screenshot_response": + _on_screenshot_response(data) + return true + "mcp:screenshot_error": + _on_screenshot_error(data) + return true + "mcp:log_batch": + _on_log_batch(data) + return true + "mcp:hello": + ## Staleness is checked FIRST, before the buffering branch below: + ## `_begin_game_run_tracking` clears `_game_session_id`, so a beacon + ## validated only at replay time could never be rejected (#891 + ## review). A beacon from a session other than the attached one is + ## some other game's — never hold it, never apply it. + if _game_session_id != -1 and session_id != _game_session_id: + if _log_buffer: + _log_buffer.log("[debug] ignored stale mcp:hello from debugger session %d (current %d)" % [session_id, _game_session_id]) + return true + if not _game_run_active: + ## #891: the run is not adopted YET — a manually started play + ## whose debugger session attached before the editor flipped + ## `is_playing_scene()` lands here. The beacon is a one-shot, + ## so hold it for the imminent adoption instead of dropping it + ## (which left game_eval waiting forever for a hello that had + ## already been thrown away). + _pending_hello_session_id = session_id + ## The beacon is this game's first word, and its boot output + ## follows immediately (the helper flushes on its first + ## `_process`). Rotate the run id NOW so those lines are tagged + ## with the identity adoption will announce, instead of landing + ## under the previous run and vanishing from + ## `logs_read(source="game")` (#891 review). + if _game_log_buffer and not _pre_adoption_log_rotated: + _game_log_buffer.clear_for_new_run() + _pre_adoption_log_rotated = true + if _log_buffer: + _log_buffer.log("[debug] holding mcp:hello from debugger session %d until the run is adopted" % session_id) + return true + _accept_game_hello(session_id) + return true + "mcp:eval_liveness_response": + _on_eval_liveness_response(data) + return true + "mcp:eval_response": + _on_eval_response(data) + return true + "mcp:eval_error": + _on_eval_error(data) + return true + "mcp:eval_ack": + _on_eval_ack(data) + return true + "mcp:eval_compiled": + _on_eval_compiled(data) + return true + "mcp:eval_runtime_error": + _on_eval_runtime_error(data) + return true + "mcp:game_command_response": + _on_game_command_response(data) + return true + "mcp:game_command_error": + _on_game_command_error(data) + return true + return false + + +func _on_log_batch(data: Array) -> void: + if _game_log_buffer == null: + return + ## data layout: [[[level, text, details?], ...]] + if data.is_empty() or not (data[0] is Array): + return + var entries: Array = data[0] + for entry in entries: + if entry is Dictionary: + var dict_details: Dictionary = {} + var raw_dict_details = entry.get("details", {}) + if raw_dict_details is Dictionary: + dict_details = raw_dict_details + _game_log_buffer.append(str(entry.get("level", "info")), str(entry.get("text", "")), dict_details) + continue + if not (entry is Array) or entry.size() < 2: + continue + var details: Dictionary = {} + if entry.size() > 2 and entry[2] is Dictionary: + details = entry[2] + _game_log_buffer.append(str(entry[0]), str(entry[1]), details) + + +## Request a game-process framebuffer capture over the debugger channel. +## Reply is pushed back through `connection` out-of-band because the MCP +## dispatcher has already returned a deferred-response marker for this +## request_id. Synchronous from the caller's perspective — if the +## game-side autoload hasn't beaconed yet, the wait + send run as a +## fire-and-forget coroutine kicked off from here. Structured this way +## so the call site in EditorHandler stays a plain non-await invocation. +func request_game_screenshot( + request_id: String, + max_resolution: int, + connection: McpConnection, + timeout_sec: float = DEFAULT_TIMEOUT_SEC, +) -> void: + if request_id.is_empty(): + push_warning("MCP debugger: screenshot request missing request_id") + return + + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "Editor main loop is not a SceneTree — cannot schedule capture") + return + + if is_game_capture_ready(): + _send_take_screenshot(tree, request_id, max_resolution, connection, timeout_sec) + return + + ## Not ready yet — run the wait-then-send flow as a detached + ## coroutine. It keeps itself alive via the signal subscription on + ## tree.process_frame; the caller doesn't need to (and shouldn't) + ## await this entrypoint. + if _log_buffer: + _log_buffer.log("[debug] waiting for game_helper hello (%s)" % request_id) + _wait_then_send(tree, request_id, max_resolution, connection, timeout_sec) + + +## Coroutine: poll each editor frame until the mcp:hello beacon arrives +## (flipping _game_ready true) or the deadline elapses. Once resolved, +## either dispatch the capture or return an actionable timeout error. +func _wait_then_send( + tree: SceneTree, + request_id: String, + max_resolution: int, + connection: McpConnection, + timeout_sec: float, +) -> void: + var deadline := Time.get_ticks_msec() + int(GAME_READY_WAIT_SEC * 1000.0) + ## #645: always yield at least one frame — the dispatcher registers the + ## deferred request only after the handler returns DEFERRED_RESPONSE, so a + ## same-frame error reply would be dropped as an expired request. The break + ## check then bails out with the actionable break error instead of waiting + ## out the full window (a game parked in a debugger break never beacons). + await tree.process_frame + while not is_game_capture_ready() and not _break_active and Time.get_ticks_msec() < deadline: + await tree.process_frame + if not is_game_capture_ready(): + _send_error_response(connection, request_id, + _explain_not_live(get_game_status(-1, GAME_READY_WAIT_SEC), ErrorCodes.INTERNAL_ERROR)) + return + _send_take_screenshot(tree, request_id, max_resolution, connection, timeout_sec) + + +## Send the mcp:take_screenshot message and arm the reply timeout. +## Assumes _game_ready is true. +func _send_take_screenshot( + tree: SceneTree, + request_id: String, + max_resolution: int, + connection: McpConnection, + timeout_sec: float, +) -> void: + var session: EditorDebuggerSession = _first_active_session() + if session == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "No active debugger session — is the game actually running and started from this editor?") + return + + var timer: SceneTreeTimer = tree.create_timer(timeout_sec) + var timeout_callable := func() -> void: _on_timeout(request_id) + timer.timeout.connect(timeout_callable) + _pending[request_id] = { + "connection": connection, + "timer": timer, + "timeout_callable": timeout_callable, + } + + session.send_message("mcp:take_screenshot", [request_id, max_resolution]) + if _log_buffer: + _log_buffer.log("[debug] -> mcp:take_screenshot (%s)" % request_id) + + +func _first_active_session() -> EditorDebuggerSession: + for s in get_sessions(): + if s is EditorDebuggerSession and s.is_active(): + return s + return null + + +func _on_screenshot_response(data: Array) -> void: + if data.size() < 6: + push_warning("MCP debugger: malformed screenshot response (expected 6 fields, got %d)" % data.size()) + return + var request_id: String = data[0] + var pending = _pending.get(request_id) + if pending == null: + ## Timed out or unknown — silently drop. + return + _clear_pending(request_id) + + var connection: McpConnection = pending.connection + if connection == null or not is_instance_valid(connection): + return + + var payload := { + "source": "game", + "width": int(data[2]), + "height": int(data[3]), + "original_width": int(data[4]), + "original_height": int(data[5]), + "format": "png", + "image_base64": data[1], + } + ## #777: game helpers append frames_drawn + a stale flag so a capture + ## taken while the game's main loop is frozen (backgrounded window) is + ## honestly labeled instead of timing out. Older helpers send six fields + ## — leave the keys absent rather than guessing. + if data.size() >= 8: + payload["frames_drawn"] = int(data[6]) + payload["stale_frame"] = bool(data[7]) + if bool(data[7]): + payload["note"] = ("The game window appears backgrounded or its main loop is " + + "stalled; returning the last rendered frame. Focus the game window and " + + "retry for a current frame.") + ## Vision Routing: when enabled, describe the frame through the configured + ## vision provider on a + ## worker thread and reply with the text description instead of the raw + ## image (see vision_routing.gd). The router replies for us in that case. + if vision_routing != null and vision_routing.is_routing_enabled(): + if vision_routing.route_game_payload(connection, request_id, {"data": payload}): + return + connection.send_deferred_response(request_id, {"data": payload}) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:screenshot_response (%s)" % request_id) + + +func _on_screenshot_error(data: Array) -> void: + if data.size() < 2: + return + var request_id: String = data[0] + var message: String = data[1] + var pending = _pending.get(request_id) + if pending == null: + return + _clear_pending(request_id) + var connection: McpConnection = pending.connection + if connection == null or not is_instance_valid(connection): + return + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, message) + + +## #777: the 8s reply timer fired — the screenshot request reached (or should +## have reached) the game helper and no reply came back. Mirror the eval +## timeout split (#518): a not-live game gets the attributed +## _explain_not_live payload; a live game gets GAME_HELPER_TIMEOUT instead of +## the former opaque INTERNAL_ERROR. With the game side's stalled-loop +## stale-frame fallback, a live game only lands here when it has nothing +## rendered to fall back on, its debugger servicing is itself wedged, or the +## helper died mid-run. +func _on_timeout(request_id: String) -> void: + var pending = _pending.get(request_id) + if pending == null: + return + _pending.erase(request_id) + var connection: McpConnection = pending.connection + if connection == null or not is_instance_valid(connection): + return + var status := get_game_status(-1, GAME_READY_WAIT_SEC) + var err: Dictionary + if status.get("status", "") != "live": + err = _explain_not_live(status, ErrorCodes.INTERNAL_ERROR) + else: + err = ErrorCodes.make(ErrorCodes.GAME_HELPER_TIMEOUT, + "The game process did not return a frame. The game window may be backgrounded or its main loop blocked — focus the game window and retry, or use game_command to confirm liveness.") + _send_error_response(connection, request_id, err) + if _log_buffer: + _log_buffer.log("[debug] !! screenshot timeout (%s)" % request_id) + + +func _send_error(connection: McpConnection, request_id: String, code: String, message: String) -> void: + _send_error_response(connection, request_id, ErrorCodes.make(code, message)) + + +func _send_error_response(connection: McpConnection, request_id: String, err: Dictionary) -> void: + if connection == null or not is_instance_valid(connection): + return + connection.send_deferred_response(request_id, err) + + +func _clear_pending(request_id: String) -> void: + var pending: Dictionary = _pending.get(request_id, {}) + var timer: SceneTreeTimer = pending.get("timer") + var cb: Callable = pending.get("timeout_callable", Callable()) + if timer != null and timer.timeout.is_connected(cb): + timer.timeout.disconnect(cb) + ## #490: eval requests also carry a compile-grace timer and a runtime probe. + var grace: SceneTreeTimer = pending.get("grace_timer") + var gcb: Callable = pending.get("grace_callable", Callable()) + if grace != null and grace.timeout.is_connected(gcb): + grace.timeout.disconnect(gcb) + var probe: SceneTreeTimer = pending.get("probe_timer") + var pcb: Callable = pending.get("probe_callable", Callable()) + if probe != null and probe.timeout.is_connected(pcb): + probe.timeout.disconnect(pcb) + _pending.erase(request_id) + + +## --- game_eval: execute arbitrary GDScript in the running game --- + +## Editor-side fallback timer for game_eval. MUST stay above the game-side +## EVAL_TIMEOUT_SEC (8.0) in runtime/game_helper.gd and below the dispatcher's +## game_eval budget (15000 ms) in dispatcher.gd — i.e. game 8s < editor 10s < +## dispatcher 15s. This timer only fires when the game never replies at all; +## _on_eval_timeout then attributes the failure (game not live vs never-acked +## vs started-and-hung, #518). Drop timeout_sec at/below 8s and it pre-empts +## the game's more specific "Eval exceeded 8s" message — see the TIMEOUT +## ORDERING note on EVAL_TIMEOUT_SEC. +## +## #500/#859: the *not-ready* path adds EVAL_READY_WAIT_SEC (3s) and the +## EVAL_LIVENESS_WAIT_SEC probe (0.25s) on top of this 10s backstop. That sum +## (13.25s) must also stay below the dispatcher/server 15s budget, or a +## not-yet-ready game makes the server time out opaquely before the editor's +## actionable error returns — exactly the residual ~15s TimeoutError bucket +## #500 tracked down. The cross-file contract is enforced by +## tests/unit/test_game_eval_timeout_ordering.py. +func request_game_eval( + code: String, + request_id: String, + connection: McpConnection, + timeout_sec: float = 10.0, +) -> void: + if request_id.is_empty(): + push_warning("MCP debugger: eval request missing request_id") + return + + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "Editor main loop is not a SceneTree — cannot schedule eval") + return + + var run_token := _game_run_token + if is_game_capture_ready(): + _probe_then_eval(tree, code, request_id, connection, timeout_sec, run_token) + return + + if _log_buffer: + _log_buffer.log("[debug] waiting for game_helper hello before eval (%s)" % request_id) + _wait_then_eval(tree, code, request_id, connection, timeout_sec, run_token) + + +func _wait_then_eval( + tree: SceneTree, + code: String, + request_id: String, + connection: McpConnection, + timeout_sec: float, + run_token: int, +) -> void: + ## #500: eval uses EVAL_READY_WAIT_SEC (not the 20s GAME_READY_WAIT_SEC) so + ## the not-ready path returns its actionable error before the 15s server-side + ## command timeout fires an opaque TimeoutError. See EVAL_READY_WAIT_SEC. + _pending[request_id] = { + "kind": "eval_ready_wait", + "connection": connection, + "run_token": run_token, + } + var deadline := Time.get_ticks_msec() + int(EVAL_READY_WAIT_SEC * 1000.0) + ## #645: the leading yield guarantees the dispatcher has registered the + ## deferred request before any reply (a same-frame reply is dropped as + ## expired); the break check bails out early because a parked game never + ## registers its capture. + if _eval_ready_frame_waiter.is_valid(): + await _eval_ready_frame_waiter.call() + else: + await tree.process_frame + while ( + _pending.has(request_id) + and _is_current_game_run(run_token) + and not is_game_capture_ready() + and not _break_active + and Time.get_ticks_msec() < deadline + ): + if _eval_ready_frame_waiter.is_valid(): + await _eval_ready_frame_waiter.call() + else: + await tree.process_frame + ## end_game_run() owns the reply once it has cleared this tracked wait. + if not _pending.has(request_id): + return + if not _is_current_game_run(run_token): + _fail_eval_not_ready(request_id, + "The game run changed before game_eval could start — the game stopped or restarted. Retry against the current run.") + return + if not is_game_capture_ready(): + ## #518: EVAL_GAME_NOT_READY (not INTERNAL_ERROR) — the play session is up + ## but the game-side capture didn't register within the short wait. Fast + ## and caller-actionable; classifying it apart from the opaque 10s hang + ## keeps the INTERNAL_ERROR telemetry bucket meaning "the eval truly hung". + _clear_pending(request_id) + _send_error_response(connection, request_id, + _explain_not_live(get_game_status(-1, EVAL_READY_WAIT_SEC), ErrorCodes.EVAL_GAME_NOT_READY)) + return + _clear_pending(request_id) + _probe_then_eval(tree, code, request_id, connection, timeout_sec, run_token) + + +## #859: registration is run-scoped but not a liveness guarantee. Ping the +## helper's debugger capture and let it report whether its _process beacon is +## still advancing before arming the much longer eval backstop. +func _probe_then_eval( + tree: SceneTree, + code: String, + request_id: String, + connection: McpConnection, + timeout_sec: float, + run_token: int, +) -> void: + if not _is_current_game_run(run_token) or not is_game_capture_ready(): + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "The game run changed before game_eval could be checked — the game stopped or restarted. Retry against the current run.") + return + var session: EditorDebuggerSession = _first_active_session() + if session == null: + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "Game-side capture registered but its debugger session is no longer active — the game likely just stopped or is restarting. Confirm it is running and retry.") + return + + var timer := tree.create_timer(EVAL_LIVENESS_WAIT_SEC) + var timeout_callable := func() -> void: _on_eval_liveness_timeout(request_id) + timer.timeout.connect(timeout_callable) + _pending[request_id] = { + "kind": "eval_liveness", + "connection": connection, + "timer": timer, + "timeout_callable": timeout_callable, + "code": code, + "eval_timeout_sec": timeout_sec, + "run_token": run_token, + } + session.send_message("mcp:eval_liveness", [request_id]) + if _log_buffer: + _log_buffer.log("[debug] -> mcp:eval_liveness (%s)" % request_id) + + +func _on_eval_liveness_timeout(request_id: String) -> void: + var pending_entry = _pending.get(request_id) + if pending_entry == null or str(pending_entry.get("kind", "")) != "eval_liveness": + return + var connection: McpConnection = pending_entry.get("connection") + _clear_pending(request_id) + if connection == null or not is_instance_valid(connection): + return + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + ("The game helper did not answer the liveness probe within %.0fms — the game may be backgrounded, frozen, stopped, or restarting. Focus the game window (or relaunch it) and retry." + % (EVAL_LIVENESS_WAIT_SEC * 1000.0))) + + +func _on_eval_liveness_response(data: Array) -> void: + if data.size() < 2: + push_warning("MCP debugger: malformed eval liveness response") + return + var request_id := str(data[0]) + var pending_entry = _pending.get(request_id) + if pending_entry == null or str(pending_entry.get("kind", "")) != "eval_liveness": + return + var connection: McpConnection = pending_entry.get("connection") + var code := str(pending_entry.get("code", "")) + var timeout_sec := float(pending_entry.get("eval_timeout_sec", 10.0)) + var run_token := int(pending_entry.get("run_token", -1)) + var loop_live := bool(data[1]) + _clear_pending(request_id) + if connection == null or not is_instance_valid(connection): + return + if not _is_current_game_run(run_token) or not is_game_capture_ready(): + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "The game run changed while game_eval liveness was being checked — the game stopped or restarted. Retry against the current run.") + return + if not loop_live: + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "The game helper is registered but its main loop is not advancing — the game window may be backgrounded or the game may be frozen. Focus the game window (or relaunch it) and retry.") + return + var current_tree := Engine.get_main_loop() as SceneTree + if current_tree == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "Editor main loop is not a SceneTree — cannot schedule eval") + return + _send_eval(current_tree, code, request_id, connection, timeout_sec) + + +func _send_eval( + tree: SceneTree, + code: String, + request_id: String, + connection: McpConnection, + timeout_sec: float, +) -> void: + var session: EditorDebuggerSession = _first_active_session() + if session == null: + ## #518: capture reported ready but the debugger session is no longer live + ## (the game just stopped / is restarting) — a not-ready race, so the same + ## caller-actionable EVAL_GAME_NOT_READY rather than the opaque hang bucket. + _send_error(connection, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "Game-side capture registered but its debugger session is no longer active — the game likely just stopped or is restarting. Confirm it's running and retry.") + return + + var timer: SceneTreeTimer = tree.create_timer(timeout_sec) + var timeout_callable := func() -> void: _on_eval_timeout(request_id, timeout_sec) + timer.timeout.connect(timeout_callable) + + ## #490: arm the compile-grace timer. _on_eval_grace concludes a parse error + ## only when the game acked the eval (it received the message and started + ## reload()) but never sent mcp:eval_compiled — see there for why a missing + ## ack must NOT be read as a compile error. + var grace: SceneTreeTimer = tree.create_timer(EVAL_COMPILE_GRACE_SEC) + var grace_callable := func() -> void: _on_eval_grace(request_id) + grace.timeout.connect(grace_callable) + + _pending[request_id] = { + "kind": "eval", + "connection": connection, + "run_token": _game_run_token, + "timer": timer, + "timeout_callable": timeout_callable, + "grace_timer": grace, + "grace_callable": grace_callable, + "acked": false, + "compiled": false, + } + + session.send_message("mcp:eval", [request_id, code]) + if _log_buffer: + _log_buffer.log("[debug] -> mcp:eval (%s)" % request_id) + + +## #518: the 10s editor-side backstop fired — the game never replied at all. +## Attribute the failure instead of emitting a one-size-fits-all INTERNAL_ERROR: +## +## - game not live anymore (parked in a debugger break, stopped, crashed): +## the eval couldn't run/finish for a *game-state* reason. Reply with the +## same caller-actionable EVAL_GAME_NOT_READY + `_explain_not_live` payload +## the pre-hello break path already uses — a break freezes the game's idle +## loop, so any awaiting eval parks here even though sync evals still work. +## - game live but never acked the eval: its main thread never serviced the +## debugger message (long frame/load, CPU-bound prior eval, or a +## backgrounded window whose idle loop is frozen). +## - game live, acked, compiled: the eval genuinely started and never +## finished, and the game couldn't even self-report via its own 8s guard +## (which needs a ticking idle loop) — hung await, CPU-bound loop, or a +## reply the debugger channel dropped. +## +## The live branches reply EVAL_HUNG: the eval code never finished. That code +## plus the game-side 8s guard (also EVAL_HUNG, via mcp:eval_error's code +## element) empties the former INTERNAL_ERROR bucket on this path. +func _on_eval_timeout(request_id: String, timeout_sec: float) -> void: + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + var run_token := int(pending_entry.get("run_token", _game_run_token)) + _clear_pending(request_id) + var conn: McpConnection = pending_entry.connection + if conn == null or not is_instance_valid(conn): + return + if run_token != _game_run_token: + _send_error(conn, request_id, ErrorCodes.EVAL_GAME_NOT_READY, + "The game run changed before game_eval completed — the original game stopped or restarted. Retry against the current run.") + if _log_buffer: + _log_buffer.log("[debug] !! eval timeout from prior run (%s, run=%d, current=%d)" + % [request_id, run_token, _game_run_token]) + return + var status := get_game_status(-1, EVAL_READY_WAIT_SEC) + if str(status.get("status", "")) != "live": + _send_error_response(conn, request_id, + _explain_not_live(status, ErrorCodes.EVAL_GAME_NOT_READY)) + if _log_buffer: + _log_buffer.log("[debug] !! eval timeout, game not live (%s, status=%s)" + % [request_id, str(status.get("status", ""))]) + return + var message: String + if not bool(pending_entry.get("acked", false)): + message = ("Game eval was sent but the game never picked it up within %.0fs — " + + "its main thread is busy or frozen (a long frame/load, a CPU-bound " + + "prior eval, or a backgrounded game window whose loop is throttled). " + + "Check logs_read(source='game') and retry.") % timeout_sec + else: + message = ("Game eval compiled and started running but never returned within " + + "%.0fs — the code is likely stuck in an infinite loop or awaiting a " + + "signal/timer that never fires (a backgrounded game window also freezes " + + "awaits). Check logs_read(source='game').") % timeout_sec + _send_error(conn, request_id, ErrorCodes.EVAL_HUNG, message) + if _log_buffer: + _log_buffer.log("[debug] !! eval timeout (%s)" % request_id) + + +func _on_eval_response(data: Array) -> void: + if data.size() < 2: + push_warning("MCP debugger: malformed eval response (expected 2 fields, got %d)" % data.size()) + return + var request_id: String = data[0] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _clear_pending(request_id) + + var connection: McpConnection = pending_entry.connection + if connection == null or not is_instance_valid(connection): + return + + var result_json: String = data[1] if data.size() > 1 else "null" + var json := JSON.new() + var parse_err := json.parse(result_json) + connection.send_deferred_response(request_id, { + "data": { + "result": json.data if parse_err == OK else result_json, + "source": "game", + } + }) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:eval_response (%s)" % request_id) + + +## #518: codes the game side may attach as mcp:eval_error's optional third +## payload element. Allowlisted so a game process can't mint arbitrary +## top-level error codes over the debugger channel; anything else (including +## the legacy two-element payload from an older game helper mid-update) +## falls back to INTERNAL_ERROR exactly as before. +const _GAME_EVAL_ERROR_CODES: Array[String] = [ + ErrorCodes.EVAL_HUNG, + ErrorCodes.EVAL_RESULT_TOO_LARGE, +] + + +func _on_eval_error(data: Array) -> void: + if data.size() < 2: + return + var request_id: String = data[0] + var message: String = data[1] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _clear_pending(request_id) + var connection: McpConnection = pending_entry.connection + if connection == null or not is_instance_valid(connection): + return + var code := ErrorCodes.INTERNAL_ERROR + if data.size() > 2 and str(data[2]) in _GAME_EVAL_ERROR_CODES: + code = str(data[2]) + _send_error(connection, request_id, code, message) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:eval_error (%s): %s" % [request_id, message]) + + +## #490: the game sends this at the top of _handle_eval, BEFORE reload() (so it +## survives a parse-error abort). It positively signals "the game received this +## eval and started compiling it" — letting _on_eval_grace tell a real parse +## error (acked, never compiled) apart from a message the game hasn't serviced +## yet (never acked — main thread blocked by a long frame/load or a CPU-bound +## prior eval). +func _on_eval_ack(data: Array) -> void: + if data.is_empty(): + return + var request_id: String = data[0] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + pending_entry["acked"] = true + if _log_buffer: + _log_buffer.log("[debug] <- mcp:eval_ack (%s)" % request_id) + + +## #490: compile-grace timer fired. Conclude a parse error ONLY when the game +## acked the eval (started reload()) but never sent mcp:eval_compiled. If it +## never acked, the game simply hasn't serviced the message yet — NOT a parse +## error — so leave _pending intact and let the normal eval timeout handle it +## rather than false-failing a valid eval and dropping its eventual real reply. +func _on_eval_grace(request_id: String) -> void: + var pending_entry = _pending.get(request_id) + if pending_entry == null or pending_entry.get("compiled", false): + return + if not pending_entry.get("acked", false): + if _log_buffer: + _log_buffer.log("[debug] eval grace: no ack yet, deferring to timeout (%s)" % request_id) + return + _clear_pending(request_id) + var conn: McpConnection = pending_entry.connection + if conn == null or not is_instance_valid(conn): + return + _send_error(conn, request_id, ErrorCodes.EVAL_COMPILE_ERROR, + "Game eval failed to compile — likely a GDScript syntax/parse error. The parse error text is in the editor's Output/Debugger panel; it is not capturable from the running game. Check your eval code's syntax.") + if _log_buffer: + _log_buffer.log("[debug] !! eval compile error (%s)" % request_id) + + +## #490: the game sends this the instant reload() of the eval source +## succeeds. Flips the pending entry's `compiled` flag so the compile-grace +## timer won't fire a false EVAL_COMPILE_ERROR. +func _on_eval_compiled(data: Array) -> void: + if data.is_empty(): + return + var request_id: String = data[0] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + pending_entry["compiled"] = true + if _log_buffer: + _log_buffer.log("[debug] <- mcp:eval_compiled (%s)" % request_id) + ## #490: compiled OK — start polling for a runtime error that may have + ## aborted execute(). A backgrounded game can't self-report it, so the + ## editor probes via mcp:eval_check until the eval resolves. + _arm_eval_probe(request_id) + + +## #490: the game reported a runtime error that aborted the eval — either +## from its _process fast path (focused game) or in answer to an editor +## eval_check probe (backgrounded game). Reply fast with the real error text +## instead of waiting for the hang timeout. +func _on_eval_runtime_error(data: Array) -> void: + if data.size() < 2: + return + var request_id: String = data[0] + var message: String = data[1] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _clear_pending(request_id) + var connection: McpConnection = pending_entry.connection + if connection == null or not is_instance_valid(connection): + return + var msg := "Game eval raised a runtime error: %s" % message if not message.is_empty() else "Game eval raised a runtime error (no message captured). Check logs_read(source='game')." + _send_error(connection, request_id, ErrorCodes.EVAL_RUNTIME_ERROR, msg) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:eval_runtime_error (%s): %s" % [request_id, message]) + + +## #490: arm one probe tick for an in-flight eval. Re-arms itself each tick +## until the request resolves — eval_response / eval_runtime_error / +## eval_compile_error / hang-timeout all call _clear_pending, which erases the +## entry and stops the chain. Uses the editor's own SceneTreeTimer because the +## editor loop keeps ticking even while a backgrounded game's loop is frozen. +func _arm_eval_probe(request_id: String) -> void: + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + return + var probe_timer: SceneTreeTimer = tree.create_timer(EVAL_PROBE_INTERVAL_SEC) + var probe_callable := func() -> void: _on_eval_probe_tick(request_id) + pending_entry["probe_timer"] = probe_timer + pending_entry["probe_callable"] = probe_callable + probe_timer.timeout.connect(probe_callable) + + +## #490: poke the game for a runtime-error verdict, then re-arm. The game's +## _handle_eval_check answers with mcp:eval_runtime_error if a script error +## aborted this eval, else stays silent and we poll again next interval. +func _on_eval_probe_tick(request_id: String) -> void: + if not _pending.has(request_id): + return ## resolved — stop probing + var session: EditorDebuggerSession = _first_active_session() + if session != null and session.is_active(): + session.send_message("mcp:eval_check", [request_id]) + _arm_eval_probe(request_id) + + +## --- game_command: curated runtime game operations --- + +func request_game_command( + op: String, + params: Dictionary, + request_id: String, + connection: McpConnection, + timeout_sec: float = 10.0, +) -> void: + if request_id.is_empty(): + push_warning("MCP debugger: game command request missing request_id") + return + + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "Editor main loop is not a SceneTree — cannot schedule game command") + return + + if is_game_capture_ready(): + _send_game_command(tree, op, params, request_id, connection, timeout_sec) + return + + if _log_buffer: + _log_buffer.log("[debug] waiting for game_helper hello before game_command (%s)" % request_id) + _wait_then_game_command(tree, op, params, request_id, connection, timeout_sec) + + +func _wait_then_game_command( + tree: SceneTree, + op: String, + params: Dictionary, + request_id: String, + connection: McpConnection, + timeout_sec: float, +) -> void: + var deadline := Time.get_ticks_msec() + int(GAME_READY_WAIT_SEC * 1000.0) + ## #645: the leading yield guarantees the dispatcher has registered the + ## deferred request before any reply (a same-frame reply is dropped as + ## expired); the break check bails out early because a parked game never + ## registers its capture. + await tree.process_frame + while not is_game_capture_ready() and not _break_active and Time.get_ticks_msec() < deadline: + await tree.process_frame + if not is_game_capture_ready(): + _send_error_response(connection, request_id, + _explain_not_live(get_game_status(-1, GAME_READY_WAIT_SEC), ErrorCodes.INTERNAL_ERROR)) + return + _send_game_command(tree, op, params, request_id, connection, timeout_sec) + + +func _send_game_command( + tree: SceneTree, + op: String, + params: Dictionary, + request_id: String, + connection: McpConnection, + timeout_sec: float, +) -> void: + var session: EditorDebuggerSession = _first_active_session() + if session == null: + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, + "No active debugger session — is the game actually running?") + return + + var timer: SceneTreeTimer = tree.create_timer(timeout_sec) + var timeout_callable := func() -> void: + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _pending.erase(request_id) + var conn: McpConnection = pending_entry.connection + if conn == null or not is_instance_valid(conn): + return + _send_error(conn, request_id, ErrorCodes.INTERNAL_ERROR, + "Game command '%s' timed out after %.0fs" % [op, timeout_sec]) + if _log_buffer: + _log_buffer.log("[debug] !! game_command timeout (%s)" % request_id) + timer.timeout.connect(timeout_callable) + _pending[request_id] = { + "connection": connection, + "timer": timer, + "timeout_callable": timeout_callable, + } + + session.send_message("mcp:game_command", [request_id, op, JSON.stringify(params)]) + if _log_buffer: + _log_buffer.log("[debug] -> mcp:game_command %s (%s)" % [op, request_id]) + + +func _on_game_command_response(data: Array) -> void: + if data.size() < 2: + push_warning("MCP debugger: malformed game_command response (expected 2 fields, got %d)" % data.size()) + return + var request_id: String = data[0] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _clear_pending(request_id) + + var connection: McpConnection = pending_entry.connection + if connection == null or not is_instance_valid(connection): + return + + var result_json: String = data[1] if data.size() > 1 else "{}" + var json := JSON.new() + var parse_err := json.parse(result_json) + connection.send_deferred_response(request_id, { + "data": json.data if parse_err == OK else {"source": "game", "result": result_json} + }) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:game_command_response (%s)" % request_id) + + +func _on_game_command_error(data: Array) -> void: + if data.size() < 2: + return + var request_id: String = data[0] + var message: String = data[1] + var pending_entry = _pending.get(request_id) + if pending_entry == null: + return + _clear_pending(request_id) + var connection: McpConnection = pending_entry.connection + if connection == null or not is_instance_valid(connection): + return + _send_error(connection, request_id, ErrorCodes.INTERNAL_ERROR, message) + if _log_buffer: + _log_buffer.log("[debug] <- mcp:game_command_error (%s): %s" % [request_id, message]) diff --git a/addons/godot_ai/debugger/mcp_debugger_plugin.gd.uid b/addons/godot_ai/debugger/mcp_debugger_plugin.gd.uid new file mode 100644 index 0000000..1d5c148 --- /dev/null +++ b/addons/godot_ai/debugger/mcp_debugger_plugin.gd.uid @@ -0,0 +1 @@ +uid://bd1k63iye1bsl diff --git a/addons/godot_ai/dispatcher.gd b/addons/godot_ai/dispatcher.gd new file mode 100644 index 0000000..c834e8e --- /dev/null +++ b/addons/godot_ai/dispatcher.gd @@ -0,0 +1,476 @@ +@tool +class_name McpDispatcher +extends RefCounted + +## Routes incoming commands to handlers and manages the command queue +## with a per-frame time budget. + +var _command_queue: Array[Dictionary] = [] +var _handlers: Dictionary = {} # command_name -> Callable +## Lazy handler registration (#736): plugin.gd registers command names +## against a handler key plus a per-handler script path and constructor +## args, and the handler script is load()ed and instantiated at the FIRST +## dispatch of one of its commands. This keeps the ~30 handler scripts +## (and everything they preload) out of plugin.gd's eager compile +## closure, which stalled "Initializing plugins" on every editor boot. +## Materialized commands are promoted into `_handlers`, so the lazy dicts +## are only consulted on the first call per command. +var _lazy_handler_specs: Dictionary = {} # handler_key -> {path: String, args: Array} +var _lazy_handler_cache: Dictionary = {} # handler_key -> handler instance +var _lazy_commands: Dictionary = {} # command_name -> {handler: String, method: StringName} +var _pending_deferred: Dictionary = {} # request_id -> {command, started_ms, timeout_ms} +var _log_buffer +var _surfaced_error_tracker +## The McpConnection whose pause_processing handlers flip around unsafe +## editor operations (#288 guard). Set by plugin.gd; untyped to honor the +## self-update field-storage policy. When set, _call_handler restores the +## pause depth a crashed handler left unbalanced (#712) — without this a +## single handler crash inside a pause window freezes the transport +## forever (pause has no watchdog or disconnect reset by design). +var pause_target +var mcp_logging := true +var deferred_timeout_overrides_ms: Dictionary = {} + +const DEFAULT_DEFERRED_TIMEOUT_MS := 4500 +const DEFERRED_TIMEOUT_MS_BY_COMMAND := { + "create_script": 4500, + ## Fresh-`.gd` writes defer through the same import-settle window as + ## create_script (#714) — same headroom over IMPORT_SETTLE_MAX_MSEC. + "write_file": 4500, + "stop_project": 4500, + "run_project": 6000, + "take_screenshot": 30000, + "check_client_status": 30000, + "game_eval": 15000, + "game_command": 15000, + "scan_filesystem": 30000, +} +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const FuzzySuggestions := preload("res://addons/godot_ai/utils/fuzzy_suggestions.gd") + + +func _init(log_buffer: McpLogBuffer, surfaced_error_tracker = null) -> void: + _log_buffer = log_buffer + _surfaced_error_tracker = surfaced_error_tracker + + +## Register a command handler. The callable receives (params: Dictionary) -> Dictionary. +func register(command_name: String, handler: Callable) -> void: + _handlers[command_name] = handler + + +## Declare a lazily-constructed handler (#736). `script_path` is load()ed +## and instantiated with `ctor_args` at the first dispatch of any command +## registered against `handler_key` via register_lazy. `ctor_args` may hold +## plugin-lifetime objects (connection, buffers, the dispatcher itself for +## batch); clear() drops them so teardown ordering matches the old eager +## registration (#46). +func register_lazy_handler(handler_key: String, script_path: String, ctor_args: Array) -> void: + _lazy_handler_specs[handler_key] = {"path": script_path, "args": ctor_args} + + +## Register a command that resolves to `method` on the lazily-constructed +## handler declared under `handler_key`. Same dispatch semantics as +## register(); only construction timing differs. +func register_lazy(command_name: String, handler_key: String, method: StringName) -> void: + _lazy_commands[command_name] = {"handler": handler_key, "method": method} + +func unregister(command_name: String, handler_key: String) -> void: + _handlers.erase(command_name) + _lazy_commands.erase(command_name) + ## Drop the lazy spec/cache only when no remaining command routes to + ## this handler key. Custom tools use 1:1 keys ("custom:") so this + ## always erases for them, but built-in keys serve many commands — + ## erasing the shared spec would strand the siblings on + ## "No lazy handler declared" at dispatch time. + for entry in _lazy_commands.values(): + if entry.get("handler", "") == handler_key: + return + _lazy_handler_cache.erase(handler_key) + _lazy_handler_specs.erase(handler_key) + +## Drop registered handlers, queued commands, and the log buffer ref so +## plugin.gd can release RefCounted handlers before Godot reloads their +## class_name scripts (issue #46). After clear(), the dispatcher is inert. +func clear() -> void: + ## Stop lazy handlers before releasing the cache. Handler-owned polling + ## coroutines retain any in-flight worker and deferred-response connection + ## across frames, then join only after the worker is no longer alive. + for instance in _lazy_handler_cache.values(): + if is_instance_valid(instance) and instance.has_method("prepare_for_teardown"): + instance.call("prepare_for_teardown") + _handlers.clear() + ## Release lazily-constructed handler instances (and the ctor args that + ## reference plugin-lifetime objects) at the same teardown point where + ## eager handler Callables used to be dropped — their destructors must + ## run while their scripts are still loaded (#46). This also breaks the + ## dispatcher -> batch handler -> dispatcher ref cycle. + _lazy_handler_specs.clear() + _lazy_handler_cache.clear() + _lazy_commands.clear() + _command_queue.clear() + _pending_deferred.clear() + _log_buffer = null + _surfaced_error_tracker = null + pause_target = null +## Drop queued-but-unexecuted commands. Called by the connection on +## disconnect (#712): commands queued by the previous connection must not +## execute under the next one — the requester is gone, its in-flight +## futures were already failed server-side, and a mutation landing after +## reconnect is a surprise write nobody can correlate. Deferred bookkeeping +## has its own reset (clear_deferred_responses). +func clear_command_queue() -> void: + _command_queue.clear() + + +## Invoke a registered handler directly by name. Returns the handler's raw +## response dict (no request_id or status wrapping). Returns an UNKNOWN_COMMAND +## error dict if the command is not registered. Used by batch_execute. +func dispatch_direct(command: String, params: Dictionary) -> Dictionary: + if not has_command(command): + return ErrorCodes.make(ErrorCodes.UNKNOWN_COMMAND, "Unknown command: %s" % command) + ## Strip the reserved deferred-reply key: only _dispatch may thread it. + ## A caller-supplied _request_id (e.g. inside a batch_execute + ## sub-command's params) would flip a deferred-capable handler into + ## deferred mode against a request id the dispatcher never registered — + ## the direct caller would get the DEFERRED sentinel instead of a result + ## and the out-of-band reply would be dropped as expired. + if params.has("_request_id"): + params = params.duplicate() + params.erase("_request_id") + return _call_handler(command, params) + + +## Whether a command is registered (eagerly or lazily). +func has_command(command: String) -> bool: + return _handlers.has(command) or _lazy_commands.has(command) + + +## Rank registered commands by similarity to `cmd_name` and return the top `limit` +## matches. Uses Godot's built-in String.similarity() (0.0–1.0). Returns an empty +## array if no candidates clear the threshold. Used by batch_execute to surface +## "did you mean" suggestions when an unknown command is passed. +func suggest_similar(cmd_name: String, limit: int = 3, threshold: float = 0.5) -> Array[String]: + return FuzzySuggestions.rank(cmd_name, _registered_command_names(), limit, threshold, 0.0, 0.0) + + +## Union of eagerly-registered and lazily-registered command names. +## Materialized lazy commands live in both dicts, so dedupe via keys. +func _registered_command_names() -> Array: + var names: Dictionary = {} + for command in _handlers: + names[command] = true + for command in _lazy_commands: + names[command] = true + return names.keys() + + +## Enqueue a raw command dict received from the WebSocket. +func enqueue(cmd: Dictionary) -> void: + _command_queue.append(cmd) + + +func pending_deferred_count() -> int: + return _pending_deferred.size() + + +func clear_deferred_responses() -> void: + _pending_deferred.clear() + + +func has_pending_deferred_response(request_id: String) -> bool: + return request_id.is_empty() or _pending_deferred.has(request_id) + + +func complete_deferred_response(request_id: String) -> bool: + if request_id.is_empty(): + return true + if not _pending_deferred.has(request_id): + return false + _pending_deferred.erase(request_id) + return true + + +## Handlers whose response flows out-of-band (e.g. debugger-channel capture) +## return this marker so tick() skips auto-sending a response. The handler is +## responsible for pushing the final response via McpConnection._send_json when +## the async operation completes. The dispatcher tracks the request_id and emits +## DEFERRED_TIMEOUT if the out-of-band response never arrives. The request_id is +## threaded through params under the "_request_id" key so the handler can +## correlate the response. +const DEFERRED_RESPONSE := {"_deferred": true} + + +## Process queued commands within a frame budget (milliseconds). +## Returns an array of response dictionaries to send back. +func tick(budget_ms: float = 4.0) -> Array[Dictionary]: + var responses: Array[Dictionary] = _collect_deferred_timeouts() + var start := Time.get_ticks_msec() + var idx := 0 + + while idx < _command_queue.size() and (Time.get_ticks_msec() - start) < budget_ms: + var cmd: Dictionary = _command_queue[idx] + var response := _dispatch(cmd) + if not response.get("_deferred", false): + responses.append(response) + idx += 1 + + if idx > 0: + _command_queue = _command_queue.slice(idx) + + return responses + + +func _dispatch(cmd: Dictionary) -> Dictionary: + var request_id: String = cmd.get("request_id", "") + var command: String = cmd.get("command", "") + var raw_params: Dictionary = cmd.get("params", {}) + ## Duplicate so the internal _request_id key we thread through doesn't + ## mutate the queued command's params (which is the same dict we're + ## about to JSON-log below, and which later readers like batch_execute + ## shouldn't see dispatcher-internal metadata from). + var params: Dictionary = raw_params.duplicate() + params["_request_id"] = request_id + + if mcp_logging: + _log_buffer.log("[recv] %s(%s)" % [command, JSON.stringify(raw_params)]) + + var result: Dictionary + + if has_command(command): + result = _call_handler(command, params) + else: + result = ErrorCodes.make(ErrorCodes.UNKNOWN_COMMAND, "Unknown command: %s" % command) + + if result.get("_deferred", false): + ## A handler may attach `_deferred_timeout_ms` to its deferred sentinel + ## to claim a per-request budget larger than its command's shared entry + ## (e.g. game_command's `input_sequence`, which steps frames well past + ## the 15s that suits one-shot game ops). 0/absent falls back to the + ## per-command table. + _register_deferred(request_id, command, int(result.get("_deferred_timeout_ms", 0))) + if mcp_logging: + _log_buffer.log("[defer] %s (request %s)" % [command, request_id]) + return result + + result["request_id"] = request_id + if not result.has("status"): + result["status"] = "ok" + ## Stamp live editor readiness onto every command-response envelope so + ## the server's `Session.readiness` cache self-heals on the very next + ## tool call. Without this, a single dropped `readiness_changed` event + ## (or a one-frame race around `pause_processing`) leaves the cache + ## stuck at "playing" / "importing" long after the editor has settled, + ## and write tools fail with EDITOR_NOT_READY against a writable editor. + ## See connection.gd::send_deferred_response for the deferred-response + ## counterpart, which stamps the same field. + result["readiness"] = McpConnection.get_readiness() + _stamp_error_watermark(result) + + if mcp_logging: + var status: String = result.get("status", "ok") + if status == "ok": + _log_buffer.log("[send] %s -> ok" % command) + else: + var err_msg: String = result.get("error", {}).get("message", "unknown") + _log_buffer.log("[send] %s -> error: %s" % [command, err_msg]) + + return result + + +## Truncate JSON-stringified args at this many chars when stuffing them into +## a malformed-result error message — large dicts shouldn't bloat the +## response, but a few hundred chars usually pinpoints which param was the +## wrong shape. +const _MALFORMED_ARGS_MAX := 400 + + +func _call_handler(command: String, params: Dictionary) -> Dictionary: + if not _handlers.has(command): + var materialize_error := _materialize_lazy_command(command) + if not materialize_error.is_empty(): + return materialize_error + ## #712: a handler that crashes between pause_processing = true and its + ## matching false leaves the pause depth unbalanced — GDScript swallows + ## the error, the dispatcher reports "malformed result", and the + ## transport stays paused FOREVER (no watchdog, no disconnect reset). + ## Restore balance at this boundary: the depth a handler leaves behind + ## must equal the depth it started with. + var pause_depth_before: int = pause_target.pause_depth() if pause_target != null else 0 + var result: Dictionary = _handlers[command].call(params) + if pause_target != null and pause_target.pause_depth() > pause_depth_before: + var leaked: int = pause_target.pause_depth() - pause_depth_before + while pause_target.pause_depth() > pause_depth_before: + pause_target.resume() + if mcp_logging and _log_buffer != null: + _log_buffer.log( + "[error] %s leaked %d pause_processing level(s) — restored (handler crash?)" + % [command, leaked] + ) + ## Handlers must return {"data": ...} on success or {"error": ...} on failure. + ## Anything else (null, empty, missing keys) means the handler crashed + ## mid-call — GDScript swallows the error and returns an empty dict. + if result == null or not (result.has("data") or result.has("error") or result.has("_deferred")): + var safe_params := params.duplicate() + safe_params.erase("_request_id") + var args_json := JSON.stringify(safe_params) + if args_json.length() > _MALFORMED_ARGS_MAX: + args_json = args_json.substr(0, _MALFORMED_ARGS_MAX) + "..." + var backtrace := _capture_compact_backtrace() + var msg := ( + "Handler '%s' returned malformed result — likely a runtime error in the handler " + + "(e.g. param type mismatch). Args received: %s" + ) % [command, args_json] + if not backtrace.is_empty(): + msg += "\nBacktrace:\n%s" % backtrace + if mcp_logging and _log_buffer != null: + var compact_backtrace := backtrace.replace("\n", " | ") + _log_buffer.log( + "[error] %s -> malformed result; args=%s; backtrace=%s" + % [command, args_json, compact_backtrace] + ) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, msg) + return result + + +## Resolve a lazily-registered command into a live Callable in `_handlers`. +## Loads + constructs the owning handler on first use (cached per handler +## key, so one load() covers every command the handler serves). Returns an +## empty dict on success or a protocol error dict on failure — a missing +## script or method is a plugin packaging bug and must surface loudly, not +## as a silent no-op. +func _materialize_lazy_command(command: String) -> Dictionary: + var command_spec: Dictionary = _lazy_commands.get(command, {}) + if command_spec.is_empty(): + return ErrorCodes.make(ErrorCodes.UNKNOWN_COMMAND, "Unknown command: %s" % command) + var handler_key: String = command_spec["handler"] + var instance = _lazy_handler_cache.get(handler_key) + if instance == null: + var handler_spec: Dictionary = _lazy_handler_specs.get(handler_key, {}) + if handler_spec.is_empty(): + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "No lazy handler '%s' declared for command '%s'" % [handler_key, command] + ) + ## Existence-check first so a missing script surfaces as one clean + ## protocol error instead of also spraying engine load errors. + if not ResourceLoader.exists(handler_spec["path"]): + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Missing handler script '%s' for command '%s'" % [handler_spec["path"], command] + ) + var script := load(handler_spec["path"]) as GDScript + if script == null: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to load handler script '%s' for command '%s'" % [handler_spec["path"], command] + ) + instance = script.callv("new", handler_spec["args"]) + if instance == null: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to construct handler '%s' for command '%s'" % [handler_key, command] + ) + _lazy_handler_cache[handler_key] = instance + var method: StringName = command_spec["method"] + if not instance.has_method(method): + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Handler '%s' has no method '%s' for command '%s'" % [handler_key, method, command] + ) + _handlers[command] = Callable(instance, method) + return {} + + +func _register_deferred(request_id: String, command: String, timeout_override_ms: int = 0) -> void: + if request_id.is_empty(): + return + ## A positive per-request override wins over the per-command table so a + ## single deferred call can claim more headroom without globally widening + ## the command's budget (see _dispatch: input_sequence needs ~30s, but the + ## other game_command ops must keep their tight 15s). + var timeout_ms: int = ( + timeout_override_ms if timeout_override_ms > 0 + else _deferred_timeout_ms_for_command(command) + ) + _pending_deferred[request_id] = { + "command": command, + "started_ms": Time.get_ticks_msec(), + "timeout_ms": timeout_ms, + } + + +func _deferred_timeout_ms_for_command(command: String) -> int: + if deferred_timeout_overrides_ms.has(command): + return int(deferred_timeout_overrides_ms[command]) + return int(DEFERRED_TIMEOUT_MS_BY_COMMAND.get(command, DEFAULT_DEFERRED_TIMEOUT_MS)) + + +func _collect_deferred_timeouts() -> Array[Dictionary]: + var responses: Array[Dictionary] = [] + if _pending_deferred.is_empty(): + return responses + var now := Time.get_ticks_msec() + for request_id in _pending_deferred.keys(): + var entry: Dictionary = _pending_deferred[request_id] + var timeout_ms: int = entry.get("timeout_ms", DEFAULT_DEFERRED_TIMEOUT_MS) + var elapsed_ms := now - int(entry.get("started_ms", now)) + if elapsed_ms < timeout_ms: + continue + _pending_deferred.erase(request_id) + var command: String = entry.get("command", "") + var response := ErrorCodes.make( + ErrorCodes.DEFERRED_TIMEOUT, + "Deferred response for '%s' timed out after %dms" % [command, timeout_ms] + ) + response["request_id"] = request_id + response["error"]["data"] = { + "command": command, + "elapsed_ms": elapsed_ms, + "timeout_ms": timeout_ms, + } + ## Same envelope-level readiness stamp as `_dispatch` — keep the + ## self-heal channel symmetric across every reply shape the + ## dispatcher emits so the server cache can't drift just because + ## the editor happened to time out a deferred command. + response["readiness"] = McpConnection.get_readiness() + _stamp_error_watermark(response) + responses.append(response) + if mcp_logging and _log_buffer != null: + _log_buffer.log("[defer] %s (request %s) -> timeout" % [command, request_id]) + return responses + + +func _stamp_error_watermark(response: Dictionary) -> void: + McpSurfacedErrorTracker.stamp_watermark(response, _surfaced_error_tracker) + + +static func _capture_compact_backtrace(max_frames: int = 8) -> String: + var traces: Array = Engine.capture_script_backtraces(false) + for bt in traces: + if bt != null and not bt.is_empty(): + return _trim_backtrace_string(bt.format(0, 2), max_frames) + return _format_stack_frames(get_stack(), max_frames) + + +static func _trim_backtrace_string(text: String, max_frames: int) -> String: + var lines := text.strip_edges().split("\n") + var kept: Array[String] = [] + for i in range(min(lines.size(), max_frames)): + kept.append(lines[i].strip_edges()) + return "\n".join(kept) + + +static func _format_stack_frames(frames: Array, max_frames: int) -> String: + var lines: Array[String] = [] + for i in range(min(frames.size(), max_frames)): + var frame: Dictionary = frames[i] + lines.append( + "%s:%s in %s" + % [ + frame.get("source", "?"), + frame.get("line", 0), + frame.get("function", "?"), + ] + ) + return "\n".join(lines) diff --git a/addons/godot_ai/dispatcher.gd.uid b/addons/godot_ai/dispatcher.gd.uid new file mode 100644 index 0000000..25a05bd --- /dev/null +++ b/addons/godot_ai/dispatcher.gd.uid @@ -0,0 +1 @@ +uid://ctldk7ivsoo3i diff --git a/addons/godot_ai/dock_panels/log_viewer.gd b/addons/godot_ai/dock_panels/log_viewer.gd new file mode 100644 index 0000000..1d7b986 --- /dev/null +++ b/addons/godot_ai/dock_panels/log_viewer.gd @@ -0,0 +1,100 @@ +@tool +extends VBoxContainer + +## Dock subpanel — renders the MCP request/response log buffer. Owns its own +## UI subtree, the line-count cursor, and the display-visibility toggle. Emits +## `logging_enabled_changed` so the dock can route the flag onto the +## connection dispatcher without the panel knowing the routing exists. +## +## Extracted from mcp_dock.gd as part of audit-v2 #360 — see the comment at +## the top of mcp_dock.gd for the broader extraction story. + +signal logging_enabled_changed(enabled: bool) + +const Dock := preload("res://addons/godot_ai/mcp_dock.gd") +## Preload (not the McpSettings class_name) for consistency with the parse +## hazard note on `_log_buffer` below. +const Settings := preload("res://addons/godot_ai/utils/settings.gd") + +## Untyped: a `: McpLogBuffer` annotation hits the class_name registry at +## script-load and trips the self-update parse hazard (#398). The type fence +## stays on the `setup(log_buffer: McpLogBuffer)` parameter. +var _log_buffer +var _log_display: RichTextLabel +var _log_toggle: CheckButton +## Last `McpLogBuffer.total_logged()` value painted into the display. Tracking +## the buffer's monotonic sequence (rather than its bounded `total_count()`) +## keeps the viewer painting once the ring fills — a size-based cursor would +## freeze at MAX_LINES on every subsequent append. See PR #392 for the bug. +var _last_log_seq := 0 + + +## Build the UI synchronously here so callers (and detached-tree tests that +## instantiate the dock with `McpDockScript.new()` and never enter the tree) +## can interact with the panel's controls right after `setup()`. Mirrors the +## pre-extraction inline-build behavior that test_dock.gd relies on. +## +## Idempotent: `_log_display == null` covers an unlikely double-`setup()` call +## without rebuilding (which would orphan the prior controls). +func setup(log_buffer: McpLogBuffer) -> void: + _log_buffer = log_buffer + if _log_display == null: + _build_ui() + + +func _build_ui() -> void: + add_child(HSeparator.new()) + + var log_header_row := HBoxContainer.new() + var log_header := Dock._make_header("MCP Log") + log_header.size_flags_horizontal = Control.SIZE_EXPAND_FILL + log_header_row.add_child(log_header) + + _log_toggle = CheckButton.new() + _log_toggle.text = "Log" + ## Restore the persisted choice — a hardcoded `true` here meant the + ## toggle reset to noisy on every editor restart (#626). + _log_toggle.button_pressed = Settings.mcp_logging_enabled() + _log_toggle.toggled.connect(_on_log_toggled) + log_header_row.add_child(_log_toggle) + + add_child(log_header_row) + + _log_display = RichTextLabel.new() + _log_display.custom_minimum_size = Vector2(0, 80) + _log_display.scroll_following = true + _log_display.bbcode_enabled = false + _log_display.selection_enabled = true + _log_display.visible = _log_toggle.button_pressed + add_child(_log_display) + + +## Called from McpDock._process when the panel is visible. Appends any new +## log lines since the last tick. +func tick() -> void: + if _log_buffer == null or _log_display == null: + return + var seq: int = _log_buffer.total_logged() + if seq == _last_log_seq: + return + if seq < _last_log_seq: + ## Buffer cleared via `McpLogBuffer.clear()` (the `clear_logs` MCP + ## tool / `logs_clear` handler). The buffer resets `_total_logged` + ## to 0, flipping the sequence backward. Without this branch the + ## display would keep showing pre-clear lines forever — the viewer + ## drifts permanently out of sync with the buffer. Reset display + + ## cursor so the next append paints over a clean slate. + _log_display.clear() + _last_log_seq = 0 + if seq == 0: + return + var new_lines: Array[String] = _log_buffer.get_recent(seq - _last_log_seq) + for line in new_lines: + _log_display.add_text(line + "\n") + _last_log_seq = seq + + +func _on_log_toggled(enabled: bool) -> void: + Settings.set_mcp_logging_enabled(enabled) + _log_display.visible = enabled + logging_enabled_changed.emit(enabled) diff --git a/addons/godot_ai/dock_panels/log_viewer.gd.uid b/addons/godot_ai/dock_panels/log_viewer.gd.uid new file mode 100644 index 0000000..c261627 --- /dev/null +++ b/addons/godot_ai/dock_panels/log_viewer.gd.uid @@ -0,0 +1 @@ +uid://cr5nbnd6vj3b8 diff --git a/addons/godot_ai/dock_panels/port_picker_panel.gd b/addons/godot_ai/dock_panels/port_picker_panel.gd new file mode 100644 index 0000000..30c3ed3 --- /dev/null +++ b/addons/godot_ai/dock_panels/port_picker_panel.gd @@ -0,0 +1,78 @@ +@tool +extends VBoxContainer + +## Dock subpanel — port-change escape hatch surfaced inside the spawn-failure +## crash panel when the HTTP port is contested (PORT_EXCLUDED, FOREIGN_PORT). +## Emits `port_apply_requested(new_port)` after range-validation; the dock +## handles writing the EditorSetting and reloading the plugin. +## +## Extracted from mcp_dock.gd as part of audit-v2 #360 — see the comment at +## the top of mcp_dock.gd for the broader extraction story. + +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") + +signal port_apply_requested(new_port: int) + +var _spinbox: SpinBox + + +## Build the UI synchronously here so callers (and detached-tree tests that +## instantiate the dock with `McpDockScript.new()` and never enter the tree) +## can interact with the panel's controls right after `setup()`. Mirrors the +## pre-extraction inline-build behavior that test_dock.gd relies on. +## +## Idempotent: `_spinbox == null` covers an unlikely double-`setup()` call +## without rebuilding (which would orphan the prior controls). +func setup() -> void: + if _spinbox == null: + _build_ui() + + +func _build_ui() -> void: + add_theme_constant_override("separation", 4) + visible = false + + var picker_row := HBoxContainer.new() + picker_row.add_theme_constant_override("separation", 6) + + _spinbox = SpinBox.new() + _spinbox.min_value = ClientConfigurator.MIN_PORT + _spinbox.max_value = ClientConfigurator.MAX_PORT + _spinbox.step = 1 + _spinbox.value = ClientConfigurator.http_port() + _spinbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL + picker_row.add_child(_spinbox) + + var apply_btn := Button.new() + apply_btn.text = "Apply + Reload" + apply_btn.tooltip_text = ( + "Saves godot_ai/http_port to Editor Settings and reloads the plugin so" + + " the server spawns on the new port." + ) + apply_btn.pressed.connect(_on_apply_pressed) + picker_row.add_child(apply_btn) + + add_child(picker_row) + + +## Re-seed the spinbox with a fresh suggestion every time the panel surfaces, +## so a stale value from a previous spawn-failure round can't carry over. Note +## that this OVERWRITES any unsaved user input — fine in practice because the +## dock's `_update_crash_panel` only calls this on `server_status` transitions +## (`if server_status == _last_server_status: return` short-circuit), so a +## user typing into the spinbox between transitions keeps their value. If the +## state flips while the picker is visible (e.g. `PORT_EXCLUDED` → `FOREIGN_PORT`), +## the in-flight edit is clobbered — accept that, the suggestion is more current. +func seed_suggested_port() -> void: + if _spinbox == null: + return + _spinbox.value = ClientConfigurator.suggest_free_port( + ClientConfigurator.http_port() + 1 + ) + + +func _on_apply_pressed() -> void: + var new_port: int = int(_spinbox.value) + if new_port < ClientConfigurator.MIN_PORT or new_port > ClientConfigurator.MAX_PORT: + return + port_apply_requested.emit(new_port) diff --git a/addons/godot_ai/dock_panels/port_picker_panel.gd.uid b/addons/godot_ai/dock_panels/port_picker_panel.gd.uid new file mode 100644 index 0000000..38b6320 --- /dev/null +++ b/addons/godot_ai/dock_panels/port_picker_panel.gd.uid @@ -0,0 +1 @@ +uid://hlggbo1q65eq diff --git a/addons/godot_ai/export/mcp_export_plugin.gd b/addons/godot_ai/export/mcp_export_plugin.gd new file mode 100644 index 0000000..5a8b885 --- /dev/null +++ b/addons/godot_ai/export/mcp_export_plugin.gd @@ -0,0 +1,69 @@ +@tool +extends EditorExportPlugin + +## Strips the MCP game-helper autoload from exported builds (#740). +## +## plugin.gd writes `autoload/_mcp_game_helper` into project.godot so the +## editor-spawned game process loads the helper. Exports bake project +## settings into the pack's project.binary, so without this plugin every +## export ships the autoload — and users who exclude addons/godot_ai/** +## in their export preset get three "Failed to instantiate an autoload" +## errors at game start. Even when the files ARE shipped, the helper is +## editor-tooling: no exported build should carry it. +## +## Strip mechanics: clear the in-memory ProjectSettings entry in +## _export_begin, restore it in _export_end. The export pipeline reads +## the live ProjectSettings when it bakes project.binary, which happens +## after _export_begin — verified end-to-end by +## script/ci-export-strip-smoke, which exports a real pack and asserts +## the autoload is absent inside it. We never call ProjectSettings.save() +## while stripped, so project.godot on disk keeps the autoload +## throughout; only the export snapshot loses it. +## +## Failure containment: if an export aborts so hard that _export_end +## never fires, the damage is bounded to the editor's in-memory settings +## — the running game reads project.godot from disk, and plugin.gd's +## _ensure_game_helper_autoload() re-asserts the entry on the next +## plugin enable / editor launch. + +## Must equal "autoload/" + plugin.gd's GAME_HELPER_AUTOLOAD_NAME. +## Duplicated (not preloaded from plugin.gd) to avoid a cyclic preload — +## plugin.gd preloads this script. The pairing is locked by +## test_export_strip.gd's constants-contract test. +const AUTOLOAD_KEY := "autoload/_mcp_game_helper" + +var _saved_value: Variant = null +var _stripped := false + + +func _get_name() -> String: + return "GodotAIStripAutoload" + + +func _export_begin(_features: PackedStringArray, _is_debug: bool, _path: String, _flags: int) -> void: + ## `_stripped` guard: if a previous export died before _export_end, + ## don't overwrite the genuinely-saved value with the already-cleared + ## state — restore semantics stay anchored to the original value. + if _stripped: + return + if not ProjectSettings.has_setting(AUTOLOAD_KEY): + return + _saved_value = ProjectSettings.get_setting(AUTOLOAD_KEY) + ## Setting a project setting to null erases it. + ProjectSettings.set_setting(AUTOLOAD_KEY, null) + _stripped = true + print("MCP | export: stripping %s from the exported pack (restored in the editor after export)" % AUTOLOAD_KEY) + + +func _export_end() -> void: + if not _stripped: + return + ProjectSettings.set_setting(AUTOLOAD_KEY, _saved_value) + ## Mirror _ensure_game_helper_autoload()'s registration shape so the + ## restored entry is indistinguishable from the original: initial + ## value "" keeps project.godot diff-clean, basic keeps it visible in + ## the non-advanced settings view. + ProjectSettings.set_initial_value(AUTOLOAD_KEY, "") + ProjectSettings.set_as_basic(AUTOLOAD_KEY, true) + _saved_value = null + _stripped = false diff --git a/addons/godot_ai/export/mcp_export_plugin.gd.uid b/addons/godot_ai/export/mcp_export_plugin.gd.uid new file mode 100644 index 0000000..f2a3634 --- /dev/null +++ b/addons/godot_ai/export/mcp_export_plugin.gd.uid @@ -0,0 +1 @@ +uid://np0cp6fwpim7 diff --git a/addons/godot_ai/handlers/_node_validator.gd b/addons/godot_ai/handlers/_node_validator.gd new file mode 100644 index 0000000..61bbe10 --- /dev/null +++ b/addons/godot_ai/handlers/_node_validator.gd @@ -0,0 +1,71 @@ +@tool +class_name McpNodeValidator +extends RefCounted + +## Shared resolve-or-error helper that subsumes the 38+ sites where +## handlers each rolled their own "is the editor ready, does the path +## resolve, otherwise return EDITOR_NOT_READY / NODE_NOT_FOUND" guard. +## +## audit-v2 #20 (issue #364). Uses the audit-v2 #21 (issue #365) error +## vocabulary. + +## Local const names alias the preloaded scripts. The naming choice is +## stylistic, not an upgrade-safety boundary: bare `McpErrorCodes.MEMBER` +## and `ErrorCodes.MEMBER` both depend on the Script object Godot has for +## `error_codes.gd`. The transient #398 parse errors were caused by the +## old runner scanning a mixed old/new plugin snapshot and seeing stale +## Script-object content; the runner now writes one v(N+1) snapshot before +## its scan. +const ScenePath := preload("res://addons/godot_ai/utils/scene_path.gd") +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + + +## Resolve a scene-relative path to the live Node, or return a structured +## error dict. +## +## Success shape: `{"node": Node, "scene_root": Node, "path": String}`. +## Error shape: matches `ErrorCodes.make(...)` so callers can +## `return resolved` to propagate. +## +## Errors (in order checked): +## - `MISSING_REQUIRED_PARAM`: `node_path` is empty +## - `EDITOR_NOT_READY`: no scene open +## - `EDITED_SCENE_MISMATCH`: caller pinned `scene_file` and the open +## scene's path doesn't match +## - `NODE_NOT_FOUND`: `node_path` doesn't resolve under the scene root +## +## `param_name` is the agent-facing name reported in the +## `MISSING_REQUIRED_PARAM` message — handlers pass "node_path", +## "player_path", "target_path", etc. so the error reads like the +## hand-written messages it replaces. +static func resolve_or_error( + node_path: String, + param_name: String = "path", + scene_file: String = "", +) -> Dictionary: + if node_path.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "Missing required param: %s" % param_name, + ) + var scene_check := ScenePath.require_edited_scene(scene_file) + if scene_check.has("error"): + return scene_check + var scene_root: Node = scene_check.node + var node := ScenePath.resolve(node_path, scene_root) + if node == null: + return ErrorCodes.make( + ErrorCodes.NODE_NOT_FOUND, + ScenePath.format_node_error(node_path, scene_root), + ) + return {"node": node, "scene_root": scene_root, "path": node_path} + + +## When the caller needs the scene root but no specific node yet — e.g. +## handlers that walk children or filter by group. Returns either +## `{"scene_root": Node}` or an `ErrorCodes.make(...)` error dict. +static func require_scene_or_error(scene_file: String = "") -> Dictionary: + var scene_check := ScenePath.require_edited_scene(scene_file) + if scene_check.has("error"): + return scene_check + return {"scene_root": scene_check.node} diff --git a/addons/godot_ai/handlers/_node_validator.gd.uid b/addons/godot_ai/handlers/_node_validator.gd.uid new file mode 100644 index 0000000..b3153a6 --- /dev/null +++ b/addons/godot_ai/handlers/_node_validator.gd.uid @@ -0,0 +1 @@ +uid://dn75jifad0ghx diff --git a/addons/godot_ai/handlers/_param_validators.gd b/addons/godot_ai/handlers/_param_validators.gd new file mode 100644 index 0000000..a316b32 --- /dev/null +++ b/addons/godot_ai/handlers/_param_validators.gd @@ -0,0 +1,30 @@ +@tool +class_name McpParamValidators +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Type-check a JSON-decoded param Variant before assigning it into a typed +## GDScript local. The dispatcher only catches handler crashes as an opaque +## "malformed result" (issue #210), so a typed assignment like +## var group: String = params.get("group", "") +## will runtime-error and bubble up without telling the caller which param +## was the wrong shape. Only string params are guarded — int/bool params +## can't be: Godot's JSON parser decodes every number as float (a wire `5` +## arrives as `5.0`), so a strict int check would reject every legitimate +## integer a client sends, and GDScript's typed assignment already converts +## numeric Variants safely. Bool params arrive as real bools and a wrong +## type surfaces through the dispatcher's malformed-result path. + + +## Returns null iff `value` is a String or StringName. On any other type +## returns an INVALID_PARAMS error dict whose message names both `name` and +## the actual Variant type (via Godot's built-in `type_string`). +static func require_string(name: String, value: Variant) -> Variant: + var t := typeof(value) + if t == TYPE_STRING or t == TYPE_STRING_NAME: + return null + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Param '%s' must be a String, got %s" % [name, type_string(t)], + ) diff --git a/addons/godot_ai/handlers/_param_validators.gd.uid b/addons/godot_ai/handlers/_param_validators.gd.uid new file mode 100644 index 0000000..cd2061e --- /dev/null +++ b/addons/godot_ai/handlers/_param_validators.gd.uid @@ -0,0 +1 @@ +uid://difa877m8dsla diff --git a/addons/godot_ai/handlers/_property_errors.gd b/addons/godot_ai/handlers/_property_errors.gd new file mode 100644 index 0000000..316b941 --- /dev/null +++ b/addons/godot_ai/handlers/_property_errors.gd @@ -0,0 +1,82 @@ +@tool +class_name McpPropertyErrors +extends RefCounted + +## Shared helper for building "Property not found" error messages that include +## "did you mean" suggestions and a tail of available property names. All +## handlers that validate user-supplied property names against a target Object +## (Node, Resource, …) should route through build_message() so agents get +## consistent, actionable errors on typos. +## +## Ranking combines Godot's built-in String.similarity() with a substring +## bonus so both "radus" → "radius" (edit distance) and "top" → "top_radius" +## (substring) surface naturally. + +const _SIMILARITY_THRESHOLD: float = 0.4 +const _SUBSTRING_BONUS: float = 0.5 +const _MAX_SUGGESTIONS: int = 5 +const _MAX_TAIL: int = 10 + + +static func build_message(target: Object, bad_name: String) -> String: + if target == null: + return "Property '%s' not found" % bad_name + var class_label := _class_label(target) + var available := _available_property_names(target) + if available.is_empty(): + return "Property '%s' not found on %s" % [bad_name, class_label] + + var msg := "Property '%s' not found on %s" % [bad_name, class_label] + var suggestions := _rank_suggestions(bad_name, available) + if not suggestions.is_empty(): + msg += ". Did you mean: %s?" % ", ".join(suggestions) + + var tail_names := available.slice(0, min(_MAX_TAIL, available.size())) + msg += " (available: %s" % ", ".join(tail_names) + if available.size() > tail_names.size(): + msg += ", ..." + msg += ")" + return msg + + +## Prefer a scripted class_name if the target has one, else the engine class. +static func _class_label(target: Object) -> String: + var scr := target.get_script() + if scr != null and scr.has_method("get_global_name"): + var gcn: String = scr.get_global_name() + if not gcn.is_empty(): + return gcn + return target.get_class() + + +## Editor-visible properties, alphabetised, with internal/category entries dropped. +static func _available_property_names(target: Object) -> Array: + var names: Array = [] + for p in target.get_property_list(): + var usage: int = int(p.get("usage", 0)) + if (usage & PROPERTY_USAGE_EDITOR) == 0: + continue + var name: String = p.get("name", "") + if name.is_empty() or name.begins_with("_"): + continue + names.append(name) + names.sort() + return names + + +static func _rank_suggestions(bad: String, available: Array) -> Array: + if bad.is_empty(): + return [] + var bad_lower := bad.to_lower() + var scored: Array = [] + for n in available: + var score: float = bad.similarity(n) + if n.to_lower().find(bad_lower) != -1 or bad_lower.find(n.to_lower()) != -1: + score += _SUBSTRING_BONUS + if score >= _SIMILARITY_THRESHOLD: + scored.append([score, n]) + scored.sort_custom(func(a, b): return a[0] > b[0]) + var result: Array = [] + for i in range(min(_MAX_SUGGESTIONS, scored.size())): + result.append(scored[i][1]) + return result diff --git a/addons/godot_ai/handlers/_property_errors.gd.uid b/addons/godot_ai/handlers/_property_errors.gd.uid new file mode 100644 index 0000000..c29d21c --- /dev/null +++ b/addons/godot_ai/handlers/_property_errors.gd.uid @@ -0,0 +1 @@ +uid://c74d560g4l86b diff --git a/addons/godot_ai/handlers/animation_handler.gd b/addons/godot_ai/handlers/animation_handler.gd new file mode 100644 index 0000000..8000b78 --- /dev/null +++ b/addons/godot_ai/handlers/animation_handler.gd @@ -0,0 +1,825 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles AnimationPlayer authoring: creating players, animations, tracks, +## keyframes, autoplay, and dev-ergonomics playback. +## +## Animations live inside an AnimationLibrary attached to an AnimationPlayer +## node in the scene. They save with the .tscn — no separate resource file +## needed. Undo callables hold direct Animation references (not paths). +## +## Split (issue #342, audit finding #13): +## - animation_presets.gd → preset_fade / slide / shake / pulse + helpers +## - animation_values.gd → animation_list / get / validate + shared +## value coercion / serialization +## Both submodules hold a WeakRef back to this handler. The handler's +## preset_* / list / get / validate methods are thin proxies so existing +## dispatcher registrations and test fixtures don't change. + +const AnimationPresets := preload("res://addons/godot_ai/handlers/animation_presets.gd") +const AnimationValues := preload("res://addons/godot_ai/handlers/animation_values.gd") + +var _undo_redo: EditorUndoRedoManager +var _presets +var _values + +const _LOOP_MODES := { + "none": Animation.LOOP_NONE, + "linear": Animation.LOOP_LINEAR, + "pingpong": Animation.LOOP_PINGPONG, +} + +const _INTERP_MODES := { + "nearest": Animation.INTERPOLATION_NEAREST, + "linear": Animation.INTERPOLATION_LINEAR, + "cubic": Animation.INTERPOLATION_CUBIC, +} + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + _presets = AnimationPresets.new(self) + _values = AnimationValues.new(self) + + +# ============================================================================ +# animation_player_create +# ============================================================================ + +func create_player(params: Dictionary) -> Dictionary: + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "AnimationPlayer") + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var player := AnimationPlayer.new() + if not node_name.is_empty(): + player.name = node_name + + # Attach the default library before adding to tree — it persists on redo. + var library := AnimationLibrary.new() + player.add_animation_library("", library) + + _undo_redo.create_action("MCP: Create AnimationPlayer %s" % player.name) + _undo_redo.add_do_method(parent, "add_child", player, true) + _undo_redo.add_do_method(player, "set_owner", scene_root) + _undo_redo.add_do_reference(player) + _undo_redo.add_do_reference(library) + _undo_redo.add_undo_method(parent, "remove_child", player) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(player, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": String(player.name), + "undoable": true, + } + } + + +# ============================================================================ +# animation_create +# ============================================================================ + +func create_animation(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("name", "") + var length: float = float(params.get("length", 1.0)) + var loop_mode_str: String = params.get("loop_mode", "none") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + if length <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "length must be > 0 (got %s)" % length) + + if not _LOOP_MODES.has(loop_mode_str): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid loop_mode '%s'. Valid: %s" % [loop_mode_str, ", ".join(_LOOP_MODES.keys())]) + + var resolved := _resolve_player(player_path, true) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_player: bool = resolved.get("player_created", false) + var player_parent: Node = resolved.get("player_parent", null) + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var overwrite: bool = params.get("overwrite", false) + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + var anim := Animation.new() + anim.length = length + anim.loop_mode = _LOOP_MODES[loop_mode_str] + + _commit_animation_add("MCP: Create animation %s" % anim_name, + player, library, created_library, anim_name, anim, old_anim, + created_player, player_parent) + + return { + "data": { + "player_path": player_path, + "name": anim_name, + "length": length, + "loop_mode": loop_mode_str, + "library_created": created_library or created_player, + "animation_player_created": created_player, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# animation_delete +# ============================================================================ + +func delete_animation(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: animation_name") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + # Use _resolve_animation so we can delete from ANY library, not just the + # default. Mirrors the read-side symmetry with animation_get / animation_play + # which already search all libraries via _resolve_animation. + var anim_resolved := _resolve_animation(player, anim_name) + if anim_resolved.has("error"): + return anim_resolved + var old_anim: Animation = anim_resolved.animation + var library: AnimationLibrary = anim_resolved.library + # Clip key within the owning library — strips the "libname/" prefix if the + # caller passed a qualified name. + var clip_key: String = anim_name + var slash := anim_name.find("/") + if slash >= 0: + clip_key = anim_name.substr(slash + 1) + + _undo_redo.create_action("MCP: Delete animation %s" % anim_name) + _undo_redo.add_do_method(library, "remove_animation", clip_key) + _undo_redo.add_undo_method(library, "add_animation", clip_key, old_anim) + _undo_redo.add_do_reference(old_anim) # prevent GC so undo→redo works + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "library_key": anim_resolved.get("library_key", ""), + "undoable": true, + } + } + + +# ============================================================================ +# animation_add_property_track +# ============================================================================ + +func add_property_track(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + var track_path: String = params.get("track_path", "") + var keyframes = params.get("keyframes", []) + var interp_str: String = params.get("interpolation", "linear") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: animation_name") + if track_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "Missing required param: track_path (format: 'NodeName:property', e.g. 'Panel:modulate')") + if not track_path.contains(":"): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "track_path must include ':property' suffix (e.g. 'Panel:modulate', '.:position')") + if not _INTERP_MODES.has(interp_str): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid interpolation '%s'. Valid: %s" % [interp_str, ", ".join(_INTERP_MODES.keys())]) + if typeof(keyframes) != TYPE_ARRAY or keyframes.is_empty(): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "keyframes must be a non-empty array") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + var anim_resolved := _resolve_animation(player, anim_name) + if anim_resolved.has("error"): + return anim_resolved + var anim: Animation = anim_resolved.animation + + # Validate + pre-coerce keyframes before mutating. Coercion errors + # surface as INVALID_PARAMS rather than silently inserting garbage keys. + # Resolve the target property's type ONCE — dense clips used to re-walk + # get_property_list() per keyframe. + var ctx := AnimationValues.resolve_track_prop_context(track_path, player) + if ctx.has("error"): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, ctx.error) + var coerced_keyframes: Array = [] + for kf in keyframes: + if typeof(kf) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Each keyframe must be a dictionary") + if not "time" in kf: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Each keyframe must have a 'time' field") + if not "value" in kf: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Each keyframe must have a 'value' field") + var coerce_result := AnimationValues.coerce_with_context(kf.get("value"), ctx) + if coerce_result.has("error"): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, coerce_result.error) + coerced_keyframes.append({ + "time": kf.get("time"), + "value": coerce_result.ok, + "transition": kf.get("transition", "linear"), + }) + + _create_scene_pinned_action("MCP: Add property track %s to %s" % [track_path, anim_name]) + _undo_redo.add_do_method(self, "_do_add_property_track", anim, track_path, interp_str, coerced_keyframes) + # Undo locates the track by (path, type) at undo time rather than caching + # an index captured at do time. Cached indices go stale if any other track + # mutation lands between do and undo (Godot editor, another MCP call, etc.) + _undo_redo.add_undo_method(self, "_undo_remove_track_by_path", anim, track_path, Animation.TYPE_VALUE) + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "track_path": track_path, + "interpolation": interp_str, + "keyframe_count": keyframes.size(), + "undoable": true, + } + } + + +## Insert a pre-coerced track into the animation. Callers must coerce +## values against the target property before calling this (see +## AnimationValues.coerce_value_for_track) — this method runs inside the +## undo do-method path where error propagation isn't possible. +func _do_add_property_track( + anim: Animation, + track_path: String, + interp_str: String, + keyframes: Array, +) -> void: + var idx := anim.add_track(Animation.TYPE_VALUE) + anim.track_set_path(idx, NodePath(track_path)) + anim.track_set_interpolation_type(idx, _INTERP_MODES.get(interp_str, Animation.INTERPOLATION_LINEAR)) + for kf in keyframes: + var t: float = float(kf.get("time", 0.0)) + var trans: float = AnimationValues.parse_transition(kf.get("transition", "linear")) + anim.track_insert_key(idx, t, kf.get("value"), trans) + + +# ============================================================================ +# animation_add_method_track +# ============================================================================ + +func add_method_track(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + var target_path: String = params.get("target_node_path", "") + var keyframes = params.get("keyframes", []) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: animation_name") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_node_path") + if target_path.contains(":"): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "target_node_path is a bare NodePath without ':property' (got '%s'). " % target_path + + "Method name goes in each keyframe's 'method' field, not the path.") + if typeof(keyframes) != TYPE_ARRAY or keyframes.is_empty(): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "keyframes must be a non-empty array") + + for kf in keyframes: + if typeof(kf) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Each keyframe must be a dictionary") + if not "time" in kf: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Each keyframe must have a 'time' field") + if not "method" in kf: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Each keyframe must have a 'method' field") + var method_field = kf.get("method") + if typeof(method_field) != TYPE_STRING or (method_field as String).is_empty(): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "'method' must be a non-empty string") + if kf.has("args") and typeof(kf.get("args")) != TYPE_ARRAY: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "'args' must be an array if provided (got %s)" % type_string(typeof(kf.get("args")))) + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + var anim_resolved := _resolve_animation(player, anim_name) + if anim_resolved.has("error"): + return anim_resolved + var anim: Animation = anim_resolved.animation + + _create_scene_pinned_action("MCP: Add method track %s to %s" % [target_path, anim_name]) + _undo_redo.add_do_method(self, "_do_add_method_track", anim, target_path, keyframes) + # Undo locates the track by (path, type) at undo time — see add_property_track. + _undo_redo.add_undo_method(self, "_undo_remove_track_by_path", anim, target_path, Animation.TYPE_METHOD) + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "target_node_path": target_path, + "keyframe_count": keyframes.size(), + "undoable": true, + } + } + + +## Remove a track identified by (path, type) at undo time. Robust to +## history interleaving: if another track was added since the do, the +## find_track call still resolves to the correct index. Returns silently +## if the track is no longer present (e.g. a prior undo already removed it). +func _undo_remove_track_by_path(anim: Animation, track_path: String, track_type: int) -> void: + var idx := anim.find_track(NodePath(track_path), track_type) + if idx >= 0: + anim.remove_track(idx) + + +func _do_add_method_track(anim: Animation, target_path: String, keyframes: Array) -> void: + var idx := anim.add_track(Animation.TYPE_METHOD) + anim.track_set_path(idx, NodePath(target_path)) + for kf in keyframes: + var t: float = float(kf.get("time", 0.0)) + var method_name: String = str(kf.get("method", "")) + var args: Array = kf.get("args", []) + anim.track_insert_key(idx, t, {"method": method_name, "args": args}) + + +# ============================================================================ +# animation_set_autoplay +# ============================================================================ + +func set_autoplay(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + # Allow empty string to clear autoplay; otherwise validate the name exists. + if not anim_name.is_empty() and not player.has_animation(anim_name): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Animation '%s' not found on player at %s" % [anim_name, player_path]) + + var old_autoplay: String = player.autoplay + + _undo_redo.create_action("MCP: Set autoplay %s on %s" % [anim_name, player_path]) + _undo_redo.add_do_property(player, "autoplay", anim_name) + _undo_redo.add_undo_property(player, "autoplay", old_autoplay) + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "previous_autoplay": old_autoplay, + "cleared": anim_name.is_empty(), + "undoable": true, + } + } + + +# ============================================================================ +# animation_play (dev ergonomics — not saved with scene) +# ============================================================================ + +func play(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + if not anim_name.is_empty() and not player.has_animation(anim_name): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Animation '%s' not found on player at %s" % [anim_name, player_path]) + + player.play(anim_name) + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "undoable": false, + "reason": "Runtime playback state — not saved with scene", + } + } + + +# ============================================================================ +# animation_stop (dev ergonomics — not saved with scene) +# ============================================================================ + +func stop(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + player.stop() + + return { + "data": { + "player_path": player_path, + "undoable": false, + "reason": "Runtime playback state — not saved with scene", + } + } + + +# ============================================================================ +# animation_create_simple (composer) +# ============================================================================ + +func create_simple(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("name", "") + var tweens = params.get("tweens", []) + var loop_mode_str: String = params.get("loop_mode", "none") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + if typeof(tweens) != TYPE_ARRAY or tweens.is_empty(): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "tweens must be a non-empty array") + if not _LOOP_MODES.has(loop_mode_str): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid loop_mode '%s'. Valid: %s" % [loop_mode_str, ", ".join(_LOOP_MODES.keys())]) + + # Validate all tween specs before touching the scene. + var seen_paths := {} + for spec in tweens: + if typeof(spec) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Each tween spec must be a dictionary") + for field in ["target", "property", "from", "to", "duration"]: + if not field in spec: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "Each tween spec must have '%s'" % field) + if float(spec.get("duration", 0.0)) <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "tween 'duration' must be > 0") + var dup_key: String = str(spec.target) + ":" + str(spec.property) + if seen_paths.has(dup_key): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Duplicate tween target '%s' — merge keyframes into a single track " % dup_key + + "via animation_add_property_track instead of two separate tweens.") + seen_paths[dup_key] = true + + # Compute/validate length before resolving the player — a fresh auto-created + # AnimationPlayer is a detached Node that leaks if we return after creation. + var has_length: bool = params.has("length") and params.get("length") != null + var computed_length: float = 0.0 + if has_length: + computed_length = float(params.get("length")) + if computed_length <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "'length' must be > 0 when provided (got %s)" % str(params.get("length"))) + else: + for spec in tweens: + var end_time: float = float(spec.get("delay", 0.0)) + float(spec.get("duration", 0.0)) + if end_time > computed_length: + computed_length = end_time + if computed_length <= 0.0: + computed_length = 1.0 + + var resolved := _resolve_player(player_path, true) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_player: bool = resolved.get("player_created", false) + var player_parent: Node = resolved.get("player_parent", null) + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var overwrite: bool = params.get("overwrite", false) + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + if created_player: + player.queue_free() + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + # Pre-coerce all tween values before touching the anim — coercion errors + # surface as INVALID_PARAMS, not silent garbage keyframes. + # When the player was auto-created, it isn't in the tree yet — pass its + # future parent so the coercer can still resolve target property types. + var coerce_root: Node = player_parent if created_player else null + var per_track_keyframes: Array = [] + for spec in tweens: + var target: String = str(spec.get("target", "")) + var property: String = str(spec.get("property", "")) + var track_path: String = target + ":" + property + var duration: float = float(spec.get("duration", 1.0)) + var delay: float = float(spec.get("delay", 0.0)) + var trans_str = spec.get("transition", "linear") + var from_result := AnimationValues.coerce_value_for_track(spec.get("from"), track_path, player, coerce_root) + if from_result.has("error"): + if created_player: + player.queue_free() + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "tween '%s': %s" % [track_path, from_result.error]) + var to_result := AnimationValues.coerce_value_for_track(spec.get("to"), track_path, player, coerce_root) + if to_result.has("error"): + if created_player: + player.queue_free() + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "tween '%s': %s" % [track_path, to_result.error]) + per_track_keyframes.append({ + "track_path": track_path, + "keyframes": [ + {"time": delay, "value": from_result.ok, "transition": trans_str}, + {"time": delay + duration, "value": to_result.ok, "transition": trans_str}, + ], + }) + + # Build the animation fully in memory before touching the undo stack. + var anim := Animation.new() + anim.length = computed_length + anim.loop_mode = _LOOP_MODES[loop_mode_str] + + for entry in per_track_keyframes: + _do_add_property_track(anim, entry.track_path, "linear", entry.keyframes) + + # One atomic undo action — bundles player creation (if any), library + # creation (if any), and the animation add. A single Ctrl-Z rolls back all. + _commit_animation_add("MCP: Create animation %s (%d tracks)" % [anim_name, anim.get_track_count()], + player, library, created_library, anim_name, anim, old_anim, + created_player, player_parent) + + return { + "data": { + "player_path": player_path, + "name": anim_name, + "length": computed_length, + "loop_mode": loop_mode_str, + "track_count": anim.get_track_count(), + "library_created": created_library or created_player, + "animation_player_created": created_player, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# Proxies — preset_* and read methods live in the submodules. Kept here so +# the dispatcher registrations and `_handler.method(...)` test fixtures stay +# unchanged across the split. +# ============================================================================ + +func preset_fade(params: Dictionary) -> Dictionary: + return _presets.preset_fade(params) + + +func preset_slide(params: Dictionary) -> Dictionary: + return _presets.preset_slide(params) + + +func preset_shake(params: Dictionary) -> Dictionary: + return _presets.preset_shake(params) + + +func preset_pulse(params: Dictionary) -> Dictionary: + return _presets.preset_pulse(params) + + +func list_animations(params: Dictionary) -> Dictionary: + return _values.list_animations(params) + + +func get_animation(params: Dictionary) -> Dictionary: + return _values.get_animation(params) + + +func validate_animation(params: Dictionary) -> Dictionary: + return _values.validate_animation(params) + + +# ============================================================================ +# Helpers — undo +# ============================================================================ + +## Shared undo setup for create_animation and create_simple. Handles fresh- +## create, overwrite, library auto-create, and player auto-create in a single +## atomic action. When `created_player` is true, the player already has the +## library attached (eagerly, from `_instantiate_player`) and the library +## doesn't need its own undo bookkeeping — it rides along with the add_child. +func _commit_animation_add( + action_label: String, + player: AnimationPlayer, + library: AnimationLibrary, + created_library: bool, + anim_name: String, + anim: Animation, + old_anim: Animation, ## null when not overwriting + created_player: bool = false, + player_parent: Node = null, +) -> void: + _undo_redo.create_action(action_label) + if created_player: + var scene_root := EditorInterface.get_edited_scene_root() + _undo_redo.add_do_method(player_parent, "add_child", player, true) + _undo_redo.add_do_method(player, "set_owner", scene_root) + _undo_redo.add_do_reference(player) + _undo_redo.add_do_reference(library) + _undo_redo.add_undo_method(player_parent, "remove_child", player) + elif created_library: + _undo_redo.add_do_method(player, "add_animation_library", "", library) + _undo_redo.add_undo_method(player, "remove_animation_library", "") + _undo_redo.add_do_reference(library) + if old_anim != null: + _undo_redo.add_do_method(library, "remove_animation", anim_name) + _undo_redo.add_do_method(library, "add_animation", anim_name, anim) + if old_anim != null: + _undo_redo.add_undo_method(library, "remove_animation", anim_name) + _undo_redo.add_undo_method(library, "add_animation", anim_name, old_anim) + _undo_redo.add_do_reference(old_anim) + else: + _undo_redo.add_undo_method(library, "remove_animation", anim_name) + _undo_redo.add_do_reference(anim) + _undo_redo.commit_action() + + +## Open a `create_action` pinned to the edited scene's history. +## +## Without an explicit context, `add_do_method(self, ...)` against a +## RefCounted handler lands in GLOBAL_HISTORY while sibling actions whose +## first do-target is a Resource (e.g. AnimationLibrary) land in the scene's +## history. Mismatched histories make the test-side `editor_undo` helper +## (walks scene first) undo the wrong action, and break batch_handler's +## rollback. Mirrors `camera_handler.gd`'s identical pinning rationale. +func _create_scene_pinned_action(action_label: String) -> void: + _undo_redo.create_action( + action_label, UndoRedo.MERGE_DISABLE, EditorInterface.get_edited_scene_root(), + ) + + +# ============================================================================ +# Helpers — resolution +# ============================================================================ + +## Resolve an AnimationPlayer and its default library for write operations. +## Returns {player, library, player_created, player_parent} on success, or an +## error dict. library is null if the player exists but has no default library +## yet — callers bundle an `add_animation_library` step into their undo action. +## +## When `create_if_missing` is true and `player_path` resolves to nothing, a +## fresh AnimationPlayer is instantiated (with an empty default library attached +## eagerly) but is NOT added to the scene tree — callers must bundle the +## add_child step into their undo action via `_commit_animation_add`. +## If the resolved node exists but isn't an AnimationPlayer, that's still an +## error — we don't clobber an existing node of a different type. +func _resolve_player(player_path: String, create_if_missing: bool = false) -> Dictionary: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + var node := McpScenePath.resolve(player_path, scene_root) + if node == null: + if not create_if_missing: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_node_error(player_path, scene_root)) + return _instantiate_player(player_path, scene_root) + if not node is AnimationPlayer: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Node at %s is not an AnimationPlayer (got %s)" % [player_path, node.get_class()]) + var player := node as AnimationPlayer + var lib: AnimationLibrary = null + if player.has_animation_library(""): + lib = player.get_animation_library("") + return {"player": player, "library": lib, "player_created": false, "player_parent": null} + + +## Build a new AnimationPlayer (with empty default library) for insertion under +## the parent implied by `player_path`. Returns an error dict if the parent +## can't be resolved or the path has no usable leaf name. +func _instantiate_player(player_path: String, scene_root: Node) -> Dictionary: + var slash := player_path.rfind("/") + var parent_path: String + var player_name: String + if slash < 0: + parent_path = "" + player_name = player_path + else: + parent_path = player_path.substr(0, slash) + player_name = player_path.substr(slash + 1) + if player_name.is_empty(): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Cannot auto-create AnimationPlayer: player_path '%s' has no leaf name" % player_path) + var parent: Node + if parent_path.is_empty(): + parent = scene_root + else: + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, + "Cannot auto-create AnimationPlayer at %s: %s" % [ + player_path, McpScenePath.format_parent_error(parent_path, scene_root)]) + var new_player := AnimationPlayer.new() + new_player.name = player_name + var lib := AnimationLibrary.new() + new_player.add_animation_library("", lib) + return { + "player": new_player, + "library": lib, + "player_created": true, + "player_parent": parent, + } + + +## Resolve for read operations (no library requirement). +func _resolve_player_read(player_path: String) -> Dictionary: + var resolved := McpNodeValidator.resolve_or_error(player_path, "player_path") + if resolved.has("error"): + return resolved + var node: Node = resolved.node + if not node is AnimationPlayer: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Node at %s is not an AnimationPlayer (got %s)" % [player_path, node.get_class()]) + return {"player": node as AnimationPlayer} + + +## Resolve an animation by name, searching all libraries. +## Accepts bare clip names ("idle") and library-qualified names ("moves/idle") +## as returned by `list_animations` for non-default libraries. +func _resolve_animation(player: AnimationPlayer, anim_name: String) -> Dictionary: + if not player.has_animation(anim_name): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Animation '%s' not found on player. Available: %s" % [ + anim_name, + ", ".join(Array(player.get_animation_list())) + ]) + # If the caller passed "library/clip", look up in that specific library. + var slash := anim_name.find("/") + if slash >= 0: + var lib_key := anim_name.substr(0, slash) + var clip_key := anim_name.substr(slash + 1) + if player.has_animation_library(lib_key): + var lib: AnimationLibrary = player.get_animation_library(lib_key) + if lib.has_animation(clip_key): + return {"animation": lib.get_animation(clip_key), "library": lib, "library_key": lib_key} + # Otherwise scan libraries for a bare clip name. + for lib_name in player.get_animation_library_list(): + var lib2: AnimationLibrary = player.get_animation_library(lib_name) + if lib2.has_animation(anim_name): + return {"animation": lib2.get_animation(anim_name), "library": lib2, "library_key": lib_name} + # Fallback — shouldn't happen if has_animation returned true. + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Animation found by player but not in any library") diff --git a/addons/godot_ai/handlers/animation_handler.gd.uid b/addons/godot_ai/handlers/animation_handler.gd.uid new file mode 100644 index 0000000..934f665 --- /dev/null +++ b/addons/godot_ai/handlers/animation_handler.gd.uid @@ -0,0 +1 @@ +uid://c0jrius46xsd4 diff --git a/addons/godot_ai/handlers/animation_presets.gd b/addons/godot_ai/handlers/animation_presets.gd new file mode 100644 index 0000000..40f1ddc --- /dev/null +++ b/addons/godot_ai/handlers/animation_presets.gd @@ -0,0 +1,536 @@ +@tool +extends RefCounted + +## Curated motion presets for the AnimationPlayer surface. +## +## Each preset_* method: +## 1. Validates params + resolves the player (auto-creating its default lib). +## 2. Resolves the target node + classifies it as control / 2d / 3d. +## 3. Builds a single-track Animation with shape-appropriate keyframes. +## 4. Commits the add through the handler's shared `_commit_animation_add` +## so a single Ctrl-Z rolls back any auto-created library + the animation. +## +## Holds a WeakRef back to the AnimationHandler instance so the handler can +## continue to own this module strongly via `_presets` without forming a +## RefCounted cycle. Resolution / undo helpers live on the handler — keeping +## the `_undo_redo` member single-source there avoids drift. + + +const AnimationValues := preload("res://addons/godot_ai/handlers/animation_values.gd") +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const ScenePath := preload("res://addons/godot_ai/utils/scene_path.gd") + + +var _handler_weak: WeakRef + + +func _init(handler) -> void: + _handler_weak = weakref(handler) + + +func _h(): + return _handler_weak.get_ref() + + +# ============================================================================ +# animation_preset_fade +# ============================================================================ + +func preset_fade(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var target_path: String = params.get("target_path", "") + var mode: String = params.get("mode", "in") + var duration: float = float(params.get("duration", 0.5)) + var anim_name: String = params.get("animation_name", "") + var overwrite: bool = params.get("overwrite", false) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_path") + if mode != "in" and mode != "out": + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid mode '%s'. Valid: 'in', 'out'" % mode) + if duration <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'duration' must be > 0") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var target_resolved := _resolve_preset_target(player, target_path) + if target_resolved.has("error"): + return target_resolved + var target: Node = target_resolved.node + var track_target: String = target_resolved.track_path_root + + # Fade requires a `modulate` property (CanvasItem/Control/Node2D/Sprite3D/etc). + var has_modulate := false + for p in target.get_property_list(): + if p.name == "modulate": + has_modulate = true + break + if not has_modulate: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Target '%s' (class %s) has no 'modulate' property — fade requires a CanvasItem, Control, Node2D, or Sprite3D" + % [target_path, target.get_class()]) + + if anim_name.is_empty(): + anim_name = "fade_%s" % mode + + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + var start_a: float = 0.0 if mode == "in" else 1.0 + var end_a: float = 1.0 if mode == "in" else 0.0 + + var anim := Animation.new() + anim.length = duration + anim.loop_mode = Animation.LOOP_NONE + + var track_path := "%s:modulate:a" % track_target + handler._do_add_property_track(anim, track_path, "linear", [ + {"time": 0.0, "value": start_a, "transition": "linear"}, + {"time": duration, "value": end_a, "transition": "linear"}, + ]) + + handler._commit_animation_add( + "MCP: Create animation %s" % anim_name, + player, library, created_library, anim_name, anim, old_anim, + ) + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "mode": mode, + "length": duration, + "track_count": anim.get_track_count(), + "library_created": created_library, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# animation_preset_slide +# ============================================================================ + +func preset_slide(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var target_path: String = params.get("target_path", "") + var direction: String = params.get("direction", "left") + var mode: String = params.get("mode", "in") + var duration: float = float(params.get("duration", 0.4)) + var anim_name: String = params.get("animation_name", "") + var overwrite: bool = params.get("overwrite", false) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_path") + if not ["left", "right", "up", "down"].has(direction): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid direction '%s'. Valid: 'left', 'right', 'up', 'down'" % direction) + if mode != "in" and mode != "out": + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid mode '%s'. Valid: 'in', 'out'" % mode) + if duration <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'duration' must be > 0") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var target_resolved := _resolve_preset_target(player, target_path) + if target_resolved.has("error"): + return target_resolved + var target = target_resolved.node + var kind: String = target_resolved.kind + var track_target: String = target_resolved.track_path_root + + # Default distance picks 3D units vs screen pixels based on target kind. + var default_distance: float = 1.0 if kind == "3d" else 100.0 + var distance: float = float(params.get("distance", default_distance)) + if distance == 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'distance' must be non-zero") + + var offset: Variant = _direction_offset(kind, direction, distance) + var current_pos: Variant = target.position + var start_pos: Variant + var end_pos: Variant + if mode == "in": + start_pos = current_pos + offset + end_pos = current_pos + else: + start_pos = current_pos + end_pos = current_pos + offset + + if anim_name.is_empty(): + anim_name = "slide_%s_%s" % [mode, direction] + + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + var anim := Animation.new() + anim.length = duration + anim.loop_mode = Animation.LOOP_NONE + + var track_path := "%s:position" % track_target + handler._do_add_property_track(anim, track_path, "linear", [ + {"time": 0.0, "value": start_pos, "transition": "linear"}, + {"time": duration, "value": end_pos, "transition": "linear"}, + ]) + + handler._commit_animation_add( + "MCP: Create animation %s" % anim_name, + player, library, created_library, anim_name, anim, old_anim, + ) + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "direction": direction, + "mode": mode, + "distance": distance, + "length": duration, + "track_count": anim.get_track_count(), + "library_created": created_library, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# animation_preset_shake +# ============================================================================ + +func preset_shake(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var target_path: String = params.get("target_path", "") + var duration: float = float(params.get("duration", 0.3)) + var frequency: float = float(params.get("frequency", 30.0)) + var rng_seed: int = int(params.get("seed", 0)) + var anim_name: String = params.get("animation_name", "") + var overwrite: bool = params.get("overwrite", false) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_path") + if duration <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'duration' must be > 0") + if frequency <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'frequency' must be > 0") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var target_resolved := _resolve_preset_target(player, target_path) + if target_resolved.has("error"): + return target_resolved + var target = target_resolved.node + var kind: String = target_resolved.kind + var track_target: String = target_resolved.track_path_root + + var default_intensity: float = 0.1 if kind == "3d" else 10.0 + var intensity: float = float(params.get("intensity", default_intensity)) + if intensity <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'intensity' must be > 0") + + if anim_name.is_empty(): + anim_name = "shake" + + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + var rng := RandomNumberGenerator.new() + if rng_seed != 0: + rng.seed = rng_seed + else: + rng.randomize() + + # Samples between t=0 and t=duration (exclusive); bookended by at-rest keys. + var sample_count: int = int(ceil(frequency * duration)) + if sample_count < 2: + sample_count = 2 + + var current_pos: Variant = target.position + var kfs: Array = [] + kfs.append({"time": 0.0, "value": current_pos, "transition": "linear"}) + for i in range(1, sample_count): + var t: float = (float(i) / float(sample_count)) * duration + var jx: float = rng.randf_range(-intensity, intensity) + var jy: float = rng.randf_range(-intensity, intensity) + var jittered: Variant + if kind == "3d": + var jz: float = rng.randf_range(-intensity, intensity) + jittered = current_pos + Vector3(jx, jy, jz) + else: + jittered = current_pos + Vector2(jx, jy) + kfs.append({"time": t, "value": jittered, "transition": "linear"}) + kfs.append({"time": duration, "value": current_pos, "transition": "linear"}) + + var anim := Animation.new() + anim.length = duration + anim.loop_mode = Animation.LOOP_NONE + + var track_path := "%s:position" % track_target + handler._do_add_property_track(anim, track_path, "linear", kfs) + + handler._commit_animation_add( + "MCP: Create animation %s" % anim_name, + player, library, created_library, anim_name, anim, old_anim, + ) + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "length": duration, + "frequency": frequency, + "intensity": intensity, + "keyframe_count": kfs.size(), + "track_count": anim.get_track_count(), + "library_created": created_library, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# animation_preset_pulse +# ============================================================================ + +func preset_pulse(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var target_path: String = params.get("target_path", "") + var from_scale: float = float(params.get("from_scale", 1.0)) + var to_scale: float = float(params.get("to_scale", 1.1)) + var duration: float = float(params.get("duration", 0.4)) + var anim_name: String = params.get("animation_name", "") + var overwrite: bool = params.get("overwrite", false) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_path") + if duration <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'duration' must be > 0") + if from_scale <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'from_scale' must be > 0") + if to_scale <= 0.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "'to_scale' must be > 0") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + var library: AnimationLibrary = resolved.library + var created_library := false + if library == null: + library = AnimationLibrary.new() + created_library = true + + var target_resolved := _resolve_preset_target(player, target_path) + if target_resolved.has("error"): + return target_resolved + var kind: String = target_resolved.kind + var track_target: String = target_resolved.track_path_root + + if anim_name.is_empty(): + anim_name = "pulse" + + var old_anim: Animation = null + if library.has_animation(anim_name): + if not overwrite: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Animation '%s' already exists. Pass overwrite=true or delete it first." % anim_name) + old_anim = library.get_animation(anim_name) + + var from_vec: Variant + var to_vec: Variant + if kind == "3d": + from_vec = Vector3(from_scale, from_scale, from_scale) + to_vec = Vector3(to_scale, to_scale, to_scale) + else: + from_vec = Vector2(from_scale, from_scale) + to_vec = Vector2(to_scale, to_scale) + + var anim := Animation.new() + anim.length = duration + anim.loop_mode = Animation.LOOP_NONE + + var track_path := "%s:scale" % track_target + handler._do_add_property_track(anim, track_path, "linear", [ + {"time": 0.0, "value": from_vec, "transition": "linear"}, + {"time": duration * 0.5, "value": to_vec, "transition": "linear"}, + {"time": duration, "value": from_vec, "transition": "linear"}, + ]) + + handler._commit_animation_add( + "MCP: Create animation %s" % anim_name, + player, library, created_library, anim_name, anim, old_anim, + ) + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "from_scale": from_scale, + "to_scale": to_scale, + "length": duration, + "track_count": anim.get_track_count(), + "library_created": created_library, + "overwritten": old_anim != null, + "undoable": true, + } + } + + +# ============================================================================ +# Helpers — preset resolution +# ============================================================================ + +## Resolve a preset target node and classify its transform kind. +## +## Accepts two `target_path` shapes: +## * Scene-absolute (starts with "/") — resolved through `ScenePath.resolve`, +## matching the convention used by every other scene-mutating tool. Targets +## outside the player's `root_node` subtree are converted to `..`-prefixed +## paths via `root_node.get_path_to(target)`, mirroring what the relative +## form accepts and how Godot stores track paths. +## * Relative — used as-is against the player's `root_node`, matching how +## animation tracks themselves are stored. +## +## Returns `{node, kind, track_path_root}` where `track_path_root` is the path +## (relative to `root_node`) that callers should embed in the track path. For +## scene-absolute inputs this is the converted relative path; for relative +## inputs it equals the input. `kind` ∈ {"control", "2d", "3d"}. +## +## Mirrors the same root-node fallback that +## `AnimationValues.resolve_track_prop_context` uses so tool inputs match how +## the track path will resolve at playback. +func _resolve_preset_target(player: AnimationPlayer, target_path: String) -> Dictionary: + var root_node := AnimationValues.player_root_node(player) + if root_node == null: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "AnimationPlayer at %s has no resolvable root_node (is the scene open?)" % str(player.get_path())) + + var target: Node = null + var track_path_root: String = target_path + if target_path.begins_with("/"): + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Cannot resolve scene-absolute target_path '%s': no scene open" % target_path) + target = ScenePath.resolve(target_path, scene_root) + if target == null: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + ScenePath.format_node_error(target_path, scene_root)) + # Convert to a root_node-relative path. For targets outside the + # subtree this yields a `..`-prefixed path, matching what the + # relative form already accepts (root_node.get_node_or_null + # resolves `..` segments) and what Godot's animation engine + # stores natively. + track_path_root = str(root_node.get_path_to(target)) + else: + target = root_node.get_node_or_null(target_path) + if target == null: + # root_node.get_path() leaks the editor's SubViewport-wrapped + # path; use the clean scene-relative form so the hint is + # actionable. + var scene_root := EditorInterface.get_edited_scene_root() + var root_hint := ScenePath.from_node(root_node, scene_root) if scene_root != null else str(root_node.name) + var abs_example := "/%s/path/to/target" % scene_root.name if scene_root != null else "/SceneRoot/path/to/target" + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + ("Target node not found at '%s' (resolved relative to AnimationPlayer's root_node '%s'). " + + "Pass a path relative to root_node (e.g. \"path/to/target\") or a scene-absolute path (e.g. \"%s\").") + % [target_path, root_hint, abs_example]) + + var kind: String + if target is Control: + kind = "control" + elif target is Node2D: + kind = "2d" + elif target is Node3D: + kind = "3d" + else: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Target '%s' must be a Control, Node2D, or Node3D (got %s)" % [target_path, target.get_class()]) + return {"node": target, "kind": kind, "track_path_root": track_path_root} + + +## Build a directional offset for slide presets. +## Axis conventions: +## Control + Node2D (screen-space, y-down): left/right = ∓x, up = -y, down = +y +## Node3D (world-up): left/right = ∓x, up = +y, down = -y +static func _direction_offset(kind: String, direction: String, distance: float) -> Variant: + if kind == "3d": + match direction: + "left": return Vector3(-distance, 0.0, 0.0) + "right": return Vector3(distance, 0.0, 0.0) + "up": return Vector3(0.0, distance, 0.0) + "down": return Vector3(0.0, -distance, 0.0) + else: + match direction: + "left": return Vector2(-distance, 0.0) + "right": return Vector2(distance, 0.0) + "up": return Vector2(0.0, -distance) + "down": return Vector2(0.0, distance) + return null diff --git a/addons/godot_ai/handlers/animation_presets.gd.uid b/addons/godot_ai/handlers/animation_presets.gd.uid new file mode 100644 index 0000000..f463501 --- /dev/null +++ b/addons/godot_ai/handlers/animation_presets.gd.uid @@ -0,0 +1 @@ +uid://c4s3h78bwvr6w diff --git a/addons/godot_ai/handlers/animation_values.gd b/addons/godot_ai/handlers/animation_values.gd new file mode 100644 index 0000000..b1553df --- /dev/null +++ b/addons/godot_ai/handlers/animation_values.gd @@ -0,0 +1,442 @@ +@tool +extends RefCounted + +const VariantSerializer := preload("res://addons/godot_ai/utils/variant_serializer.gd") + +## Read-only animation introspection + shared value-coercion / serialization. +## +## Holds: +## - Static helpers used by both the write handler (track building, simple +## composer) and the preset module (target/property resolution). +## - Instance methods that back the read MCP ops: animation_list, +## animation_get, animation_validate. +## +## The instance methods need the handler to resolve players / animations. +## To keep that without introducing a RefCounted cycle (the handler holds a +## strong ref to this module via `_values`), the back-pointer is a WeakRef. +## When the handler is freed during plugin teardown, _h() returns null and +## the (no-longer-routable) calls short-circuit to a generic editor-not-ready +## error — matches the dispatcher already being torn down at that point. + + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const PropertyErrors := preload("res://addons/godot_ai/handlers/_property_errors.gd") + + +const _NAMED_TRANSITIONS := { + "linear": 1.0, + "ease_in": 2.0, + "ease_out": 0.5, + "ease_in_out": -2.0, +} + +## Component letters accepted on each aggregate base type, paired with the +## scalar Variant type the component resolves to. A subpath like `position:y` +## on a Vector3 maps to TYPE_FLOAT; on a Vector3i it maps to TYPE_INT. +const _SUBPATH_COMPONENTS := { + TYPE_VECTOR2: ["xy", TYPE_FLOAT], + TYPE_VECTOR3: ["xyz", TYPE_FLOAT], + TYPE_VECTOR4: ["xyzw", TYPE_FLOAT], + TYPE_QUATERNION: ["xyzw", TYPE_FLOAT], + TYPE_COLOR: ["rgba", TYPE_FLOAT], + TYPE_VECTOR2I: ["xy", TYPE_INT], + TYPE_VECTOR3I: ["xyz", TYPE_INT], + TYPE_VECTOR4I: ["xyzw", TYPE_INT], +} + + +var _handler_weak: WeakRef + + +func _init(handler) -> void: + _handler_weak = weakref(handler) + + +func _h(): + return _handler_weak.get_ref() + + +# ============================================================================ +# animation_list (read) +# ============================================================================ + +func list_animations(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player_read(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + var animations: Array[Dictionary] = [] + for lib_name in player.get_animation_library_list(): + var lib: AnimationLibrary = player.get_animation_library(lib_name) + for anim_name in lib.get_animation_list(): + var anim: Animation = lib.get_animation(anim_name) + var display_name: String = anim_name if lib_name == "" else "%s/%s" % [lib_name, anim_name] + animations.append({ + "name": display_name, + "length": anim.length, + "loop_mode": loop_mode_to_string(anim.loop_mode), + "track_count": anim.get_track_count(), + }) + + return { + "data": { + "player_path": player_path, + "animations": animations, + "count": animations.size(), + } + } + + +# ============================================================================ +# animation_get (read) +# ============================================================================ + +func get_animation(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: animation_name") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player_read(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + var anim_resolved: Dictionary = handler._resolve_animation(player, anim_name) + if anim_resolved.has("error"): + return anim_resolved + var anim: Animation = anim_resolved.animation + + var tracks: Array[Dictionary] = [] + for i in anim.get_track_count(): + var track_type := anim.track_get_type(i) + var type_name := track_type_to_string(track_type) + var keys: Array[Dictionary] = [] + for k in anim.track_get_key_count(i): + var key_val = anim.track_get_key_value(i, k) + keys.append({ + "time": anim.track_get_key_time(i, k), + "value": serialize_value(key_val), + "transition": anim.track_get_key_transition(i, k), + }) + tracks.append({ + "index": i, + "type": type_name, + "path": str(anim.track_get_path(i)), + "interpolation": interp_to_string(anim.track_get_interpolation_type(i)), + "key_count": keys.size(), + "keys": keys, + }) + + return { + "data": { + "player_path": player_path, + "name": anim_name, + "length": anim.length, + "loop_mode": loop_mode_to_string(anim.loop_mode), + "track_count": anim.get_track_count(), + "tracks": tracks, + } + } + + +# ============================================================================ +# animation_validate (read-only) +# ============================================================================ + +func validate_animation(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var anim_name: String = params.get("animation_name", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if anim_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: animation_name") + + var handler = _h() + if handler == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "AnimationHandler not available", false) + var resolved: Dictionary = handler._resolve_player_read(player_path) + if resolved.has("error"): + return resolved + var player: AnimationPlayer = resolved.player + + if not player.has_animation(anim_name): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Animation '%s' not found on player at %s" % [anim_name, player_path]) + + var anim: Animation = player.get_animation(anim_name) + + var root_node := player_root_node(player) + + var broken_tracks: Array[Dictionary] = [] + var valid_count := 0 + + for i in anim.get_track_count(): + var track_path_str := str(anim.track_get_path(i)) + # Split on the FIRST colon (node↔property boundary), not the last. + # Godot's get_node_or_null strips the ":property" tail natively, so + # the valid/broken classification is the same either way — but for + # BROKEN tracks the broken_tracks[].node_path field is what callers + # read to diagnose the missing node, and rfind would surface + # "MissingTarget:modulate" instead of "MissingTarget" for subpath + # tracks like the "Target:modulate:a" shape preset_fade emits. + var colon := track_path_str.find(":") + var node_part: String + if colon >= 0: + node_part = track_path_str.substr(0, colon) + else: + node_part = track_path_str + + var target_node: Node = null + if root_node != null: + target_node = root_node.get_node_or_null(node_part) + + if target_node == null: + broken_tracks.append({ + "index": i, + "path": track_path_str, + "type": track_type_to_string(anim.track_get_type(i)), + "issue": "node_not_found", + "node_path": node_part, + }) + else: + valid_count += 1 + + return { + "data": { + "player_path": player_path, + "animation_name": anim_name, + "track_count": anim.get_track_count(), + "valid_count": valid_count, + "broken_count": broken_tracks.size(), + "broken_tracks": broken_tracks, + "valid": broken_tracks.is_empty(), + } + } + + +# ============================================================================ +# Static helpers — shared with handler + presets +# ============================================================================ + +## Resolve the effective root node an AnimationPlayer animates against. +## Falls back to the player's parent when the explicit root_node NodePath is +## empty or unresolvable. Returns null when the player isn't in the tree. +## +## Mirrors the resolution Godot does at playback time so the validator, +## preset target resolver, and track-property coercer all see the same root. +static func player_root_node(player: AnimationPlayer) -> Node: + if not player.is_inside_tree(): + return null + var rn := player.root_node + if rn != NodePath(): + var n := player.get_node_or_null(rn) + if n != null: + return n + return player.get_parent() + + +## Coerce a JSON value to match the expected Godot type for the given +## track_path. Returns {"ok": value} or {"error": msg}. +## Passes the raw value through when the target node isn't in the scene +## yet (authoring-time path). Errors when the target exists but the +## property doesn't, or when parsing a typed value (Color/Vector2/Vector3) +## clearly fails — better to reject than silently store garbage. +## `override_root_node` lets callers supply the root to resolve target paths +## against when the player isn't in the tree yet (auto-create flow) — the +## player's future parent stands in for the root the AnimationPlayer will +## eventually use. +static func coerce_value_for_track(value: Variant, track_path: String, player: AnimationPlayer, override_root_node: Node = null) -> Dictionary: + var ctx := resolve_track_prop_context(track_path, player, override_root_node) + if ctx.has("error"): + return {"error": ctx.error} + return coerce_with_context(value, ctx) + + +## Resolve a track_path's target property type once, so callers coercing many +## keyframes avoid walking `get_property_list()` on every one. Returns: +## {pass_through: true} — no resolution / authoring-time +## {pass_through: false, prop_type, prop_name} — coerce against this type +## {error: msg} — property not found on target +## +## Supports Godot's native NodePath subpath form `property:sub` (e.g. +## `position:y`, `modulate:a`) — splits on the FIRST colon (node↔property +## boundary), resolves the base property on the target, and for known +## scalar subpaths (x/y/z/w on vectors, r/g/b/a on Color) narrows the +## coerce target to TYPE_FLOAT so JSON numbers land as floats, not dicts. +static func resolve_track_prop_context(track_path: String, player: AnimationPlayer, override_root_node: Node = null) -> Dictionary: + var colon := track_path.find(":") + if colon < 0: + return {"pass_through": true} + + var node_part := track_path.substr(0, colon) + var prop_full := track_path.substr(colon + 1) + + # Property may include a subpath: "position:y", "modulate:a", etc. + var sub_colon := prop_full.find(":") + var prop_base := prop_full if sub_colon < 0 else prop_full.substr(0, sub_colon) + var prop_sub := "" if sub_colon < 0 else prop_full.substr(sub_colon + 1) + + var root_node: Node = override_root_node + if root_node == null: + root_node = player_root_node(player) + if root_node == null: + return {"pass_through": true} + + var target: Node = root_node.get_node_or_null(node_part) + if target == null: + # Target node isn't in the scene yet — authoring-time path. Pass through. + return {"pass_through": true} + + for p in target.get_property_list(): + if p.name == prop_base: + var base_type: int = p.get("type", TYPE_NIL) + var coerce_type := base_type + if not prop_sub.is_empty(): + var sub_type := subpath_component_type(base_type, prop_sub) + if sub_type == TYPE_NIL: + # Unknown subpath component — pass through so Godot's own + # NodePath resolution raises at playback if it's truly bogus, + # rather than fabricating a coerce error for a valid-but- + # uncommon form (e.g. Transform3D subpaths). + return {"pass_through": true} + coerce_type = sub_type + return { + "pass_through": false, + "prop_type": coerce_type, + "prop_name": prop_full, + } + + # Target exists but the property doesn't. Reject loudly — silently storing + # the raw value here produces garbage keyframes at playback time. + return {"error": + "%s (target path: '%s')" % + [PropertyErrors.build_message(target, prop_base), node_part]} + + +## Map a `property:sub` subpath to its scalar component type. Returns +## TYPE_NIL when the base type / subkey pair isn't one we recognise — +## callers pass-through in that case rather than mis-coerce. +static func subpath_component_type(base_type: int, sub: String) -> int: + var entry = _SUBPATH_COMPONENTS.get(base_type) + if entry == null or sub.length() != 1: + return TYPE_NIL + return entry[1] if (entry[0] as String).contains(sub) else TYPE_NIL + + +static func coerce_with_context(value: Variant, ctx: Dictionary) -> Dictionary: + if ctx.get("pass_through", false): + return {"ok": value} + return coerce_for_type(value, ctx.prop_type, ctx.prop_name) + + +## Coerce a single value to the given Godot variant type. Returns +## {"ok": coerced} or {"error": msg}. Unknown types pass through. +static func coerce_for_type(value: Variant, prop_type: int, prop_name: String) -> Dictionary: + match prop_type: + TYPE_COLOR: + ## Canonical strict parser (#714): same shapes as every other + ## color-accepting handler, including [r,g,b(,a)] arrays. + var col = McpJsonValues.parse_color(value) + if col != null: + return {"ok": col} + return {"error": "Cannot coerce value to Color for property '%s' (expected \"#rrggbb(aa)\"/named string, {r,g,b[,a]}, [r,g,b(,a)], or Color)" % prop_name} + TYPE_VECTOR2: + var v2 = McpJsonValues.parse_vector2(value) + if v2 != null: + return {"ok": v2} + return {"error": "Cannot coerce value to Vector2 for property '%s' (expected {x,y}, [x,y], or Vector2)" % prop_name} + TYPE_VECTOR3: + var v3 = McpJsonValues.parse_vector3(value) + if v3 != null: + return {"ok": v3} + return {"error": "Cannot coerce value to Vector3 for property '%s' (expected {x,y,z}, [x,y,z], or Vector3)" % prop_name} + TYPE_FLOAT: + if value is int or value is float: + return {"ok": float(value)} + TYPE_INT: + if value is float or value is int: + return {"ok": int(value)} + TYPE_BOOL: + if value is int or value is float or value is bool: + return {"ok": bool(value)} + return {"ok": value} + + +# ============================================================================ +# Static helpers — parsing + serializing +# ============================================================================ + +## Parse a transition value: named string or raw float. +## Named values live in `_NAMED_TRANSITIONS` so the mapping has a single source. +static func parse_transition(v: Variant) -> float: + if v is float or v is int: + return float(v) + if v is String: + var key: String = (v as String).to_lower() + if _NAMED_TRANSITIONS.has(key): + return float(_NAMED_TRANSITIONS[key]) + return 1.0 + + +## Map an Animation.TrackType enum to a stable string. Unknown types report +## as "unknown" rather than being silently coerced to "method" — callers that +## only produce value/method tracks can ignore the others; clients that want +## to round-trip bezier/audio/etc. get an honest label to key off. +static func track_type_to_string(track_type: int) -> String: + match track_type: + Animation.TYPE_VALUE: return "value" + Animation.TYPE_METHOD: return "method" + Animation.TYPE_POSITION_3D: return "position_3d" + Animation.TYPE_ROTATION_3D: return "rotation_3d" + Animation.TYPE_SCALE_3D: return "scale_3d" + Animation.TYPE_BLEND_SHAPE: return "blend_shape" + Animation.TYPE_BEZIER: return "bezier" + Animation.TYPE_AUDIO: return "audio" + Animation.TYPE_ANIMATION: return "animation" + _: return "unknown" + + +static func loop_mode_to_string(mode: int) -> String: + match mode: + Animation.LOOP_LINEAR: return "linear" + Animation.LOOP_PINGPONG: return "pingpong" + _: return "none" + + +static func interp_to_string(mode: int) -> String: + match mode: + Animation.INTERPOLATION_NEAREST: return "nearest" + Animation.INTERPOLATION_CUBIC: return "cubic" + _: return "linear" + + +## Convert a Godot Variant to a JSON-safe value. +static func serialize_value(value: Variant) -> Variant: + ## Delegates to the shared serializer (#714) — the drifted private copy + ## stringified rotation_3d keyframe Quaternions into opaque text where + ## McpVariantSerializer emits the {x,y,z,w} dict callers can round-trip + ## (it also NaN/Inf-guards floats, matching the wire contract). + return VariantSerializer.serialize(value) diff --git a/addons/godot_ai/handlers/animation_values.gd.uid b/addons/godot_ai/handlers/animation_values.gd.uid new file mode 100644 index 0000000..5d2a8b7 --- /dev/null +++ b/addons/godot_ai/handlers/animation_values.gd.uid @@ -0,0 +1 @@ +uid://bguta2eb8blgf diff --git a/addons/godot_ai/handlers/api_handler.gd b/addons/godot_ai/handlers/api_handler.gd new file mode 100644 index 0000000..acfeda5 --- /dev/null +++ b/addons/godot_ai/handlers/api_handler.gd @@ -0,0 +1,89 @@ +@tool +extends RefCounted + +## Read-only access to version-correct Godot class metadata. + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const ClassIntrospection := preload("res://addons/godot_ai/utils/class_introspection.gd") +const FuzzySuggestions := preload("res://addons/godot_ai/utils/fuzzy_suggestions.gd") + +func get_class_info(params: Dictionary) -> Dictionary: + var requested_class: String = params.get("class_name", "") + if requested_class.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "Missing required param: class_name" + ) + if not ClassDB.class_exists(requested_class): + var script_class := _global_script_class(requested_class) + if not script_class.is_empty(): + return _script_class_error(requested_class, script_class) + return _unknown_class_error(requested_class) + if params.has("limit") and int(params.get("limit")) < 0: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "limit must be >= 0; use limit=0 only when an unlimited section is needed" + ) + var section_check := ClassIntrospection.validate_sections( + params.get("sections", ClassIntrospection.DEFAULT_SECTIONS) + ) + if not section_check.invalid.is_empty(): + return _invalid_sections_error(section_check.invalid) + return {"data": ClassIntrospection.build(requested_class, params)} + + +static func _unknown_class_error(requested_class: String) -> Dictionary: + var suggestions := _suggest_classes(requested_class) + var message := "Unknown Godot class: %s" % requested_class + if not suggestions.is_empty(): + message += ". Did you mean: %s?" % ", ".join(suggestions) + var result := ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, message) + result["error"]["data"] = {"suggestions": suggestions} + return result + + +static func _suggest_classes(requested_class: String) -> Array[String]: + return FuzzySuggestions.rank(requested_class, ClassDB.get_class_list()) + + +static func _global_script_class(requested_class: String) -> Dictionary: + for raw_info in ProjectSettings.get_global_class_list(): + var info: Dictionary = raw_info + if info.get("class", "") == requested_class: + return info + return {} + + +static func _script_class_error(requested_class: String, script_class: Dictionary) -> Dictionary: + var path := str(script_class.get("path", "")) + var base := str(script_class.get("base", "")) + var message := ( + "%s is a project script class, not a ClassDB class. " + + "Use script_manage(op=\"find_symbols\", params={\"path\": \"%s\"}) for script symbols." + ) % [requested_class, path] + var result := ErrorCodes.make(ErrorCodes.WRONG_TYPE, message) + result["error"]["data"] = { + "script_class": true, + "class_name": requested_class, + "base_class": base, + "path": path, + } + return result + + +static func _invalid_sections_error(invalid_sections: Array[String]) -> Dictionary: + var suggestions := {} + for section in invalid_sections: + suggestions[section] = FuzzySuggestions.rank( + section, + ClassIntrospection.SUGGESTABLE_SECTION_TOKENS, + 3, + 0.3 + ) + var message := "Unknown class-info section(s): %s. Valid sections: %s (or \"all\" for all documentation sections; \"inheritors\" must be requested by name)" % [ + ", ".join(invalid_sections), + ", ".join(ClassIntrospection.KNOWN_SECTIONS), + ] + var result := ErrorCodes.make(ErrorCodes.INVALID_PARAMS, message) + result["error"]["data"] = {"suggestions": suggestions} + return result diff --git a/addons/godot_ai/handlers/api_handler.gd.uid b/addons/godot_ai/handlers/api_handler.gd.uid new file mode 100644 index 0000000..f519c48 --- /dev/null +++ b/addons/godot_ai/handlers/api_handler.gd.uid @@ -0,0 +1 @@ +uid://v3rkd7ueunii diff --git a/addons/godot_ai/handlers/audio_handler.gd b/addons/godot_ai/handlers/audio_handler.gd new file mode 100644 index 0000000..79dea56 --- /dev/null +++ b/addons/godot_ai/handlers/audio_handler.gd @@ -0,0 +1,361 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles AudioStreamPlayer / 2D / 3D authoring — node creation, stream +## assignment, playback-property edits, and real editor preview playback. +## +## Stream assignment loads a Godot-imported AudioStream resource from +## res:// (the editor's import step converts .ogg / .wav / .mp3 into a +## streamable AudioStream subclass before we ever see it). +## +## play() / stop() call the live node method directly — no undo, no +## persistence; they match what the inspector's play button does. + + +const _VALID_TYPES := { + "1d": "AudioStreamPlayer", + "2d": "AudioStreamPlayer2D", + "3d": "AudioStreamPlayer3D", +} + +## Whitelist of playback properties settable via audio_player_set_playback. +## Each value is the expected Variant type of the param dict value. +const _PLAYBACK_KEYS := { + "volume_db": TYPE_FLOAT, + "pitch_scale": TYPE_FLOAT, + "autoplay": TYPE_BOOL, + "bus": TYPE_STRING, +} + + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +# ============================================================================ +# audio_player_create +# ============================================================================ + +func create_player(params: Dictionary) -> Dictionary: + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "AudioStreamPlayer") + var type_str: String = params.get("type", "1d") + + if not _VALID_TYPES.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid audio player type '%s'. Valid: %s" % [type_str, ", ".join(_VALID_TYPES.keys())] + ) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var node := _instantiate_player(type_str) + if node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate audio player") + if not node_name.is_empty(): + node.name = node_name + + _undo_redo.create_action("MCP: Create %s '%s'" % [_VALID_TYPES[type_str], node.name]) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": String(node.name), + "type": type_str, + "class": _VALID_TYPES[type_str], + "undoable": true, + } + } + + +# ============================================================================ +# audio_player_set_stream +# ============================================================================ + +func set_stream(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var stream_path: String = params.get("stream_path", "") + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + if stream_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: stream_path") + + var stream_path_err = McpPathValidator.loadable_error(stream_path, "stream_path") + if stream_path_err != null: + return stream_path_err + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: Node = resolved.player + + if not ResourceLoader.exists(stream_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "AudioStream not found: %s" % stream_path) + var loaded := ResourceLoader.load(stream_path) + if loaded == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to load AudioStream: %s" % stream_path) + if not (loaded is AudioStream): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Resource at %s is not an AudioStream (got %s)" % [stream_path, loaded.get_class()] + ) + + var old_stream: AudioStream = player.stream + + _undo_redo.create_action("MCP: Set audio stream on %s" % player.name) + _undo_redo.add_do_property(player, "stream", loaded) + _undo_redo.add_undo_property(player, "stream", old_stream) + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "stream_path": stream_path, + "stream_class": loaded.get_class(), + "duration_seconds": float(loaded.get_length()), + "undoable": true, + } + } + + +# ============================================================================ +# audio_player_set_playback +# ============================================================================ + +func set_playback(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: Node = resolved.player + + var updates: Dictionary = {} + for key in _PLAYBACK_KEYS: + if params.has(key): + var expected_type: int = _PLAYBACK_KEYS[key] + var value = params.get(key) + var coerced = _coerce_playback_value(value, expected_type) + if coerced == null: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Invalid value for %s: expected %s, got %s" % [ + key, type_string(expected_type), type_string(typeof(value)) + ] + ) + updates[key] = coerced + + if updates.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "At least one of %s is required" % ", ".join(_PLAYBACK_KEYS.keys()) + ) + + var old_values: Dictionary = {} + for key in updates: + old_values[key] = player.get(key) + + _undo_redo.create_action("MCP: Update playback on %s" % player.name) + for key in updates: + _undo_redo.add_do_property(player, key, updates[key]) + _undo_redo.add_undo_property(player, key, old_values[key]) + _undo_redo.commit_action() + + return { + "data": { + "player_path": player_path, + "applied": updates.keys(), + "values": updates, + "undoable": true, + } + } + + +# ============================================================================ +# audio_play (runtime preview — not saved with scene) +# ============================================================================ + +func play(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + var from_position: float = float(params.get("from_position", 0.0)) + + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: Node = resolved.player + + if player.stream == null: + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "Player has no stream assigned — call audio_player_set_stream first" + ) + + player.play(from_position) + + return { + "data": { + "player_path": player_path, + "from_position": from_position, + "playing": bool(player.playing), + "undoable": false, + "reason": "Runtime playback state — not saved with scene", + } + } + + +# ============================================================================ +# audio_stop (runtime preview — not saved with scene) +# ============================================================================ + +func stop(params: Dictionary) -> Dictionary: + var player_path: String = params.get("player_path", "") + if player_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: player_path") + + var resolved := _resolve_player(player_path) + if resolved.has("error"): + return resolved + var player: Node = resolved.player + + player.stop() + + return { + "data": { + "player_path": player_path, + "playing": bool(player.playing), + "undoable": false, + "reason": "Runtime playback state — not saved with scene", + } + } + + +# ============================================================================ +# audio_list (read — scan project for AudioStream resources) +# ============================================================================ + +func list_streams(params: Dictionary) -> Dictionary: + var root: String = params.get("root", "res://") + var include_duration: bool = bool(params.get("include_duration", true)) + + var root_err = McpPathValidator.path_error(root, "root") + if root_err != null: + return root_err + + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var results: Array[Dictionary] = [] + var start_dir := efs.get_filesystem_path(root) + if start_dir == null: + start_dir = efs.get_filesystem() + _scan_audio(start_dir, root, include_duration, results) + return { + "data": { + "root": root, + "streams": results, + "count": results.size(), + } + } + + +func _scan_audio(dir: EditorFileSystemDirectory, root: String, include_duration: bool, out: Array[Dictionary]) -> void: + if dir == null: + return + for i in dir.get_file_count(): + var file_path := dir.get_file_path(i) + if not file_path.begins_with(root): + continue + var file_type := dir.get_file_type(i) + var is_audio := file_type == "AudioStream" or ClassDB.is_parent_class(file_type, "AudioStream") + if not is_audio: + continue + var entry: Dictionary = { + "path": file_path, + "class": file_type, + } + if include_duration: + var res := ResourceLoader.load(file_path) + if res is AudioStream: + entry["duration_seconds"] = float((res as AudioStream).get_length()) + else: + entry["duration_seconds"] = 0.0 + out.append(entry) + for i in dir.get_subdir_count(): + _scan_audio(dir.get_subdir(i), root, include_duration, out) + + +# ============================================================================ +# Helpers +# ============================================================================ + +static func _instantiate_player(type_str: String) -> Node: + match type_str: + "1d": + return AudioStreamPlayer.new() + "2d": + return AudioStreamPlayer2D.new() + "3d": + return AudioStreamPlayer3D.new() + return null + + +func _resolve_player(player_path: String) -> Dictionary: + var resolved := McpNodeValidator.resolve_or_error(player_path, "player_path") + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var is_player := node is AudioStreamPlayer \ + or node is AudioStreamPlayer2D \ + or node is AudioStreamPlayer3D + if not is_player: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node at %s is not an AudioStreamPlayer/2D/3D (got %s)" % [player_path, node.get_class()] + ) + return {"player": node} + + +## Coerce a playback param value to the expected type. int→float is allowed +## so JSON integers pass through; everything else requires the exact type. +## Returns the coerced value, or null on type mismatch. +static func _coerce_playback_value(value: Variant, expected_type: int) -> Variant: + match expected_type: + TYPE_FLOAT: + if value is float or value is int: + return float(value) + TYPE_BOOL: + if value is bool: + return value + TYPE_STRING: + if value is String: + return value + return null diff --git a/addons/godot_ai/handlers/audio_handler.gd.uid b/addons/godot_ai/handlers/audio_handler.gd.uid new file mode 100644 index 0000000..2510ee7 --- /dev/null +++ b/addons/godot_ai/handlers/audio_handler.gd.uid @@ -0,0 +1 @@ +uid://cjtvod52xxocs diff --git a/addons/godot_ai/handlers/autoload_handler.gd b/addons/godot_ai/handlers/autoload_handler.gd new file mode 100644 index 0000000..22e7764 --- /dev/null +++ b/addons/godot_ai/handlers/autoload_handler.gd @@ -0,0 +1,91 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles autoload listing, adding, and removing via ProjectSettings. + + +func list_autoloads(_params: Dictionary) -> Dictionary: + var autoloads: Array[Dictionary] = [] + for prop in ProjectSettings.get_property_list(): + var key: String = prop.get("name", "") + if not key.begins_with("autoload/"): + continue + var name := key.substr("autoload/".length()) + var raw_value: String = ProjectSettings.get_setting(key, "") + var is_singleton := raw_value.begins_with("*") + var path := raw_value.substr(1) if is_singleton else raw_value + autoloads.append({ + "name": name, + "path": path, + "singleton": is_singleton, + }) + return {"data": {"autoloads": autoloads, "count": autoloads.size()}} + + +func add_autoload(params: Dictionary) -> Dictionary: + var name: String = params.get("name", "") + var path: String = params.get("path", "") + var singleton: bool = params.get("singleton", true) + + if name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + var path_err = McpPathValidator.path_error(path, "path") + if path_err != null: + return path_err + if not FileAccess.file_exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "File not found: %s" % path) + + var key := "autoload/%s" % name + if ProjectSettings.has_setting(key): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Autoload '%s' already exists" % name) + + var value := ("*" if singleton else "") + path + ProjectSettings.set_setting(key, value) + ProjectSettings.set_initial_value(key, "") + ProjectSettings.set_as_basic(key, true) + var err := ProjectSettings.save() + if err != OK: + ProjectSettings.clear(key) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while adding autoload '%s': %s (error %d)" % [name, error_string(err), err]) + + return { + "data": { + "name": name, + "path": path, + "singleton": singleton, + "undoable": false, + "reason": "Autoload changes are saved to project.godot", + } + } + + +func remove_autoload(params: Dictionary) -> Dictionary: + var name: String = params.get("name", "") + if name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + + var key := "autoload/%s" % name + if not ProjectSettings.has_setting(key): + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, "Autoload '%s' not found" % name) + + var old_value: String = ProjectSettings.get_setting(key, "") + ProjectSettings.clear(key) + var err := ProjectSettings.save() + if err != OK: + ProjectSettings.set_setting(key, old_value) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while removing autoload '%s': %s (error %d)" % [name, error_string(err), err]) + + return { + "data": { + "name": name, + "removed": true, + "undoable": false, + "reason": "Autoload changes are saved to project.godot", + } + } diff --git a/addons/godot_ai/handlers/autoload_handler.gd.uid b/addons/godot_ai/handlers/autoload_handler.gd.uid new file mode 100644 index 0000000..921ed4e --- /dev/null +++ b/addons/godot_ai/handlers/autoload_handler.gd.uid @@ -0,0 +1 @@ +uid://bb0inov044jn6 diff --git a/addons/godot_ai/handlers/batch_handler.gd b/addons/godot_ai/handlers/batch_handler.gd new file mode 100644 index 0000000..c6c1474 --- /dev/null +++ b/addons/godot_ai/handlers/batch_handler.gd @@ -0,0 +1,190 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Executes a list of sub-commands through the dispatcher with stop-on-first-error +## semantics. When undo=true (default), any successful sub-commands are rolled +## back via the scene's UndoRedo history if a later sub-command fails. + +## Commands that cannot run as batch sub-commands, each with the reason a batch +## can't host it. +## - batch_execute: would recurse. +## - run_tests: a batch executes synchronously inside one dispatcher tick with +## NO transport servicing, so a full suite starves the WebSocket heartbeat +## (the exact disconnect the serviced test_run path exists to prevent) and +## the Python batch handler only allows 30s anyway — call the test_run tool +## directly. +## - game_command: it is deferred — its reply flows out-of-band correlated by a +## _request_id that dispatch_direct deliberately strips (see +## McpDispatcher.dispatch_direct), so a game op nested in a batch would have +## no completion channel and hang or lose its reply. input_sequence made this +## concrete (#814); the whole game_command surface shares the deferred path. +const FORBIDDEN_SUBCOMMANDS := { + "batch_execute": "batch_execute cannot be nested inside another batch", + "run_tests": + "run_tests is not allowed as a sub-command — a batch runs synchronously " + + "with no transport servicing; call the test_run tool directly", + "game_command": + "game_command ops are deferred (their reply arrives out-of-band) and " + + "have no completion channel inside a batch — run them as their own tool call", +} + +## The whole batch executes synchronously inside one dispatcher tick, +## outside the 4ms frame budget — an unbounded array freezes the editor +## for the batch's full duration. 500 is far above any legitimate scene +## edit while keeping worst-case stalls in check. +const MAX_BATCH_COMMANDS := 500 + +var _dispatcher: McpDispatcher +var _undo_redo: EditorUndoRedoManager + + +func _init(dispatcher: McpDispatcher, undo_redo: EditorUndoRedoManager) -> void: + _dispatcher = dispatcher + _undo_redo = undo_redo + + +func batch_execute(params: Dictionary) -> Dictionary: + var commands = params.get("commands", null) + if typeof(commands) != TYPE_ARRAY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "commands must be a list") + if commands.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "commands must not be empty") + if commands.size() > MAX_BATCH_COMMANDS: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "commands exceeds the %d-command batch cap (got %d) — split into multiple batches" % [MAX_BATCH_COMMANDS, commands.size()] + ) + + var undo: bool = params.get("undo", true) + + for idx in range(commands.size()): + var item = commands[idx] + if typeof(item) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "commands[%d] must be a dict" % idx) + var cmd_name: String = item.get("command", "") + if cmd_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "commands[%d] missing 'command' field" % idx) + if FORBIDDEN_SUBCOMMANDS.has(cmd_name): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "commands[%d]: %s" % [idx, FORBIDDEN_SUBCOMMANDS[cmd_name]]) + if not _dispatcher.has_command(cmd_name): + return _unknown_command_error(idx, cmd_name) + ## Pre-validate params type: the execution loop's typed Dictionary + ## local would hard-error on a non-dict mid-batch, aborting AFTER + ## earlier mutations committed. Catching it here keeps the + ## all-or-nothing contract for malformed input. + if typeof(item.get("params", {})) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "commands[%d].params must be a dict" % idx) + if cmd_name.begins_with("custom_tool:"): + var _custom_tools := McpToolRegistry.get_instance() + if _custom_tools: + var spec := _custom_tools.get_spec(cmd_name.trim_prefix("custom_tool:")) + ## A deferred tool's real reply arrives via ctx.send_deferred + ## AFTER the batch has already returned its synchronous + ## results — the sub-command would report an opaque + ## "_deferred" placeholder and the actual payload would be + ## orphaned. Reject up-front, matching the FORBIDDEN_SUBCOMMANDS + ## contract for run_tests. + if spec != null and spec.deferred: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "commands[%d] custom_tool:%s is deferred — its reply outlives the batch response; call it directly instead" % [idx, cmd_name.trim_prefix("custom_tool:")] + ) + if undo and spec != null and not spec.undoable: + return ErrorCodes.make( + ErrorCodes.CUSTOM_TOOL_NOT_UNDOABLE, + "commands[%d] custom_tool:%s is not undoable" % [idx, cmd_name.trim_prefix("custom_tool:")] + ) + + var results: Array = [] + var succeeded := 0 + var stopped_at = null + var all_undoable := true + # Captured after the first successful commit — get_history_undo_redo() + # errors if called before any action exists in the history_map. + var histories: Array = [] + + for idx in range(commands.size()): + var item: Dictionary = commands[idx] + var cmd_name: String = item["command"] + var sub_params: Dictionary = item.get("params", {}) + + var raw_result: Dictionary = _dispatcher.dispatch_direct(cmd_name, sub_params) + var status: String = raw_result.get("status", "ok") + + var result_entry: Dictionary = {"command": cmd_name, "status": status} + if status == "error": + result_entry["error"] = raw_result.get("error", {}) + results.append(result_entry) + stopped_at = idx + break + else: + var data: Dictionary = raw_result.get("data", raw_result) + result_entry["data"] = data + if typeof(data) == TYPE_DICTIONARY and data.get("undoable", false) != true: + all_undoable = false + results.append(result_entry) + succeeded += 1 + _capture_histories(histories) + + var rolled_back := false + if stopped_at != null and undo and succeeded > 0: + rolled_back = _rollback(succeeded, histories) + + var response_data: Dictionary = { + "succeeded": succeeded, + "stopped_at": stopped_at, + "results": results, + "undo": undo, + "rolled_back": rolled_back, + "undoable": stopped_at == null and all_undoable and not rolled_back, + } + if stopped_at != null: + response_data["error"] = results[-1]["error"] + return {"data": response_data} + + +## Capture the scene's UndoRedo reference for batch rollback. Safe to call +## multiple times; appends only the new reference. MCP write handlers all pin +## their actions to the scene history, so the scene UndoRedo is the only one +## rollback needs. Must be called only after at least one action has been +## committed to the scene history. +func _capture_histories(histories: Array) -> void: + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + return + var scene_id := _undo_redo.get_object_history_id(scene_root) + var scene_ur := _undo_redo.get_history_undo_redo(scene_id) + if scene_ur != null and not scene_ur in histories: + histories.append(scene_ur) + + +## Build the unknown-command error for a sub-command. Clarifies that +## batch_execute expects plugin command names (not MCP tool names) and +## surfaces fuzzy suggestions in both the message and structured data. +func _unknown_command_error(idx: int, cmd_name: String) -> Dictionary: + var suggestions := _dispatcher.suggest_similar(cmd_name) + var msg := "commands[%d]: unknown plugin command '%s'. batch_execute expects plugin command names (e.g. 'create_node'), not MCP tool names (e.g. 'node_create')." % [idx, cmd_name] + if not suggestions.is_empty(): + msg += " Did you mean: %s?" % ", ".join(suggestions) + var err := ErrorCodes.make(ErrorCodes.UNKNOWN_COMMAND, msg) + err["error"]["data"] = {"suggestions": suggestions} + return err + + +## Undo `count` actions by calling undo() on captured histories in LIFO order. +## Returns true iff all undo calls succeeded. +func _rollback(count: int, histories: Array) -> bool: + if histories.is_empty(): + return false + for _i in range(count): + var undone := false + for ur in histories: + if ur.undo(): + undone = true + break + if not undone: + return false + return true diff --git a/addons/godot_ai/handlers/batch_handler.gd.uid b/addons/godot_ai/handlers/batch_handler.gd.uid new file mode 100644 index 0000000..630a596 --- /dev/null +++ b/addons/godot_ai/handlers/batch_handler.gd.uid @@ -0,0 +1 @@ +uid://dt7um75oofdrh diff --git a/addons/godot_ai/handlers/camera_handler.gd b/addons/godot_ai/handlers/camera_handler.gd new file mode 100644 index 0000000..fb986e5 --- /dev/null +++ b/addons/godot_ai/handlers/camera_handler.gd @@ -0,0 +1,1145 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles Camera2D / Camera3D authoring — create, configure, bounds, damping, +## node-parent-based follow, presets. +## +## All writes are bundled into a single EditorUndoRedoManager action. +## Setting current=true auto-unmarks previously-current cameras of the same +## class in the same action so one Ctrl-Z reverts the switch. + +const CameraValues := preload("res://addons/godot_ai/handlers/camera_values.gd") +const CameraPresets := preload("res://addons/godot_ai/handlers/camera_presets.gd") + +const _VALID_TYPES := { + "2d": "Camera2D", + "3d": "Camera3D", +} + +const _KEYS_2D := [ + "zoom", + "offset", + "anchor_mode", + "ignore_rotation", + "enabled", + "current", + "process_callback", + "position_smoothing_enabled", + "position_smoothing_speed", + "rotation_smoothing_enabled", + "rotation_smoothing_speed", + "drag_horizontal_enabled", + "drag_vertical_enabled", + "drag_horizontal_offset", + "drag_vertical_offset", + "drag_left_margin", + "drag_top_margin", + "drag_right_margin", + "drag_bottom_margin", + "limit_left", + "limit_right", + "limit_top", + "limit_bottom", + "limit_smoothed", +] + +const _KEYS_3D := [ + "fov", + "near", + "far", + "size", + "projection", + "keep_aspect", + "cull_mask", + "doppler_tracking", + "h_offset", + "v_offset", + "current", +] + +# Transform-shaped keys live on Node2D / Node3D, not in the camera-specific +# schema — rejecting them without a hint sends agents searching for the wrong +# tool. +const _NODE_TRANSFORM_KEYS := [ + "position", "rotation", "scale", "transform", + "global_position", "global_rotation", "global_scale", "global_transform", +] + +const _DAMPING_MARGIN_KEYS := ["left", "top", "right", "bottom"] +const _CURRENT_SETTLE_ATTEMPTS := 8 +const _CURRENT_SETTLE_DELAY_MSEC := 10 + + +var _undo_redo: EditorUndoRedoManager + +# Per-scene logical-current bookkeeping. Keys are scene-root InstanceIDs; +# values are { "2d": NodePath-as-String, "3d": NodePath-as-String } with +# missing keys meaning "no logical current for that class." +# +# Stored on the handler instance (NOT as Node metadata on the scene root) +# because set_meta() persists into the .tscn on save, contaminating user +# scene files with MCP-internal sidecar state that lingers across reloads +# and travels in commits. +var _logical_current: Dictionary = {} + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +# Camera2D doesn't expose `current` as a settable property in Godot 4 — +# only is_current() / make_current() / clear_current(). Camera3D exposes +# both, but using methods uniformly avoids per-class branching. +static func _is_current(cam: Node) -> bool: + if cam == null: + return false + return bool(cam.is_current()) + + +static func _viewport_current_camera(scene_root: Node) -> Node: + if scene_root == null: + return null + var viewport := scene_root.get_viewport() + if viewport == null: + return null + var current_2d := viewport.get_camera_2d() + if current_2d != null and scene_root.is_ancestor_of(current_2d): + return current_2d + var current_3d := viewport.get_camera_3d() + if current_3d != null and scene_root.is_ancestor_of(current_3d): + return current_3d + return null + + +static func _is_effective_current(cam: Node) -> bool: + if _is_current(cam): + return true + if cam is Camera2D: + var viewport_2d := cam.get_viewport() + return viewport_2d != null and viewport_2d.get_camera_2d() == cam + if cam is Camera3D: + var viewport_3d := cam.get_viewport() + return viewport_3d != null and viewport_3d.get_camera_3d() == cam + return false + + +# Logical-current bookkeeping. Updated from inside _apply_make_current / +# _apply_clear_current so DO and UNDO callables stamp the same logical +# slot they touch in the viewport. Reads consult the logical slot first +# and treat it as authoritative when set — the viewport read is the +# fallback for "MCP never touched this scene's cameras." + +func _set_logical_current(cam: Node) -> void: + if cam == null or not is_instance_valid(cam) or not cam.is_inside_tree(): + return + var type_str := _camera_type_str(cam) + if type_str.is_empty(): + return + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null or not scene_root.is_ancestor_of(cam): + return + var slot: Dictionary = _logical_current.get(scene_root.get_instance_id(), {}) + slot[type_str] = McpScenePath.from_node(cam, scene_root) + _logical_current[scene_root.get_instance_id()] = slot + + +func _clear_logical_current(cam: Node) -> void: + if cam == null: + return + var type_str := _camera_type_str(cam) + if type_str.is_empty(): + return + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + return + var key := scene_root.get_instance_id() + if not _logical_current.has(key): + return + var slot: Dictionary = _logical_current[key] + if not slot.has(type_str): + return + # Only clear if the logical slot still points at this camera; otherwise + # a later make_current already took the slot and we'd stomp it. + var current_path := "" + if is_instance_valid(cam) and cam.is_inside_tree() and scene_root.is_ancestor_of(cam): + current_path = McpScenePath.from_node(cam, scene_root) + if String(slot[type_str]) == current_path: + slot.erase(type_str) + if slot.is_empty(): + _logical_current.erase(key) + else: + _logical_current[key] = slot + + +func _logical_current_camera(scene_root: Node, type_str: String = "") -> Node: + if scene_root == null: + return null + var key := scene_root.get_instance_id() + if not _logical_current.has(key): + return null + var slot: Dictionary = _logical_current[key] + var types: Array[String] = [] + if type_str == "2d" or type_str == "3d": + types = [type_str] + else: + types = ["2d", "3d"] + for t in types: + if not slot.has(t): + continue + var path := String(slot[t]) + if path.is_empty(): + slot.erase(t) + continue + var node := McpScenePath.resolve(path, scene_root) + if node == null or not _is_camera(node) or _camera_type_str(node) != t: + slot.erase(t) + continue + return node + if slot.is_empty(): + _logical_current.erase(key) + else: + _logical_current[key] = slot + return null + + +# Public introspection for tests that need to distinguish "handler has a +# logical marker" from "handler is falling back to engine state". `get_camera` +# / `list_cameras` both use `_resolve_current` which falls through to +# `_is_effective_current` when no marker is set — that's correct for callers +# but masks the marker presence from anyone trying to gate on +# "did the handler actually record this state?". Returns the logical-current +# Camera2D / Camera3D for the given type ("2d" / "3d" / "" for either), or +# null when no marker is set. See #316 PR #372 review feedback. +func peek_logical_current(scene_root: Node, type_str: String = "") -> Node: + return _logical_current_camera(scene_root, type_str) + + +# Authoritative answer for "is `cam` the current camera of its class?" +# +# When a logical marker exists for the camera's class, it is the single +# source of truth — only the marker's referenced camera reports current, +# every other camera of that class reports false even if the viewport +# slot still points at one of them (the headless-CI lag in #140 / #278 / +# #301). Without a logical marker, fall through to the viewport read so +# scenes MCP never touched still answer correctly. +func _resolve_current(scene_root: Node, cam: Node) -> bool: + if scene_root == null or cam == null: + return false + var logical := _logical_current_camera(scene_root, _camera_type_str(cam)) + if logical != null: + return logical == cam + return _is_effective_current(cam) + + +# list_cameras pre-fetches the per-class logical pointers once; this +# variant takes those pointers to avoid an O(n²) walk over the meta +# bookkeeping for each camera in the scene. +func _resolve_current_with_logicals(cam: Node, logical_2d: Node, logical_3d: Node) -> bool: + if cam == null: + return false + if cam is Camera2D: + if logical_2d != null: + return logical_2d == cam + elif cam is Camera3D: + if logical_3d != null: + return logical_3d == cam + return _is_effective_current(cam) + + +# Register a current=true switch on `node` in the open undo action, +# unmarking previously-current siblings of the same class so a single +# Ctrl-Z reverts the whole switch. +# +# Both DO and UNDO route through `_apply_make_current` / `_apply_clear_current` +# on the handler itself rather than calling Camera.make_current() directly. +# The helpers do the make_current (or clear_current) call plus bounded sync +# settling when the viewport hasn't yet reflected the change — headless CI +# occasionally reports `is_current() == false` immediately after a committed +# make_current (observed CI run 24682342469) and symmetrically still reports +# the displaced camera as current immediately after an undo (observed CI runs +# 24682342469, 24692250322, 24696571517, 25079965242 — tracked in #140). +# Later #278 runs broadened the same current-camera timing flake across more +# platforms and assertions, so the settle budget is deliberately above one +# fast local frame. +# +# Because those callables bind to `self` (a RefCounted handler, not a scene +# node), every action that calls this helper must pin its history via +# `create_action(name, MERGE_DISABLE, scene_root)` — otherwise the +# handler-bound ops land in GLOBAL_HISTORY while the scene-node ops land in +# the scene's history, and a single editor_undo reverts only half the action. +# +# Both DO and UNDO use a single make_current() call — never a +# clear_current() + make_current() pair. make_current() takes over the +# viewport slot atomically (Godot enforces one current camera per class +# per viewport), so the displaced camera naturally returns +# is_current() == false without an explicit clear. The two-step approach +# leaves the viewport temporarily with no current camera between the +# clear and the make, which races with editor cleanup on macOS headless +# (observed flaking CI runs 24674252085, 24675424785). +func _add_make_current_to_action(node: Node, type_str: String, scene_root: Node) -> void: + var prev_current: Node = null + for cam in _list_cameras_in_scene(scene_root, type_str): + if cam == node: + continue + if _resolve_current(scene_root, cam): + prev_current = cam + break + _undo_redo.add_do_method(self, "_apply_make_current", node) + if prev_current != null: + _undo_redo.add_undo_method(self, "_apply_make_current", prev_current) + else: + _undo_redo.add_undo_method(self, "_apply_clear_current", node) + + +# Apply make_current on `cam` with bounded synchronous settling. Registered as the +# do/undo callable by `_add_make_current_to_action`. See that function's +# comment for why the undo path needs the retry inside the action itself. +# Safe against a freed camera node — short-circuits if the node is gone +# or not in the tree. +func _apply_make_current(cam: Node) -> void: + if cam == null or not is_instance_valid(cam) or not cam.is_inside_tree(): + return + _set_logical_current(cam) + var scene_root := EditorInterface.get_edited_scene_root() + var type_str := _camera_type_str(cam) + for attempt in range(_CURRENT_SETTLE_ATTEMPTS): + cam.make_current() + _force_camera_refresh(cam) + # Godot's make_current is supposed to atomically displace siblings, + # but on macOS headless the displaced camera occasionally still + # answers is_current() == true after this returns (#140 / #278 / #301). + # Sweep same-class siblings and clear any that lag. + _force_clear_other_currents(cam, type_str, scene_root) + if not _is_current_settled(cam): + _displace_stale_camera_2d(cam) + _force_clear_other_currents(cam, type_str, scene_root) + var waited_this_attempt := false + if _is_current_settled(cam): + if not (cam is Camera2D): + return + OS.delay_msec(_CURRENT_SETTLE_DELAY_MSEC) + waited_this_attempt = true + _force_camera_refresh(cam) + _force_clear_other_currents(cam, type_str, scene_root) + if _is_current_settled(cam): + return + if attempt < _CURRENT_SETTLE_ATTEMPTS - 1 and not waited_this_attempt: + OS.delay_msec(_CURRENT_SETTLE_DELAY_MSEC) + + +# Walk same-class siblings and force-clear any that still report is_current(). +# Best-effort: clear_current errors when called on a non-current camera, so +# guard. Camera2D's clear_current path also flushes the viewport slot, which +# is the one we actually care about settling for #301. +func _force_clear_other_currents(target: Node, type_str: String, scene_root: Node) -> void: + if scene_root == null or type_str.is_empty(): + return + for sibling in _list_cameras_in_scene(scene_root, type_str): + if sibling == target: + continue + if not is_instance_valid(sibling) or not sibling.is_inside_tree(): + continue + if not _is_current(sibling): + # Even if is_current() reports false, the viewport slot can + # still point at this sibling on macOS — re-make target to + # take it back. Cheap (idempotent) when the slot is fine. + if sibling is Camera2D: + var vp_other: Viewport = (sibling as Camera2D).get_viewport() + if vp_other != null and vp_other.get_camera_2d() == sibling: + target.make_current() + _force_camera_refresh(target) + continue + sibling.clear_current() + if sibling is Camera2D: + (sibling as Camera2D).force_update_scroll() + + +# Call after commit_action() whenever the action registered a make_current DO. +# The undo path cannot use a post-undo hook, so it relies on `_apply_make_current` +# directly; create/configure/apply_preset get this extra post-commit verifier. +func _verify_current_after_commit(node: Node) -> void: + _apply_make_current(node) + + +func _force_camera_refresh(cam: Node) -> void: + if cam is Camera2D: + (cam as Camera2D).force_update_scroll() + + +func _is_current_settled(cam: Node) -> bool: + if not _is_current(cam): + return false + if cam is Camera2D: + var viewport := cam.get_viewport() + if viewport != null and viewport.get_camera_2d() != cam: + return false + return true + + +func _displace_stale_camera_2d(target: Node) -> void: + if not (target is Camera2D): + return + var viewport := target.get_viewport() + if viewport == null: + return + var stale := viewport.get_camera_2d() + if stale == null or stale == target or not is_instance_valid(stale): + _nudge_camera_2d_current(target) + return + var was_enabled := stale.enabled + if was_enabled: + stale.enabled = false + target.make_current() + _force_camera_refresh(target) + if was_enabled: + stale.enabled = true + target.make_current() + _force_camera_refresh(target) + + +func _nudge_camera_2d_current(target: Node) -> void: + if not (target is Camera2D): + return + var cam := target as Camera2D + if not cam.enabled: + return + cam.enabled = false + _force_camera_refresh(cam) + cam.enabled = true + cam.make_current() + _force_camera_refresh(cam) + + +# Symmetric counterpart to `_apply_make_current` for the "no previous +# current camera" branch (create_camera with make_current=true and no +# sibling was current). clear_current errors in Godot if called on a +# non-current camera, so guard on is_current first. +func _apply_clear_current(cam: Node) -> void: + if cam == null or not is_instance_valid(cam) or not cam.is_inside_tree(): + return + _clear_logical_current(cam) + for attempt in range(_CURRENT_SETTLE_ATTEMPTS): + if _is_clear_settled(cam): + return + if _is_current(cam): + cam.clear_current() + _force_camera_refresh(cam) + # Camera2D-only: is_current() may answer false while the viewport + # slot still points at cam. Toggle enabled to force the viewport + # to release, then restore. + if cam is Camera2D: + var vp := cam.get_viewport() + if vp != null and vp.get_camera_2d() == cam: + var was_enabled := (cam as Camera2D).enabled + if was_enabled: + (cam as Camera2D).enabled = false + _force_camera_refresh(cam) + if was_enabled: + (cam as Camera2D).enabled = true + if _is_clear_settled(cam): + return + if attempt < _CURRENT_SETTLE_ATTEMPTS - 1: + OS.delay_msec(_CURRENT_SETTLE_DELAY_MSEC) + + +func _is_clear_settled(cam: Node) -> bool: + if cam == null: + return true + if _is_current(cam): + return false + if cam is Camera2D: + var vp := cam.get_viewport() + if vp != null and vp.get_camera_2d() == cam: + return false + return true + + +# ============================================================================ +# camera_create +# ============================================================================ + +func create_camera(params: Dictionary) -> Dictionary: + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "Camera") + var type_str: String = params.get("type", "2d") + var make_current: bool = bool(params.get("make_current", false)) + + if not _VALID_TYPES.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid camera type '%s'. Valid: %s" % [type_str, ", ".join(_VALID_TYPES.keys())] + ) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var node := _instantiate_camera(type_str) + if node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate camera") + if not node_name.is_empty(): + node.name = node_name + + _undo_redo.create_action( + "MCP: Create %s '%s'" % [_VALID_TYPES[type_str], node.name], + UndoRedo.MERGE_DISABLE, scene_root + ) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + if make_current: + # Must land AFTER add_child: making current before the node is in the + # tree is a silent no-op on the viewport. + _add_make_current_to_action(node, type_str, scene_root) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + if make_current: + _verify_current_after_commit(node) + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": String(node.name), + "type": type_str, + "class": _VALID_TYPES[type_str], + "current": bool(make_current), + "undoable": true, + } + } + + +# ============================================================================ +# camera_configure +# ============================================================================ + +func configure(params: Dictionary) -> Dictionary: + var resolved := _resolve_camera(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var type_str: String = resolved.type + var scene_root: Node = resolved.scene_root + + var properties: Dictionary = params.get("properties", {}) + if properties.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "properties dict is empty") + + var valid_keys: Array = _KEYS_2D if type_str == "2d" else _KEYS_3D + var prop_types := _property_type_map(node) + var coerced: Dictionary = {} + var old_values: Dictionary = {} + # `current` is special-cased via methods (Camera2D doesn't expose it as a property). + var current_request: Variant = null + + for property in properties: + var prop_name: String = String(property) + if not (prop_name in valid_keys): + var msg := "Property '%s' not valid for %s. Valid: %s" % [ + prop_name, _VALID_TYPES[type_str], ", ".join(valid_keys) + ] + if prop_name in _NODE_TRANSFORM_KEYS: + msg += ( + ". Transforms live on the Node, not on the camera config — " + + "use node_set_property(path=%s, property=\"%s\", value=...)" % [node_path, prop_name] + ) + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, msg) + if prop_name == "current": + current_request = bool(properties[prop_name]) + continue + var prop_type: int = prop_types.get(prop_name, TYPE_NIL) + if prop_type == TYPE_NIL: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' not present on %s" % [prop_name, node.get_class()] + ) + var coerce_result := CameraValues.coerce(prop_name, properties[prop_name], prop_type) + if not coerce_result.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + coerced[prop_name] = coerce_result.value + old_values[prop_name] = node.get(prop_name) + + _undo_redo.create_action( + "MCP: Configure camera %s" % node.name, + UndoRedo.MERGE_DISABLE, scene_root + ) + for prop_name in coerced: + _undo_redo.add_do_property(node, prop_name, coerced[prop_name]) + _undo_redo.add_undo_property(node, prop_name, old_values[prop_name]) + var verify_current_after := false + if current_request != null: + var want_on: bool = bool(current_request) + var was_on: bool = _resolve_current(scene_root, node) + if want_on and not was_on: + _add_make_current_to_action(node, type_str, scene_root) + verify_current_after = true + elif not want_on and was_on: + _undo_redo.add_do_method(self, "_apply_clear_current", node) + _undo_redo.add_undo_method(self, "_apply_make_current", node) + _undo_redo.commit_action() + if verify_current_after: + _verify_current_after_commit(node) + + var applied: Array[String] = [] + var serialized: Dictionary = {} + for prop_name in coerced: + applied.append(prop_name) + serialized[prop_name] = CameraValues.serialize(coerced[prop_name]) + if current_request != null: + applied.append("current") + serialized["current"] = bool(current_request) + + return { + "data": { + "path": node_path, + "type": type_str, + "class": node.get_class(), + "applied": applied, + "values": serialized, + "undoable": true, + } + } + + +# ============================================================================ +# camera_set_limits_2d +# ============================================================================ + +func set_limits_2d(params: Dictionary) -> Dictionary: + var resolved := _resolve_camera(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var type_str: String = resolved.type + + if type_str != "2d": + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "camera_set_limits_2d requires a Camera2D (got %s)" % node.get_class() + ) + + var applied: Dictionary = {} + var old_values: Dictionary = {} + var edges := { + "left": "limit_left", + "right": "limit_right", + "top": "limit_top", + "bottom": "limit_bottom", + } + for edge in edges: + var v = params.get(edge) + if v != null: + var prop_name: String = edges[edge] + applied[prop_name] = int(v) + old_values[prop_name] = node.get(prop_name) + + var smoothed = params.get("smoothed") + if smoothed != null: + applied["limit_smoothed"] = bool(smoothed) + old_values["limit_smoothed"] = node.get("limit_smoothed") + + if applied.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "No limits specified; provide at least one of left, right, top, bottom, smoothed" + ) + + _undo_redo.create_action("MCP: Set camera limits on %s" % node.name) + for prop_name in applied: + _undo_redo.add_do_property(node, prop_name, applied[prop_name]) + _undo_redo.add_undo_property(node, prop_name, old_values[prop_name]) + _undo_redo.commit_action() + + var values: Dictionary = {} + for prop_name in applied: + values[prop_name] = applied[prop_name] + + return { + "data": { + "path": node_path, + "applied": applied.keys(), + "values": values, + "undoable": true, + } + } + + +# ============================================================================ +# camera_set_damping_2d +# ============================================================================ + +func set_damping_2d(params: Dictionary) -> Dictionary: + var resolved := _resolve_camera(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var type_str: String = resolved.type + + if type_str != "2d": + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "camera_set_damping_2d requires a Camera2D (got %s)" % node.get_class() + ) + + var applied: Dictionary = {} + var old_values: Dictionary = {} + + # position_speed: set position_smoothing_speed AND toggle position_smoothing_enabled. + var pos_v = params.get("position_speed") + if pos_v != null: + var pos_speed := float(pos_v) + var pos_enable := pos_speed > 0.0 + applied["position_smoothing_enabled"] = pos_enable + old_values["position_smoothing_enabled"] = node.get("position_smoothing_enabled") + if pos_enable: + applied["position_smoothing_speed"] = pos_speed + old_values["position_smoothing_speed"] = node.get("position_smoothing_speed") + + # rotation_speed: same pattern for rotation_smoothing_*. + var rot_v = params.get("rotation_speed") + if rot_v != null: + var rot_speed := float(rot_v) + var rot_enable := rot_speed > 0.0 + applied["rotation_smoothing_enabled"] = rot_enable + old_values["rotation_smoothing_enabled"] = node.get("rotation_smoothing_enabled") + if rot_enable: + applied["rotation_smoothing_speed"] = rot_speed + old_values["rotation_smoothing_speed"] = node.get("rotation_smoothing_speed") + + for flag in ["drag_horizontal_enabled", "drag_vertical_enabled"]: + var flag_v = params.get(flag) + if flag_v != null: + applied[flag] = bool(flag_v) + old_values[flag] = node.get(flag) + + # drag_margins: dict {left, top, right, bottom} floats in [0,1]; null/missing keys untouched. + var margins_v = params.get("drag_margins") + if margins_v != null: + if not (margins_v is Dictionary): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "drag_margins must be a dict with optional keys left/top/right/bottom" + ) + var margins: Dictionary = margins_v + for edge in _DAMPING_MARGIN_KEYS: + var margin_v = margins.get(edge) + if margin_v == null: + continue + var v := float(margin_v) + if v < 0.0 or v > 1.0: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "drag_margins.%s must be in [0, 1] (got %s)" % [edge, v] + ) + var prop_name: String = "drag_%s_margin" % edge + applied[prop_name] = v + old_values[prop_name] = node.get(prop_name) + + if applied.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "No damping params specified; provide at least one of position_speed, rotation_speed, drag_margins, drag_horizontal_enabled, drag_vertical_enabled" + ) + + _undo_redo.create_action("MCP: Set camera damping on %s" % node.name) + for prop_name in applied: + _undo_redo.add_do_property(node, prop_name, applied[prop_name]) + _undo_redo.add_undo_property(node, prop_name, old_values[prop_name]) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "applied": applied.keys(), + "values": applied, + "undoable": true, + } + } + + +# ============================================================================ +# camera_follow_2d +# ============================================================================ + +func follow_2d(params: Dictionary) -> Dictionary: + var resolved := _resolve_camera(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var type_str: String = resolved.type + var scene_root: Node = resolved.scene_root + + if type_str != "2d": + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "camera_follow_2d requires a Camera2D (got %s)" % node.get_class() + ) + + var target_path: String = params.get("target_path", "") + if target_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: target_path") + var target := McpScenePath.resolve(target_path, scene_root) + if target == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, + "target_path: %s" % McpScenePath.format_node_error(target_path, scene_root)) + if not (target is Node2D) and target != scene_root: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Follow target must be a Node2D (got %s)" % target.get_class() + ) + if target == node: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Camera cannot follow itself") + if target.is_ancestor_of(node) and node.get_parent() != target: + # A non-parent ancestor — still valid to reparent under (direct parent). + pass + if node.is_ancestor_of(target): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Cannot follow a descendant of the camera" + ) + + var smoothing_speed := float(params.get("smoothing_speed", 5.0)) + var zero_transform: bool = bool(params.get("zero_transform", true)) + + var old_parent := node.get_parent() + var old_idx: int = node.get_index() if old_parent != null else 0 + var old_position = node.get("position") + var old_rotation = node.get("rotation") + var old_smoothing_enabled: bool = bool(node.get("position_smoothing_enabled")) + var old_smoothing_speed: float = float(node.get("position_smoothing_speed")) + + var already_child: bool = old_parent == target + var reparented: bool = not already_child + + _undo_redo.create_action("MCP: Camera follow %s" % target.name) + if reparented: + _undo_redo.add_do_method(old_parent, "remove_child", node) + _undo_redo.add_do_method(target, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + if zero_transform: + if target is Node2D: + _undo_redo.add_do_property(node, "position", Vector2.ZERO) + _undo_redo.add_undo_property(node, "position", old_position) + _undo_redo.add_do_property(node, "rotation", 0.0) + _undo_redo.add_undo_property(node, "rotation", old_rotation) + _undo_redo.add_do_property(node, "position_smoothing_enabled", true) + _undo_redo.add_undo_property(node, "position_smoothing_enabled", old_smoothing_enabled) + if smoothing_speed > 0.0: + _undo_redo.add_do_property(node, "position_smoothing_speed", smoothing_speed) + _undo_redo.add_undo_property(node, "position_smoothing_speed", old_smoothing_speed) + if reparented: + _undo_redo.add_undo_method(target, "remove_child", node) + _undo_redo.add_undo_method(old_parent, "add_child", node, true) + _undo_redo.add_undo_method(old_parent, "move_child", node, old_idx) + _undo_redo.add_undo_method(node, "set_owner", scene_root) + _undo_redo.add_undo_reference(node) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "target_path": McpScenePath.from_node(target, scene_root), + "reparented": reparented, + "smoothing_speed": smoothing_speed, + "zero_transform": zero_transform and (target is Node2D), + "undoable": true, + } + } + + +# ============================================================================ +# camera_get +# ============================================================================ + +func get_camera(params: Dictionary) -> Dictionary: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var camera_path: String = params.get("camera_path", "") + var node: Node = null + var resolved_via: String = "" + if camera_path.is_empty(): + # Empty: prefer the viewport's active camera. In headless editor CI, + # Camera2D.is_current() can lag make_current() briefly even after the + # viewport slot has switched; falling through to "first" during that + # window makes camera_get("") nondeterministic. + var all_cams := _list_cameras_in_scene(scene_root, "") + var logical_current := _logical_current_camera(scene_root) + if logical_current != null and all_cams.has(logical_current): + node = logical_current + resolved_via = "current" + var viewport_current := _viewport_current_camera(scene_root) + if node == null and viewport_current != null and all_cams.has(viewport_current): + node = viewport_current + resolved_via = "current" + for cam in all_cams: + if node != null: + break + if _is_current(cam): + node = cam + resolved_via = "current" + break + if node == null and not all_cams.is_empty(): + node = all_cams[0] + resolved_via = "first" + else: + node = McpScenePath.resolve(camera_path, scene_root) + if node == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_node_error(camera_path, scene_root)) + if not _is_camera(node): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a camera (got %s)" % [camera_path, node.get_class()] + ) + resolved_via = "path" + + if node == null: + return { + "data": { + "path": "", + "type": "", + "class": "", + "current": false, + "properties": {}, + "resolved_via": "not_found", + } + } + + var type_str := _camera_type_str(node) + var keys: Array = _KEYS_2D if type_str == "2d" else _KEYS_3D + var prop_types := _property_type_map(node) + var props: Dictionary = {} + var is_current_effective := _resolve_current(scene_root, node) + for key in keys: + if key == "current": + props[key] = is_current_effective + continue + if prop_types.has(key): + props[key] = CameraValues.serialize(node.get(key)) + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "type": type_str, + "class": node.get_class(), + "current": is_current_effective, + "properties": props, + "resolved_via": resolved_via, + } + } + + +# ============================================================================ +# camera_list +# ============================================================================ + +func list_cameras(_params: Dictionary) -> Dictionary: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var cams := _list_cameras_in_scene(scene_root, "") + var out: Array[Dictionary] = [] + var logical_2d := _logical_current_camera(scene_root, "2d") + var logical_3d := _logical_current_camera(scene_root, "3d") + for cam in cams: + out.append({ + "path": McpScenePath.from_node(cam, scene_root), + "class": cam.get_class(), + "type": _camera_type_str(cam), + "current": _resolve_current_with_logicals(cam, logical_2d, logical_3d), + }) + return {"data": {"cameras": out}} + + +# ============================================================================ +# camera_apply_preset +# ============================================================================ + +func apply_preset(params: Dictionary) -> Dictionary: + var preset_name: String = params.get("preset", "") + if preset_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: preset") + + var overrides: Dictionary = params.get("overrides", {}) + var blueprint = CameraPresets.build(preset_name, overrides) + if blueprint == null: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown preset '%s'. Valid: %s" % [preset_name, ", ".join(CameraPresets.list_presets())] + ) + + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "") + var type_str: String = params.get("type", String(blueprint.get("default_type", "2d"))) + var make_current: bool = bool(params.get("make_current", true)) + if node_name.is_empty(): + node_name = preset_name.capitalize() + if not _VALID_TYPES.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid camera type '%s'. Valid: %s" % [type_str, ", ".join(_VALID_TYPES.keys())] + ) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var node := _instantiate_camera(type_str) + node.name = node_name + + var preset_props: Dictionary = blueprint.get("properties", {}) + var valid_keys: Array = _KEYS_2D if type_str == "2d" else _KEYS_3D + var prop_types := _property_type_map(node) + var applied: Array[String] = [] + for prop in preset_props: + var prop_name := String(prop) + if not (prop_name in valid_keys): + continue # Silently skip preset keys that don't apply to this camera class. + # `current` lives on methods, not as a writable property on Camera2D — + # always handled via the make_current path below. + if prop_name == "current": + continue + var prop_type: int = prop_types.get(prop_name, TYPE_NIL) + if prop_type == TYPE_NIL: + continue + var coerce_result := CameraValues.coerce(prop_name, preset_props[prop_name], prop_type) + if not coerce_result.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + node.set(prop_name, coerce_result.value) + applied.append(prop_name) + + _undo_redo.create_action( + "MCP: Apply camera preset %s" % preset_name, + UndoRedo.MERGE_DISABLE, scene_root + ) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + if make_current: + _add_make_current_to_action(node, type_str, scene_root) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + if make_current: + _verify_current_after_commit(node) + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": node_name, + "preset": preset_name, + "type": type_str, + "class": _VALID_TYPES[type_str], + "applied": applied, + "current": bool(make_current), + "undoable": true, + } + } + + +# ============================================================================ +# Helpers +# ============================================================================ + +static func _instantiate_camera(type_str: String) -> Node: + match type_str: + "2d": + return Camera2D.new() + "3d": + return Camera3D.new() + return null + + +static func _is_camera(node: Node) -> bool: + return node is Camera2D or node is Camera3D + + +static func _camera_type_str(node: Node) -> String: + if node is Camera2D: + return "2d" + if node is Camera3D: + return "3d" + return "" + + +func _resolve_camera(params: Dictionary) -> Dictionary: + var resolved := McpNodeValidator.resolve_or_error( + params.get("camera_path", ""), "camera_path", + ) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + if not _is_camera(node): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a camera (got %s)" % [node_path, node.get_class()] + ) + return { + "node": node, + "path": node_path, + "type": _camera_type_str(node), + "scene_root": scene_root, + } + + +## Walk the edited scene for cameras. class_filter: "2d", "3d", or "" for all. +static func _list_cameras_in_scene(scene_root: Node, class_filter: String) -> Array: + var result: Array = [] + if scene_root == null: + return result + _collect_cameras(scene_root, class_filter, result) + return result + + +static func _collect_cameras(node: Node, class_filter: String, out: Array) -> void: + var matches := false + match class_filter: + "2d": + matches = node is Camera2D + "3d": + matches = node is Camera3D + _: + matches = node is Camera2D or node is Camera3D + if matches: + out.append(node) + for child in node.get_children(): + _collect_cameras(child, class_filter, out) + + +## Build a name -> property-type dict from the object's property list. +## Single walk of get_property_list() amortizes lookups across a batch of +## properties in configure / apply_preset. +static func _property_type_map(obj: Object) -> Dictionary: + var out: Dictionary = {} + if obj == null: + return out + for prop in obj.get_property_list(): + out[prop.name] = int(prop.get("type", TYPE_NIL)) + return out diff --git a/addons/godot_ai/handlers/camera_handler.gd.uid b/addons/godot_ai/handlers/camera_handler.gd.uid new file mode 100644 index 0000000..86d2aae --- /dev/null +++ b/addons/godot_ai/handlers/camera_handler.gd.uid @@ -0,0 +1 @@ +uid://c0lcviccrlrl8 diff --git a/addons/godot_ai/handlers/camera_presets.gd b/addons/godot_ai/handlers/camera_presets.gd new file mode 100644 index 0000000..a1922c2 --- /dev/null +++ b/addons/godot_ai/handlers/camera_presets.gd @@ -0,0 +1,81 @@ +@tool +extends RefCounted + +## Opinionated Camera2D / Camera3D presets. +## +## build(preset_name, overrides) -> {default_type, properties} | null +## properties are merged with caller overrides (overrides win). + + +const _PRESETS := { + # Top-down roguelite / arena — damped follow feel, drag deadzone. + "topdown_2d": { + "default_type": "2d", + "properties": { + "zoom": {"x": 2.0, "y": 2.0}, + "anchor_mode": "drag_center", + "position_smoothing_enabled": true, + "position_smoothing_speed": 5.0, + "rotation_smoothing_enabled": false, + "drag_horizontal_enabled": true, + "drag_vertical_enabled": true, + "drag_left_margin": 0.2, + "drag_right_margin": 0.2, + "drag_top_margin": 0.2, + "drag_bottom_margin": 0.2, + }, + }, + # Platformer — tight horizontal follow, vertical snap with smoothing on. + "platformer_2d": { + "default_type": "2d", + "properties": { + "zoom": {"x": 1.5, "y": 1.5}, + "anchor_mode": "drag_center", + "position_smoothing_enabled": true, + "position_smoothing_speed": 8.0, + "drag_horizontal_enabled": true, + "drag_vertical_enabled": false, + "drag_left_margin": 0.15, + "drag_right_margin": 0.15, + }, + }, + # Cinematic 3D — narrow FOV, long range. Good for dramatic wide shots. + "cinematic_3d": { + "default_type": "3d", + "properties": { + "fov": 40.0, + "near": 0.1, + "far": 500.0, + "projection": "perspective", + }, + }, + # Action 3D — wider FOV for first/third-person action gameplay. + "action_3d": { + "default_type": "3d", + "properties": { + "fov": 70.0, + "near": 0.1, + "far": 200.0, + "projection": "perspective", + }, + }, +} + + +static func list_presets() -> Array: + return _PRESETS.keys() + + +## Build a preset blueprint. Returns null if preset_name is unknown. +## overrides is merged on top of preset defaults (caller values win). +static func build(preset_name: String, overrides: Dictionary) -> Variant: + if not _PRESETS.has(preset_name): + return null + var preset: Dictionary = _PRESETS[preset_name] + var properties: Dictionary = (preset.get("properties", {}) as Dictionary).duplicate(true) + for key in overrides: + properties[key] = overrides[key] + return { + "default_type": preset.get("default_type", "2d"), + "properties": properties, + } diff --git a/addons/godot_ai/handlers/camera_presets.gd.uid b/addons/godot_ai/handlers/camera_presets.gd.uid new file mode 100644 index 0000000..9f9f839 --- /dev/null +++ b/addons/godot_ai/handlers/camera_presets.gd.uid @@ -0,0 +1 @@ +uid://bl3rfy72o3wy5 diff --git a/addons/godot_ai/handlers/camera_values.gd b/addons/godot_ai/handlers/camera_values.gd new file mode 100644 index 0000000..e3c8dea --- /dev/null +++ b/addons/godot_ai/handlers/camera_values.gd @@ -0,0 +1,132 @@ +@tool +extends RefCounted + +## Value coercion helpers for camera authoring. +## +## Handles: +## - enum-by-name (keep_aspect="keep_height" -> Camera3D.KEEP_HEIGHT) +## - {x, y} dict -> Vector2 (zoom, offset, drag_*_offset) +## - serialization back to JSON-friendly shapes + + +const _ENUM_TABLES := { + "projection": { + "perspective": Camera3D.PROJECTION_PERSPECTIVE, + "orthogonal": Camera3D.PROJECTION_ORTHOGONAL, + "frustum": Camera3D.PROJECTION_FRUSTUM, + }, + "keep_aspect": { + "keep_width": Camera3D.KEEP_WIDTH, + "keep_height": Camera3D.KEEP_HEIGHT, + }, + "anchor_mode": { + "fixed_top_left": Camera2D.ANCHOR_MODE_FIXED_TOP_LEFT, + "drag_center": Camera2D.ANCHOR_MODE_DRAG_CENTER, + }, + "doppler_tracking": { + "disabled": Camera3D.DOPPLER_TRACKING_DISABLED, + "idle_step": Camera3D.DOPPLER_TRACKING_IDLE_STEP, + "physics_step": Camera3D.DOPPLER_TRACKING_PHYSICS_STEP, + }, + "process_callback": { + "physics": Camera2D.CAMERA2D_PROCESS_PHYSICS, + "idle": Camera2D.CAMERA2D_PROCESS_IDLE, + }, +} + + +## Return the enum int for (property, string_name), or null if not a known enum string. +static func resolve_enum(property: String, value: Variant) -> Variant: + if not (value is String): + return null + if not _ENUM_TABLES.has(property): + return null + var table: Dictionary = _ENUM_TABLES[property] + var key: String = String(value).to_lower() + if table.has(key): + return table[key] + return null + + +## Valid enum names for a property, for error messages. +static func enum_keys(property: String) -> Array: + if not _ENUM_TABLES.has(property): + return [] + return (_ENUM_TABLES[property] as Dictionary).keys() + + +static func parse_vector2(value: Variant) -> Variant: + ## Camera-specific sugar kept from the pre-#714 copy: a bare number is + ## a uniform zoom, splatted to both axes. Everything else goes through + ## the canonical strict parser. + if value is int or value is float: + return Vector2(float(value), float(value)) + return McpJsonValues.parse_vector2(value) + + +static func parse_vector3(value: Variant) -> Variant: + return McpJsonValues.parse_vector3(value) + + +## Coerce a JSON-shaped value for a camera property against the declared type. +## Returns {ok: true, value: ...} or {ok: false, error: "..."}. +static func coerce(property: String, value: Variant, target_type: int) -> Dictionary: + # Enum-by-name: must match before generic TYPE_INT coercion. + if _ENUM_TABLES.has(property): + if value is String: + var enum_val = resolve_enum(property, value) + if enum_val == null: + return { + "ok": false, + "error": "Invalid %s value: '%s'. Valid: %s" % [ + property, value, ", ".join(enum_keys(property)) + ], + } + return {"ok": true, "value": int(enum_val)} + if value is int or value is float: + return {"ok": true, "value": int(value)} + + match target_type: + TYPE_VECTOR2: + var v2 = parse_vector2(value) + if v2 == null: + return {"ok": false, "error": "Invalid vector2 for %s: %s" % [property, value]} + return {"ok": true, "value": v2} + TYPE_VECTOR3: + var v3 = parse_vector3(value) + if v3 == null: + return {"ok": false, "error": "Invalid vector3 for %s: %s" % [property, value]} + return {"ok": true, "value": v3} + TYPE_BOOL: + if value is bool: + return {"ok": true, "value": value} + if value is int or value is float: + return {"ok": true, "value": bool(value)} + return {"ok": false, "error": "Expected bool for %s" % property} + TYPE_INT: + if value is int: + return {"ok": true, "value": value} + if value is float: + return {"ok": true, "value": int(value)} + return {"ok": false, "error": "Expected int for %s" % property} + TYPE_FLOAT: + if value is float: + return {"ok": true, "value": value} + if value is int: + return {"ok": true, "value": float(value)} + return {"ok": false, "error": "Expected number for %s" % property} + TYPE_STRING: + return {"ok": true, "value": String(value)} + + return {"ok": true, "value": value} + + +## Serialize a Variant into a JSON-friendly shape for responses. +static func serialize(value: Variant) -> Variant: + if value == null: + return null + if value is Vector2: + return {"x": value.x, "y": value.y} + if value is Vector3: + return {"x": value.x, "y": value.y, "z": value.z} + return value diff --git a/addons/godot_ai/handlers/camera_values.gd.uid b/addons/godot_ai/handlers/camera_values.gd.uid new file mode 100644 index 0000000..45e3c09 --- /dev/null +++ b/addons/godot_ai/handlers/camera_values.gd.uid @@ -0,0 +1 @@ +uid://bgjnubgnv6ses diff --git a/addons/godot_ai/handlers/client_handler.gd b/addons/godot_ai/handlers/client_handler.gd new file mode 100644 index 0000000..40e019f --- /dev/null +++ b/addons/godot_ai/handlers/client_handler.gd @@ -0,0 +1,127 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles MCP client configuration commands. + +var _connection +var _fallback_launch_context := {} +var _status_workers: Array[Thread] = [] +var _status_tearing_down := false + + +func _init(connection = null, fallback_launch_context = null) -> void: + _connection = connection + # Lazy-loading this handler can reload ClientConfigurator's static script and + # clear its warmed snapshot. Retain the plugin-start capture as a safe + # fallback; the worker still prefers capture_launch_context()'s live snapshot. + if fallback_launch_context is Dictionary: + _fallback_launch_context = fallback_launch_context.duplicate(true) + + +func configure_client(params: Dictionary) -> Dictionary: + var client_id: String = params.get("client", "") + if not McpClientConfigurator.has_client(client_id): + var valid := ", ".join(McpClientConfigurator.client_ids()) + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown client: %s. Use one of: %s" % [client_id, valid]) + var result := McpClientConfigurator.configure(client_id) + if result.get("status") == "error": + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + result.get("message", "Configuration failed for '%s'" % client_id)) + return {"data": result} + + +func remove_client(params: Dictionary) -> Dictionary: + var client_id: String = params.get("client", "") + if not McpClientConfigurator.has_client(client_id): + var valid := ", ".join(McpClientConfigurator.client_ids()) + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown client: %s. Use one of: %s" % [client_id, valid]) + var result := McpClientConfigurator.remove(client_id) + if result.get("status") == "error": + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + result.get("message", "Removal failed for '%s'" % client_id)) + return {"data": result} + + +func check_client_status(params: Dictionary) -> Dictionary: + var request_id: String = params.get("_request_id", "") + if _connection == null or request_id.is_empty(): + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Client status requires a deferred request context.", + ) + if _status_tearing_down: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Client status handler is shutting down.") + # Match the dock refresh worker's cold-load guard. This is pure-memory and + # performs no launcher discovery, CLI lookup, or config/status probe. + McpClientConfigurator.warm_status_worker_bytecode() + # Refresh cwd/project roots on main before the status worker starts while + # preserving the startup launch snapshot for the deferred worker. + var status_context := _fallback_launch_context.duplicate(true) + status_context["project_roots"] = McpClientConfigurator.capture_project_roots() + # The aggregate command has a 30-second budget. Its worker resolves the + # shared Claude Desktop/Codex attach launch once, then reuses it for every + # command-shaped client instead of repeating cold launcher discovery. + # Start the worker from the deferred finisher after its first frame. That + # lets the dispatcher register this request before any probe can complete. + _finish_client_status_deferred( + McpClientConfigurator.run_client_status_sweep.bind(status_context), + request_id, + _connection, + ) + return McpDispatcher.DEFERRED_RESPONSE + + +## Called by McpDispatcher.clear() before releasing this lazy handler. Marking +## teardown is deliberately non-blocking: the in-flight coroutine retains this +## handler and its connection across frames, then joins each worker only after +## is_alive() becomes false. New sweeps are rejected immediately. +func prepare_for_teardown() -> void: + _status_tearing_down = true + + +## This instance coroutine intentionally keeps the lazily-created handler and +## deferred-response connection alive until its worker has been polled and +## joined. The first-frame yield is load-bearing: check_client_status() must +## return the deferred sentinel before the worker can produce a response. +func _finish_client_status_deferred( + worker_callable: Callable, request_id: String, connection +) -> void: + if not is_instance_valid(connection): + return + var tree: SceneTree = connection.get_tree() + if tree == null: + return + await tree.process_frame + if not is_instance_valid(connection) or _status_tearing_down: + return + var worker := Thread.new() + _status_workers.append(worker) + var start_error := worker.start(worker_callable) + if start_error != OK: + _status_workers.erase(worker) + connection.send_deferred_response(request_id, ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Could not start client status worker (error %d)." % start_error, + )) + return + while worker.is_alive(): + await tree.process_frame + var payload: Variant = worker.wait_to_finish() + _status_workers.erase(worker) + if _status_tearing_down: + return + if not is_instance_valid(connection): + return + if not payload is Dictionary: + payload = ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Client status worker returned an invalid response.", + ) + elif payload.has("worker_error"): + payload = ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + str(payload.get("worker_error", "Client status worker failed.")), + ) + connection.send_deferred_response(request_id, payload) diff --git a/addons/godot_ai/handlers/client_handler.gd.uid b/addons/godot_ai/handlers/client_handler.gd.uid new file mode 100644 index 0000000..25687f5 --- /dev/null +++ b/addons/godot_ai/handlers/client_handler.gd.uid @@ -0,0 +1 @@ +uid://bmo4foc5fq75c diff --git a/addons/godot_ai/handlers/control_draw_recipe_handler.gd b/addons/godot_ai/handlers/control_draw_recipe_handler.gd new file mode 100644 index 0000000..29e65be --- /dev/null +++ b/addons/godot_ai/handlers/control_draw_recipe_handler.gd @@ -0,0 +1,318 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles the control_draw_recipe MCP command. Attaches a shared DrawRecipe +## script to a Control and stores the caller's ordered draw ops in node +## metadata under "_ops". The DrawRecipe script dispatches each op to a +## CanvasItem draw_* call in _draw(). One Ctrl+Z reverts script + meta as a +## single undo step. + +const DRAW_RECIPE_SCRIPT := preload("res://addons/godot_ai/runtime/draw_recipe.gd") +const UiHandler := preload("res://addons/godot_ai/handlers/ui_handler.gd") + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +func control_draw_recipe(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var ops_raw: Variant = params.get("ops", null) + var clear_existing: bool = bool(params.get("clear_existing", true)) + + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + if typeof(ops_raw) != TYPE_ARRAY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "ops must be an Array") + + var _resolved := McpNodeValidator.resolve_or_error(path, "path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var scene_root: Node = _resolved.scene_root + if not node is Control: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "control_draw_recipe requires a Control node, got %s" % node.get_class() + ) + + var coerced := _coerce_ops(ops_raw) + if coerced.has("error"): + return coerced + var coerced_ops: Array = coerced.ops + + var old_script: Variant = node.get_script() + if old_script != null and old_script != DRAW_RECIPE_SCRIPT: + if not clear_existing: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + ( + "Node %s already has a script. Pass clear_existing=true to replace." + % path + ) + ) + + var had_meta := node.has_meta("_ops") + var old_ops: Variant = node.get_meta("_ops") if had_meta else null + + _undo_redo.create_action("MCP: Draw recipe on %s" % node.name) + _undo_redo.add_do_method(node, "set_script", DRAW_RECIPE_SCRIPT) + _undo_redo.add_do_method(node, "set_meta", "_ops", coerced_ops) + _undo_redo.add_do_method(node, "queue_redraw") + _undo_redo.add_undo_method(node, "set_script", old_script) + if had_meta: + _undo_redo.add_undo_method(node, "set_meta", "_ops", old_ops) + else: + _undo_redo.add_undo_method(node, "remove_meta", "_ops") + _undo_redo.add_undo_method(node, "queue_redraw") + _undo_redo.commit_action() + + return { + "data": + { + "path": McpScenePath.from_node(node, scene_root), + "ops_count": coerced_ops.size(), + "script_attached": old_script == null, + "script_replaced": old_script != null and old_script != DRAW_RECIPE_SCRIPT, + "undoable": true, + } + } + + + +## Validate and coerce every op dict. Returns {"ops": Array} or an error dict. +func _coerce_ops(ops: Array) -> Dictionary: + var result: Array = [] + for i in ops.size(): + var op: Variant = ops[i] + if typeof(op) != TYPE_DICTIONARY: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, "ops[%d] must be a dictionary" % i + ) + var coerced := _coerce_single_op(op, i) + if coerced.has("error"): + return coerced + result.append(coerced.op) + return {"ops": result} + + +func _coerce_single_op(op: Dictionary, idx: int) -> Dictionary: + var draw_type: String = op.get("draw", "") + if draw_type.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, "ops[%d]: missing 'draw' field" % idx + ) + match draw_type: + "line": + return _coerce_line(op, idx) + "rect": + return _coerce_rect(op, idx) + "arc": + return _coerce_arc(op, idx) + "circle": + return _coerce_circle(op, idx) + "polyline": + return _coerce_polyline_or_polygon(op, idx, "polyline") + "polygon": + return _coerce_polyline_or_polygon(op, idx, "polygon") + "string": + return _coerce_string(op, idx) + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "ops[%d]: unknown draw type '%s'" % [idx, draw_type] + ) + + +func _require_fields(op: Dictionary, idx: int, kind: String, fields: Array) -> Dictionary: + for f in fields: + if not op.has(f): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "ops[%d] (%s): missing '%s'" % [idx, kind, f] + ) + return {} + + +func _coerce_typed(value: Variant, prop_type: int, idx: int, kind: String, field: String) -> Dictionary: + var r := UiHandler._coerce_for_type(value, prop_type) + if r.ok: + return {"ok": true, "value": r.value} + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, "ops[%d] (%s): invalid '%s'" % [idx, kind, field] + ) + + +func _coerce_line(op: Dictionary, idx: int) -> Dictionary: + var missing := _require_fields(op, idx, "line", ["from", "to", "color"]) + if missing.has("error"): + return missing + var frm := _coerce_typed(op.from, TYPE_VECTOR2, idx, "line", "from") + if frm.has("error"): + return frm + var to_ := _coerce_typed(op.to, TYPE_VECTOR2, idx, "line", "to") + if to_.has("error"): + return to_ + var c := _coerce_typed(op.color, TYPE_COLOR, idx, "line", "color") + if c.has("error"): + return c + var out := {"draw": "line", "from": frm.value, "to": to_.value, "color": c.value} + if op.has("width"): + out["width"] = float(op.width) + if op.has("antialiased"): + out["antialiased"] = bool(op.antialiased) + return {"op": out} + + +func _coerce_rect(op: Dictionary, idx: int) -> Dictionary: + var missing := _require_fields(op, idx, "rect", ["rect", "color"]) + if missing.has("error"): + return missing + var r := _coerce_typed(op.rect, TYPE_RECT2, idx, "rect", "rect") + if r.has("error"): + return r + var c := _coerce_typed(op.color, TYPE_COLOR, idx, "rect", "color") + if c.has("error"): + return c + var out := {"draw": "rect", "rect": r.value, "color": c.value} + if op.has("filled"): + out["filled"] = bool(op.filled) + if op.has("width"): + out["width"] = float(op.width) + return {"op": out} + + +func _coerce_arc(op: Dictionary, idx: int) -> Dictionary: + var missing := _require_fields( + op, idx, "arc", ["center", "radius", "start_angle", "end_angle", "color"] + ) + if missing.has("error"): + return missing + var center := _coerce_typed(op.center, TYPE_VECTOR2, idx, "arc", "center") + if center.has("error"): + return center + var c := _coerce_typed(op.color, TYPE_COLOR, idx, "arc", "color") + if c.has("error"): + return c + var out := { + "draw": "arc", + "center": center.value, + "radius": float(op.radius), + "start_angle": float(op.start_angle), + "end_angle": float(op.end_angle), + "color": c.value, + } + if op.has("point_count"): + out["point_count"] = int(op.point_count) + if op.has("width"): + out["width"] = float(op.width) + if op.has("antialiased"): + out["antialiased"] = bool(op.antialiased) + return {"op": out} + + +func _coerce_circle(op: Dictionary, idx: int) -> Dictionary: + var missing := _require_fields(op, idx, "circle", ["center", "radius", "color"]) + if missing.has("error"): + return missing + var center := _coerce_typed(op.center, TYPE_VECTOR2, idx, "circle", "center") + if center.has("error"): + return center + var c := _coerce_typed(op.color, TYPE_COLOR, idx, "circle", "color") + if c.has("error"): + return c + return { + "op": + { + "draw": "circle", + "center": center.value, + "radius": float(op.radius), + "color": c.value, + } + } + + +func _coerce_polyline_or_polygon(op: Dictionary, idx: int, kind: String) -> Dictionary: + if not op.has("points"): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, "ops[%d] (%s): missing 'points'" % [idx, kind] + ) + if typeof(op.points) != TYPE_ARRAY: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "ops[%d] (%s): 'points' must be an Array" % [idx, kind] + ) + var points := PackedVector2Array() + for j in op.points.size(): + var p := UiHandler._coerce_for_type(op.points[j], TYPE_VECTOR2) + if not p.ok: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "ops[%d] (%s): points[%d] invalid" % [idx, kind, j] + ) + points.append(p.value) + + var out := {"draw": kind, "points": points} + + if op.has("colors"): + if typeof(op.colors) != TYPE_ARRAY: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "ops[%d] (%s): 'colors' must be an Array" % [idx, kind] + ) + var colors := PackedColorArray() + for k in op.colors.size(): + var ck := UiHandler._coerce_for_type(op.colors[k], TYPE_COLOR) + if not ck.ok: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "ops[%d] (%s): colors[%d] invalid" % [idx, kind, k] + ) + colors.append(ck.value) + out["colors"] = colors + elif op.has("color"): + var c := UiHandler._coerce_for_type(op.color, TYPE_COLOR) + if not c.ok: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, "ops[%d] (%s): invalid 'color'" % [idx, kind] + ) + out["color"] = c.value + else: + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "ops[%d] (%s): missing 'color' or 'colors'" % [idx, kind] + ) + + if op.has("width"): + out["width"] = float(op.width) + if op.has("antialiased"): + out["antialiased"] = bool(op.antialiased) + return {"op": out} + + +func _coerce_string(op: Dictionary, idx: int) -> Dictionary: + var missing := _require_fields(op, idx, "string", ["position", "text", "color"]) + if missing.has("error"): + return missing + var pos := _coerce_typed(op.position, TYPE_VECTOR2, idx, "string", "position") + if pos.has("error"): + return pos + var c := _coerce_typed(op.color, TYPE_COLOR, idx, "string", "color") + if c.has("error"): + return c + var out := { + "draw": "string", + "position": pos.value, + "text": str(op.text), + "color": c.value, + } + if op.has("font_size"): + out["font_size"] = int(op.font_size) + if op.has("align"): + out["align"] = int(op.align) + if op.has("max_width"): + out["max_width"] = float(op.max_width) + return {"op": out} diff --git a/addons/godot_ai/handlers/control_draw_recipe_handler.gd.uid b/addons/godot_ai/handlers/control_draw_recipe_handler.gd.uid new file mode 100644 index 0000000..da0aaf9 --- /dev/null +++ b/addons/godot_ai/handlers/control_draw_recipe_handler.gd.uid @@ -0,0 +1 @@ +uid://buat1mt0fjlqb diff --git a/addons/godot_ai/handlers/csg_handler.gd b/addons/godot_ai/handlers/csg_handler.gd new file mode 100644 index 0000000..6380a9a --- /dev/null +++ b/addons/godot_ai/handlers/csg_handler.gd @@ -0,0 +1,118 @@ +@tool +extends RefCounted + +## CSG authoring — create CSG shapes (box, sphere, cylinder, torus, prism) +## and set their boolean operation (union / intersection / subtraction) so +## agents can carve geometry (holes, caves, tunnels) directly in the editor. +## +## All ops target nodes in the currently edited scene by scene-relative +## path. All write ops are undoable via EditorUndoRedoManager. Sibling CSG +## shapes under the same parent combine automatically; use a CSGCombiner3D +## parent when you need explicit grouping. + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +const SHAPES := { + "box": "CSGBox3D", + "sphere": "CSGSphere3D", + "cylinder": "CSGCylinder3D", + "torus": "CSGTorus3D", + "polygon": "CSGPolygon3D", +} + +const OPERATIONS := { + "union": CSGShape3D.OPERATION_UNION, + "intersection": CSGShape3D.OPERATION_INTERSECTION, + "subtraction": CSGShape3D.OPERATION_SUBTRACTION, +} + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +## Create a CSG shape under a Node3D parent. +## params: {parent_path, name="", shape="box", operation="union"} +## Returns: {path, name, shape, operation, undoable} +func create(params: Dictionary) -> Dictionary: + var parent_path: String = params.get("parent_path", "") + var shape: String = params.get("shape", "box") + var operation: String = params.get("operation", "union") + var scene_file: String = params.get("scene_file", "") + + var shape_class: String = SHAPES.get(shape, "") + if shape_class.is_empty(): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown shape: %s. Valid shapes: %s" % [shape, ", ".join(SHAPES.keys())]) + if not OPERATIONS.has(operation): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown operation: %s. Valid operations: %s" % [operation, ", ".join(OPERATIONS.keys())]) + + var scene_check := McpScenePath.require_edited_scene(scene_file) + if scene_check.has("error"): + return scene_check + var scene_root: Node = scene_check.node + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, + McpScenePath.format_parent_error(parent_path, scene_root)) + if not parent is Node3D: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "CSG parent must be a Node3D (got %s)" % parent.get_class()) + + var node: CSGShape3D = ClassDB.instantiate(shape_class) + if node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % shape_class) + var node_name: String = params.get("name", "") + if node_name.is_empty(): + node_name = shape_class + node.name = node_name + node.operation = OPERATIONS[operation] + + _undo_redo.create_action("MCP: Create %s" % node.name) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + + return {"data": { + "path": McpScenePath.from_node(node, scene_root), + "name": node.name, + "shape": shape, + "operation": operation, + "undoable": true, + }} + + +## Set the boolean operation of a CSG shape. +## params: {path, operation} +## Returns: {operation, undoable} +func set_operation(params: Dictionary) -> Dictionary: + var operation: String = params.get("operation", "") + if not OPERATIONS.has(operation): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown operation: %s. Valid operations: %s" % [operation, ", ".join(OPERATIONS.keys())]) + var resolved := McpNodeValidator.resolve_or_error( + params.get("path", ""), "path", params.get("scene_file", "")) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + if not node is CSGShape3D: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Node is not a CSGShape3D: %s" % params.get("path", "")) + var shape: CSGShape3D = node + var prev: int = shape.operation + var next: int = OPERATIONS[operation] + ## Target the node in both callbacks so the action lands in the scene + ## undo history (first-target routing); `set` exists on every Object. + _undo_redo.create_action("MCP: CSG set_operation") + _undo_redo.add_do_method(shape, "set", "operation", next) + _undo_redo.add_undo_method(shape, "set", "operation", prev) + _undo_redo.commit_action() + return {"data": {"operation": operation, "undoable": true}} diff --git a/addons/godot_ai/handlers/csg_handler.gd.uid b/addons/godot_ai/handlers/csg_handler.gd.uid new file mode 100644 index 0000000..0f7b976 --- /dev/null +++ b/addons/godot_ai/handlers/csg_handler.gd.uid @@ -0,0 +1 @@ +uid://c4mb0tptu52x2 diff --git a/addons/godot_ai/handlers/curve_handler.gd b/addons/godot_ai/handlers/curve_handler.gd new file mode 100644 index 0000000..e21c47a --- /dev/null +++ b/addons/godot_ai/handlers/curve_handler.gd @@ -0,0 +1,243 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Replaces all points on a Curve / Curve2D / Curve3D resource. The point +## list shape depends on resource type (see `set_points` for the schemas). +## +## Dedicated tool rather than a property set because Curve2D/Curve3D.add_point +## is a method call, not a property — resource_create's `properties` dict can't +## reach it. + +const NodeHandler := preload("res://addons/godot_ai/handlers/node_handler.gd") + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +func set_points(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + var property: String = params.get("property", "") + var resource_path: String = params.get("resource_path", "") + var new_points: Array = params.get("points", []) + + var home_err := McpResourceIO.validate_home(params) + if home_err != null: + return home_err + var has_file_target := not resource_path.is_empty() + if not (new_points is Array): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "points must be an array") + + var curve: Resource + var node: Node = null + var curve_created := false + if has_file_target: + var rpath_err = McpPathValidator.loadable_error(resource_path, "resource_path") + if rpath_err != null: + return rpath_err + if not ResourceLoader.exists(resource_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % resource_path) + # ResourceLoader.load() returns Godot's cached Resource. Duplicate + # before mutating so: (a) open scenes holding a reference to this + # .tres don't silently see the new points outside any undo action, + # and (b) if ResourceSaver.save() fails we haven't corrupted the + # in-memory cache (cache/disk divergence). Also guard against + # ResourceLoader.exists() succeeding but load() returning null + # (corrupt .tres, unregistered class) — otherwise curve.get_class() + # on the response line below would crash the plugin. + var loaded_curve: Resource = ResourceLoader.load(resource_path) + if loaded_curve == null: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to load curve from %s (file exists but load returned null — may be corrupt)" % resource_path + ) + curve = loaded_curve.duplicate() + else: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + node = McpScenePath.resolve(node_path, scene_root) + if node == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_node_error(node_path, scene_root)) + if not (property in node): + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(node, property) + ) + curve = node.get(property) + # Auto-create a fresh Curve subclass if the slot is empty. Infer the + # concrete class from the property's hint_string (e.g. Path3D.curve's + # hint is "Curve3D"). Creation is bundled into the same undo action + # as the point-set below, so Ctrl-Z rolls back both. + if curve == null: + var inferred := _infer_curve_class(node, property) + if inferred.is_empty(): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Curve slot on %s.%s is null and the Curve class can't be inferred from the property hint — create one first with resource_create (type=Curve3D/Curve2D/Curve)" % [node.get_class(), property] + ) + curve = ClassDB.instantiate(inferred) + if curve == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % inferred) + curve_created = true + + if not (curve is Curve or curve is Curve2D or curve is Curve3D): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Resource is %s — must be Curve, Curve2D, or Curve3D" % curve.get_class() + ) + + var coerced := _coerce_points(curve, new_points) + if coerced.has("error"): + return coerced.error + + var new_snapshot: Array = coerced.snapshot + + if has_file_target: + _apply_snapshot_to_curve(curve, new_snapshot) + # curve_set_points EDITS an existing .tres, so override the default + # "delete to revert" message via extra_fields. + return McpResourceIO.save_to_disk(curve, resource_path, true, "Curve", { + "curve_class": curve.get_class(), + "point_count": new_snapshot.size(), + "reason": "File save is persistent; edit the .tres file manually to revert", + }, _connection) + + # Inline (node-attached) path: swap the curve property so the action lands + # cleanly in scene history, mirroring the resource-swap pattern used by + # material_handler::assign_material. When curve_created is true the + # "old" value is null — undo clears the slot back to empty. + var new_curve: Resource = curve if curve_created else curve.duplicate() + _apply_snapshot_to_curve(new_curve, new_snapshot) + var old_curve: Resource = null if curve_created else curve + + _undo_redo.create_action("MCP: Set %d points on %s.%s" % [new_snapshot.size(), node.name, property]) + _undo_redo.add_do_property(node, property, new_curve) + _undo_redo.add_undo_property(node, property, old_curve) + _undo_redo.add_do_reference(new_curve) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "property": property, + "curve_class": new_curve.get_class(), + "point_count": new_snapshot.size(), + "curve_created": curve_created, + "undoable": true, + } + } + + +## Infer the concrete Curve class to instantiate for a null property slot. +## Reads the property's hint_string (set by Godot on resource-typed exports) +## to get the exact accepted class name (e.g. "Curve3D" for Path3D.curve). +## Returns empty string if no viable curve class can be determined. +static func _infer_curve_class(node: Node, property: String) -> String: + for prop in node.get_property_list(): + if prop.name != property: + continue + var hint_string: String = prop.get("hint_string", "") + if hint_string.is_empty(): + return "" + if not ClassDB.class_exists(hint_string): + return "" + if hint_string == "Curve" or hint_string == "Curve2D" or hint_string == "Curve3D": + return hint_string + # Some custom properties may list a parent class; require an exact + # match against our three supported types to avoid surprises. + return "" + return "" + + +## Convert input `points` into a normalized snapshot of typed values for +## the given curve type. Returns {snapshot: Array} on success or +## {error: ...} on failure. +static func _coerce_points(curve: Resource, points: Array) -> Dictionary: + var snapshot: Array = [] + if curve is Curve: + for i in range(points.size()): + var p = points[i] + if not (p is Dictionary) or not p.has("offset") or not p.has("value"): + return {"error": ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Curve points[%d] must be {offset, value, [left_tangent, right_tangent]}" % i + )} + snapshot.append({ + "offset": float(p["offset"]), + "value": float(p["value"]), + "left_tangent": float(p.get("left_tangent", 0.0)), + "right_tangent": float(p.get("right_tangent", 0.0)), + }) + elif curve is Curve2D: + var zero2 := {"x": 0, "y": 0} + for i in range(points.size()): + var p2 = points[i] + if not (p2 is Dictionary) or not p2.has("position"): + return {"error": ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Curve2D points[%d] must have 'position' (and optional 'in', 'out')" % i + )} + var axes2 := { + "position": p2["position"], + "in": p2.get("in", zero2), + "out": p2.get("out", zero2), + } + var coerced2 := {} + for field in ["position", "in", "out"]: + var v = NodeHandler._coerce_value(axes2[field], TYPE_VECTOR2) + var err := NodeHandler._check_coerced(v, TYPE_VECTOR2, "Curve2D points[%d].%s" % [i, field]) + if err != null: + return {"error": err} + coerced2[field] = v + snapshot.append(coerced2) + else: # Curve3D + var zero3 := {"x": 0, "y": 0, "z": 0} + for i in range(points.size()): + var p3 = points[i] + if not (p3 is Dictionary) or not p3.has("position"): + return {"error": ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Curve3D points[%d] must have 'position' (and optional 'in', 'out', 'tilt')" % i + )} + var axes3 := { + "position": p3["position"], + "in": p3.get("in", zero3), + "out": p3.get("out", zero3), + } + var coerced3 := {} + for field in ["position", "in", "out"]: + var v = NodeHandler._coerce_value(axes3[field], TYPE_VECTOR3) + var err := NodeHandler._check_coerced(v, TYPE_VECTOR3, "Curve3D points[%d].%s" % [i, field]) + if err != null: + return {"error": err} + coerced3[field] = v + coerced3["tilt"] = float(p3.get("tilt", 0.0)) + snapshot.append(coerced3) + return {"snapshot": snapshot} + + +func _apply_snapshot_to_curve(curve: Resource, snapshot: Array) -> void: + curve.clear_points() + if curve is Curve: + for p: Dictionary in snapshot: + curve.add_point( + Vector2(p.offset, p.value), + p.left_tangent, + p.right_tangent + ) + elif curve is Curve2D: + for p: Dictionary in snapshot: + curve.add_point(p.position, p["in"], p.out) + elif curve is Curve3D: + for i in range(snapshot.size()): + var p: Dictionary = snapshot[i] + curve.add_point(p.position, p["in"], p.out) + curve.set_point_tilt(i, p.tilt) diff --git a/addons/godot_ai/handlers/curve_handler.gd.uid b/addons/godot_ai/handlers/curve_handler.gd.uid new file mode 100644 index 0000000..8eb5b25 --- /dev/null +++ b/addons/godot_ai/handlers/curve_handler.gd.uid @@ -0,0 +1 @@ +uid://dboqr06a1fvqx diff --git a/addons/godot_ai/handlers/editor_handler.gd b/addons/godot_ai/handlers/editor_handler.gd new file mode 100644 index 0000000..8516eed --- /dev/null +++ b/addons/godot_ai/handlers/editor_handler.gd @@ -0,0 +1,1060 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const Telemetry := preload("res://addons/godot_ai/telemetry.gd") +const VisionRoutingScript := preload("res://addons/godot_ai/vision_routing.gd") + +## Handles editor state, selection, log, screenshot, and performance commands. + +const UpdateMixedState := preload("res://addons/godot_ai/utils/update_mixed_state.gd") + +var _log_buffer: McpLogBuffer +var _connection: McpConnection +var _debugger_plugin: McpDebuggerPlugin +var _game_log_buffer: McpGameLogBuffer +var _editor_log_buffer: McpEditorLogBuffer +var _debugger_errors_root: Node +var _surfaced_error_tracker +var _vision_routing: VisionRoutingScript = null + + +func _init(log_buffer: McpLogBuffer, connection: McpConnection = null, debugger_plugin: McpDebuggerPlugin = null, game_log_buffer: McpGameLogBuffer = null, editor_log_buffer: McpEditorLogBuffer = null, debugger_errors_root: Node = null, surfaced_error_tracker = null, vision_routing: VisionRoutingScript = null) -> void: + _log_buffer = log_buffer + _connection = connection + _debugger_plugin = debugger_plugin + _game_log_buffer = game_log_buffer + _editor_log_buffer = editor_log_buffer + _debugger_errors_root = debugger_errors_root + _surfaced_error_tracker = surfaced_error_tracker + _vision_routing = vision_routing + if _surfaced_error_tracker == null: + _surfaced_error_tracker = McpSurfacedErrorTracker.new(_editor_log_buffer, _game_log_buffer, _debugger_errors_root) + + +func get_editor_state(_params: Dictionary) -> Dictionary: + var scene_root := EditorInterface.get_edited_scene_root() + var game_status := _current_game_status() + var data := { + "godot_version": Engine.get_version_info().get("string", "unknown"), + "project_name": ProjectSettings.get_setting("application/config/name", ""), + "current_scene": scene_root.scene_file_path if scene_root else "", + "is_playing": EditorInterface.is_playing_scene(), + "readiness": McpConnection.get_readiness(), + ## True once the game subprocess autoload has beaconed mcp:hello; + ## false between Play→Stop cycles. Lets capture-source=game callers + ## poll for a real ready signal instead of guessing with sleep(). + "game_capture_ready": _debugger_plugin != null and _debugger_plugin.is_game_capture_ready(), + "game_status": game_status, + "helper_live": bool(game_status.get("helper_live", false)), + "session_active": bool(game_status.get("session_active", false)), + } + ## Half-installed addon tree from a failed self-update rollback. When + ## non-empty, the agent / dock paint the operator-facing recovery copy + ## from `update_mixed_state.gd::diagnose`. Field omitted when the + ## addons tree is clean so editor_state's normal payload stays small. + ## See issue #354 / audit-v2 #10. + var mixed_state := UpdateMixedState.diagnose() + if not mixed_state.is_empty(): + data["mixed_state"] = mixed_state + return {"data": data} + + +func get_selection(_params: Dictionary) -> Dictionary: + var scene_root := EditorInterface.get_edited_scene_root() + var selected := EditorInterface.get_selection().get_selected_nodes() + var paths: Array[String] = [] + for node in selected: + paths.append(McpScenePath.from_node(node, scene_root)) + return {"data": {"selected_paths": paths, "count": paths.size()}} + + +const VALID_LOG_SOURCES := ["plugin", "game", "editor", "all"] + +## Deferred budget for the `input_sequence` game op. Unlike the one-shot game +## ops (covered by game_command's 15s entry), it drives the game forward one +## frame per step, so the reply legitimately takes seconds. The game side caps +## the sequence length (GameHelper.MAX_SEQUENCE_FRAMES) well inside this; the +## budget is the backstop for a frozen game loop, mirroring take_screenshot. +const INPUT_SEQUENCE_TIMEOUT_SEC := 30.0 + + +func get_logs(params: Dictionary) -> Dictionary: + ## Coerce defensively — MCP clients can send JSON numbers as floats or + ## stray `null` values that would otherwise fail the typed locals + ## before we ever reach the INVALID_PARAMS return below. + var count: int = maxi(0, int(params.get("count", 50))) + var offset: int = maxi(0, int(params.get("offset", 0))) + var source: String = str(params.get("source", "plugin")) + var include_details: bool = bool(params.get("include_details", false)) + var has_since_cursor := params.has("since_cursor") and params.get("since_cursor") != null + var since_cursor: int = maxi(0, int(params.get("since_cursor", 0))) + var since_run_id := "" if params.get("since_run_id", null) == null else str(params.get("since_run_id", "")) + if not source in VALID_LOG_SOURCES: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid source '%s' — use 'plugin', 'game', 'editor', or 'all'" % source, + ) + + match source: + "plugin": + return _get_plugin_logs(count, offset) + "game": + return _get_game_logs(count, offset, include_details, since_run_id) + "editor": + return _get_editor_logs(count, offset, include_details, has_since_cursor, since_cursor) + "all": + return _get_all_logs(count, offset, include_details) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Unreachable") + + +func _current_game_status() -> Dictionary: + if _debugger_plugin == null: + return McpDebuggerPlugin.with_liveness_flags({ + "status": "stopped", + "active": false, + "ready": false, + "helper_expected": true, + }) + return _debugger_plugin.get_game_status() + + +func _get_plugin_logs(count: int, offset: int) -> Dictionary: + var all_lines := _log_buffer.get_recent(_log_buffer.total_count()) + var page: Array[Dictionary] = [] + var stop := mini(all_lines.size(), offset + count) + for i in range(mini(offset, all_lines.size()), stop): + page.append({"source": "plugin", "level": "info", "text": all_lines[i]}) + return { + "data": { + "source": "plugin", + "lines": page, + "total_count": all_lines.size(), + "returned_count": page.size(), + "offset": offset, + } + } + + +func _get_game_logs(count: int, offset: int, include_details: bool, since_run_id: String = "") -> Dictionary: + var game_status := _current_game_status() + var helper_live := bool(game_status.get("helper_live", false)) + var session_active := bool(game_status.get("session_active", false)) + if _game_log_buffer == null: + return { + "data": { + "source": "game", + "lines": [], + "total_count": 0, + "returned_count": 0, + "offset": offset, + "run_id": "", + "current_run_id": "", + "is_running": session_active, + "helper_live": helper_live, + "session_active": session_active, + "game_status": game_status, + "dropped_count": 0, + "stale_run_id": false, + } + } + var current_run_id := _game_log_buffer.run_id() + var target_run_id := since_run_id if not since_run_id.is_empty() else current_run_id + var stale_run_id := not since_run_id.is_empty() and since_run_id != current_run_id + var run_page := _game_log_buffer.get_run_page(target_run_id, offset, count) + var page := _entries_for_response(run_page.get("entries", []), include_details) + var data := { + "source": "game", + "lines": page, + "total_count": int(run_page.get("total_count", 0)), + "returned_count": page.size(), + "offset": offset, + "run_id": target_run_id, + "current_run_id": current_run_id, + "is_running": session_active, + "helper_live": helper_live, + "session_active": session_active, + "game_status": game_status, + "dropped_count": _game_log_buffer.dropped_count(), + "stale_run_id": stale_run_id, + } + _merge_editor_errors_hint(data, game_status) + return {"data": data} + + +## #641: boot-time parse errors happen while autoload scripts compile — before +## the game helper's logger attaches via OS.add_logger — so they can NEVER +## appear in the game buffer. They surface only through the editor scope +## (Errors-tab rows + editor logger). Cross-reference them here so an +## empty/clean game log is not mistaken for a clean launch. +func _merge_editor_errors_hint(data: Dictionary, game_status: Dictionary) -> void: + if _debugger_plugin == null: + return + ## A since_run_id read of a prior run must not carry the CURRENT run's + ## editor errors — the hint interprets the run being read. + if bool(data.get("stale_run_id", false)): + return + ## run_token == 0 means no tracked run ever started this session; the + ## run-start cursor would be 0 and every retained editor error would be + ## misattributed to "this run". + if int(game_status.get("run_token", 0)) <= 0: + return + ## One-shot read — force the scan so rows that landed after the last + ## gated scan (and before the deferred timers fire) make the FIRST + ## logs_read(source='game') response, not just a later one. + var errors_info: Dictionary = _debugger_plugin.recent_editor_errors_since( + int(game_status.get("editor_log_cursor", 0)), true) + if str(errors_info.get("scope", "none")) != "run": + return + var errors: Array = errors_info.get("errors", []) + if errors.is_empty(): + return + data["editor_errors_count"] = errors.size() + data["editor_errors_hint"] = ( + "%d editor-side error%s from this run (first: %s) missing from the game log — boot-time parse/load errors occur before the game helper's logger attaches. Read logs_read(source='editor', include_details=true)." + % [errors.size(), "s" if errors.size() != 1 else "", _format_editor_error_summary(errors[0])] + ) + + +func _format_editor_error_summary(entry: Dictionary) -> String: + return McpSurfacedErrorTracker.format_editor_error_summary(entry) + + +func _get_editor_logs(count: int, offset: int, include_details: bool, has_since_cursor: bool = false, since_cursor: int = 0) -> Dictionary: + ## Editor-process script errors (parse errors, @tool runtime errors, + ## EditorPlugin errors, push_error/push_warning). Captured by + ## editor_logger.gd via OS.add_logger and gated on Godot 4.5+; on older + ## engines the buffer can be null. Godot also sends GDScript reload + ## warnings/errors straight to the Debugger dock's Errors tab; those do + ## not flow through OS.add_logger, so merge the visible tree rows here. + if has_since_cursor: + return _get_editor_logs_since(count, since_cursor, include_details) + var all_entries := _collect_editor_log_entries() + var page := _entries_for_response(_slice_entries(all_entries, offset, count), include_details) + var appended_total := _editor_log_buffer.appended_total() if _editor_log_buffer != null else 0 + return { + "data": { + "source": "editor", + "lines": page, + "total_count": all_entries.size(), + "returned_count": page.size(), + "offset": offset, + "dropped_count": _editor_log_buffer.dropped_count() if _editor_log_buffer != null else 0, + "next_cursor": appended_total, + "appended_total": appended_total, + } + } + + +func _get_editor_logs_since(count: int, since_cursor: int, include_details: bool) -> Dictionary: + ## Cursor reads are defined over the monotonic editor logger ring only. + ## Visible Debugger Errors-tab rows are live UI state, not ring entries, + ## so regular offset reads still merge them while since_cursor polling + ## reports only Logger-backed entries. + var captured := { + "cursor": since_cursor, + "oldest_cursor": 0, + "next_cursor": 0, + "appended_total": 0, + "truncated": false, + "has_more": false, + "entries": [], + } + var dropped := 0 + if _editor_log_buffer != null: + captured = _editor_log_buffer.get_since(since_cursor, count) + dropped = _editor_log_buffer.dropped_count() + var page := _entries_for_response(captured.get("entries", []), include_details) + return { + "data": { + "source": "editor", + "lines": page, + "total_count": int(captured.get("appended_total", 0)), + "returned_count": page.size(), + "offset": 0, + "dropped_count": dropped, + "cursor": int(captured.get("cursor", since_cursor)), + "oldest_cursor": int(captured.get("oldest_cursor", 0)), + "next_cursor": int(captured.get("next_cursor", 0)), + "appended_total": int(captured.get("appended_total", 0)), + "truncated": bool(captured.get("truncated", false)), + "has_more": bool(captured.get("has_more", false)), + } + } + + +func _get_all_logs(count: int, offset: int, include_details: bool) -> Dictionary: + ## Plugin lines have no timestamp, so we can't merge chronologically. + ## Concatenate plugin → editor → game and apply the offset/count window + ## over the combined list. The per-line `source` field tells callers + ## where each entry came from. Editor goes between plugin and game so + ## script errors stay grouped near the plugin recv/send traffic that + ## triggered them, with game runtime logs at the end. + var combined: Array[Dictionary] = [] + for line in _log_buffer.get_recent(_log_buffer.total_count()): + combined.append({"source": "plugin", "level": "info", "text": line}) + for entry in _collect_editor_log_entries(): + combined.append(entry) + var run_id := "" + var current_run_id := "" + var dropped := 0 + if _game_log_buffer != null: + run_id = _game_log_buffer.run_id() + current_run_id = run_id + dropped = _game_log_buffer.dropped_count() + var run_page := _game_log_buffer.get_run_page(run_id, 0, McpGameLogBuffer.MAX_LINES) + for entry in run_page.get("entries", []): + combined.append(entry) + var stop := mini(combined.size(), offset + count) + var page: Array[Dictionary] = [] + for i in range(mini(offset, combined.size()), stop): + page.append(combined[i]) + page = _entries_for_response(page, include_details) + if _editor_log_buffer != null: + dropped += _editor_log_buffer.dropped_count() + var game_status := _current_game_status() + return { + "data": { + "source": "all", + "lines": page, + "total_count": combined.size(), + "returned_count": page.size(), + "offset": offset, + "run_id": run_id, + "current_run_id": current_run_id, + "is_running": bool(game_status.get("session_active", false)), + "helper_live": bool(game_status.get("helper_live", false)), + "session_active": bool(game_status.get("session_active", false)), + "game_status": game_status, + "dropped_count": dropped, + } + } + + +func _entries_for_response(entries: Array[Dictionary], include_details: bool) -> Array[Dictionary]: + ## Compact responses only drop the top-level "details" key, so a shallow + ## copy is enough; the deep copy is reserved for the opt-in details path + ## where nested dicts leave the buffer. + var out: Array[Dictionary] = [] + for entry in entries: + if include_details: + out.append(entry.duplicate(true)) + else: + var copy: Dictionary = entry.duplicate(false) + copy.erase("details") + out.append(copy) + return out + + +func _collect_editor_log_entries() -> Array[Dictionary]: + return _surfaced_error_tracker.collect_editor_log_entries() + + +static func _slice_entries(entries: Array[Dictionary], offset: int, count: int) -> Array[Dictionary]: + var page: Array[Dictionary] = [] + var stop := mini(entries.size(), offset + count) + for i in range(mini(offset, entries.size()), stop): + page.append(entries[i]) + return page + + +## Map of human-readable monitor names to Performance.Monitor enum values. +const MONITORS := { + "time/fps": Performance.TIME_FPS, + "time/process": Performance.TIME_PROCESS, + "time/physics_process": Performance.TIME_PHYSICS_PROCESS, + "time/navigation_process": Performance.TIME_NAVIGATION_PROCESS, + "memory/static": Performance.MEMORY_STATIC, + "memory/static_max": Performance.MEMORY_STATIC_MAX, + "memory/message_buffer_max": Performance.MEMORY_MESSAGE_BUFFER_MAX, + "object/count": Performance.OBJECT_COUNT, + "object/resource_count": Performance.OBJECT_RESOURCE_COUNT, + "object/node_count": Performance.OBJECT_NODE_COUNT, + "object/orphan_node_count": Performance.OBJECT_ORPHAN_NODE_COUNT, + "render/total_objects_in_frame": Performance.RENDER_TOTAL_OBJECTS_IN_FRAME, + "render/total_primitives_in_frame": Performance.RENDER_TOTAL_PRIMITIVES_IN_FRAME, + "render/total_draw_calls_in_frame": Performance.RENDER_TOTAL_DRAW_CALLS_IN_FRAME, + "render/video_mem_used": Performance.RENDER_VIDEO_MEM_USED, + "physics_2d/active_objects": Performance.PHYSICS_2D_ACTIVE_OBJECTS, + "physics_2d/collision_pairs": Performance.PHYSICS_2D_COLLISION_PAIRS, + "physics_2d/island_count": Performance.PHYSICS_2D_ISLAND_COUNT, + "physics_3d/active_objects": Performance.PHYSICS_3D_ACTIVE_OBJECTS, + "physics_3d/collision_pairs": Performance.PHYSICS_3D_COLLISION_PAIRS, + "physics_3d/island_count": Performance.PHYSICS_3D_ISLAND_COUNT, + "navigation/active_maps": Performance.NAVIGATION_ACTIVE_MAPS, + "navigation/region_count": Performance.NAVIGATION_REGION_COUNT, + "navigation/agent_count": Performance.NAVIGATION_AGENT_COUNT, + "navigation/link_count": Performance.NAVIGATION_LINK_COUNT, + "navigation/polygon_count": Performance.NAVIGATION_POLYGON_COUNT, + "navigation/edge_count": Performance.NAVIGATION_EDGE_COUNT, + "navigation/edge_merge_count": Performance.NAVIGATION_EDGE_MERGE_COUNT, + "navigation/edge_connection_count": Performance.NAVIGATION_EDGE_CONNECTION_COUNT, + "navigation/edge_free_count": Performance.NAVIGATION_EDGE_FREE_COUNT, +} + + +## Compute coverage angles from the target's AABB geometry. +## Returns an establishing perspective shot (faces the longest ground axis) +## and an orthographic top-down for spatial layout. The AI iterates from +## there with explicit elevation/azimuth/fov for closeups and detail shots. +func _compute_coverage_angles(aabb: AABB) -> Array[Dictionary]: + var size := aabb.size + var ground_x := maxf(size.x, 0.01) + var ground_z := maxf(size.z, 0.01) + + ## Face the longest ground axis — establishing shot shows maximum extent + var estab_azimuth: float + if ground_x >= ground_z: + estab_azimuth = 0.0 # face along Z, showing X width + else: + estab_azimuth = 90.0 # face along X, showing Z width + + ## FOV: wider for spread-out subjects, narrower for compact ones + var ground_ratio := maxf(ground_x, ground_z) / minf(ground_x, ground_z) + var estab_fov := clampf(40.0 + ground_ratio * 5.0, 45.0, 65.0) + + return [ + {"label": "establishing", "elevation": 25.0, "azimuth": estab_azimuth + 20.0, + "fov": estab_fov, "ortho": false, "padding": 1.8}, + {"label": "top", "elevation": 90.0, "azimuth": 0.0, + "fov": 0.0, "ortho": true}, + ] + + +func take_screenshot(params: Dictionary) -> Dictionary: + ## Vision Routing hook: when enabled, the capture is described by the + ## configured vision provider on a worker thread and the text description + ## is returned instead of the raw image (see vision_routing.gd). Off, no + ## key, or non-image results keep the original behavior. The single source + ## of truth for the `match source:` dispatch lives in _take_screenshot_impl + ## (pinned by tests/unit/test_docs_screenshot_sources.py). + if _vision_routing != null and _vision_routing.is_routing_enabled(): + return _vision_routing.route_editor_screenshot(params, Callable(self, "_take_screenshot_impl"), _connection) + return _take_screenshot_impl(params) + + +func _take_screenshot_impl(params: Dictionary) -> Dictionary: + var source: String = params.get("source", "viewport") + var max_resolution: int = params.get("max_resolution", 0) + var view_target: String = params.get("view_target", "") + var coverage: bool = params.get("coverage", false) + var custom_elevation = params.get("elevation", null) + var custom_azimuth = params.get("azimuth", null) + var custom_fov = params.get("fov", null) + + var viewport: Viewport + match source: + "viewport": + viewport = EditorInterface.get_editor_viewport_3d() + if viewport == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_VIEWPORT_UNAVAILABLE, + "No 3D viewport available", false) + ## The 3D viewport's texture is empty when the edited scene + ## has no Node3D content (2D-only scene, or no scene open), + ## and the empty-image guard further down used to surface + ## that as INTERNAL_ERROR — leaving callers with no signal + ## that the failure was caller-side. Reject up front with a + ## structured hint so the LLM can pick a sensible next step + ## (open a 3D scene, switch to source="cinematic", etc.). + var precheck := viewport_screenshot_precheck(EditorInterface.get_edited_scene_root()) + if precheck.has("error"): + return precheck + "game": + if not EditorInterface.is_playing_scene(): + ## Same editor state as game_eval/game_command's gate below — + ## same EDITOR_NOT_READY shape, not INVALID_PARAMS (the params + ## were fine; the editor just isn't in the required state). + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_GAME_NOT_RUNNING, + "Game is not running — start the project first", false, + "Use source='viewport' for the editor viewport, or start the game with project_run and retry.") + ## The game is always a separate OS process (embedded mode just + ## reparents its window into the editor). Reach the framebuffer + ## via the debugger channel: the `_mcp_game_helper` autoload + ## inside the game process replies with a PNG, and + ## McpDebuggerPlugin pushes the response back through our + ## WebSocket with the same request_id via McpConnection.send_deferred_response. + if _debugger_plugin == null or _connection == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Debugger bridge unavailable — plugin may not be fully initialised") + var request_id: String = params.get("_request_id", "") + if request_id.is_empty(): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Missing request_id — cannot correlate deferred response") + _debugger_plugin.request_game_screenshot(request_id, max_resolution, _connection) + return McpDispatcher.DEFERRED_RESPONSE + "cinematic": + return _take_cinematic_screenshot(max_resolution) + "viewport_2d": + viewport = EditorInterface.get_editor_viewport_2d() + if viewport == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_VIEWPORT_UNAVAILABLE, + "No 2D viewport available", false) + var scene_root_2d := EditorInterface.get_edited_scene_root() + if scene_root_2d == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_NO_SCENE, + "No scene open — open a scene first", false, + "Call scene_open with a scene path (e.g. \"res://main.tscn\") first.") + if not view_target.is_empty() or coverage or custom_elevation != null or custom_azimuth != null or custom_fov != null: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "view_target, coverage, elevation, azimuth, and fov are not supported with source='viewport_2d'" + ) + ## Capture the 2D editor viewport directly; no view_target/coverage for 2D. + RenderingServer.force_draw(false) + var image_2d: Image = viewport.get_texture().get_image() + if image_2d == null or image_2d.is_empty(): + return _empty_image_error( + "viewport_2d", + "Captured an empty image from the 2D viewport. The 2D viewport produced no output — typically headless mode or the 2D viewport has not drawn a frame yet." + ) + return _finalize_image(image_2d, "viewport_2d", max_resolution) + _: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid source '%s' — use 'viewport', 'viewport_2d', 'cinematic', or 'game'" % source) + + ## Handle view_target: temporarily reposition the editor's own camera to + ## frame one or more target nodes, force a render, capture, then restore. + if not view_target.is_empty() and source == "viewport": + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + ## Parse comma-separated paths, deduplicate + var raw_paths := view_target.split(",") + var seen := {} + var unique_paths: Array[String] = [] + for rp in raw_paths: + var p := rp.strip_edges() + if not p.is_empty() and not seen.has(p): + seen[p] = true + unique_paths.append(p) + + ## Resolve each path, collect valid Node3D targets + var targets: Array[Node3D] = [] + var not_found: Array[String] = [] + for p in unique_paths: + var node := McpScenePath.resolve(p, scene_root) + if node == null: + not_found.append(p) + elif not node is Node3D: + not_found.append(p) + else: + targets.append(node as Node3D) + + if targets.is_empty(): + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, "No valid Node3D targets found: %s" % ", ".join(not_found)) + + var cam := viewport.get_camera_3d() + if cam == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_VIEWPORT_UNAVAILABLE, + "No camera in 3D viewport", false) + + ## Merge AABBs from all targets + var combined_aabb := _get_visual_aabb(targets[0]) + for i in range(1, targets.size()): + combined_aabb = combined_aabb.merge(_get_visual_aabb(targets[i])) + + var cam_rid := cam.get_camera_rid() + var saved_xform := cam.global_transform + var saved_fov := cam.fov + var saved_near := cam.near + var saved_far := cam.far + + ## --- Coverage path: multi-angle sweep --- + if coverage: + var images: Array[Dictionary] = [] + for preset in _compute_coverage_angles(combined_aabb): + if preset.get("ortho", false): + ## Orthographic top-down view + var ortho_size := combined_aabb.size.length() * 1.8 + var cam_height := maxf(combined_aabb.size.length() * 3.0, 10.0) + var center := combined_aabb.get_center() + var xform := Transform3D(Basis.IDENTITY, center + Vector3.UP * cam_height) + xform = xform.looking_at(center, Vector3.FORWARD) + RenderingServer.camera_set_orthogonal(cam_rid, ortho_size, saved_near, maxf(saved_far, cam_height * 2.0)) + RenderingServer.camera_set_transform(cam_rid, xform) + else: + ## Perspective view — padding per preset (wide for establishing, tight for detail) + var pad: float = preset.get("padding", 2.5) + var xform := _frame_transform_for_aabb(combined_aabb, preset.fov, preset.elevation, preset.azimuth, pad) + RenderingServer.camera_set_perspective(cam_rid, preset.fov, saved_near, saved_far) + RenderingServer.camera_set_transform(cam_rid, xform) + RenderingServer.force_draw(false) + var img: Image = viewport.get_texture().get_image() + if img != null and not img.is_empty(): + var entry := _finalize_image(img, "viewport", max_resolution) + entry.data["label"] = preset.label + entry.data["elevation"] = preset.elevation + entry.data["azimuth"] = preset.azimuth + entry.data["fov"] = preset.fov + entry.data["ortho"] = preset.get("ortho", false) + images.append(entry.data) + + ## Restore camera state (back to perspective + original transform) + RenderingServer.camera_set_perspective(cam_rid, saved_fov, saved_near, saved_far) + RenderingServer.camera_set_transform(cam_rid, saved_xform) + + ## Consistent with single-shot path: error if no frames rendered + ## (e.g. headless mode where force_draw produces no output). + if images.is_empty(): + return _empty_image_error( + "viewport", + "Coverage sweep rendered no images. The 3D viewport produced no output across any of the preset angles — typically because the editor is in headless mode (force_draw has no rendered output) or the 3D viewport has not drawn a frame yet." + ) + + var aabb_center := combined_aabb.get_center() + var aabb_size := combined_aabb.size + var result_data := { + "source": "viewport", + "view_target": view_target, + "view_target_count": targets.size(), + "coverage": true, + "images": images, + "aabb_center": [aabb_center.x, aabb_center.y, aabb_center.z], + "aabb_size": [aabb_size.x, aabb_size.y, aabb_size.z], + "aabb_longest_ground_axis": "x" if aabb_size.x >= aabb_size.z else "z", + } + if not not_found.is_empty(): + result_data["view_target_not_found"] = not_found + return {"data": result_data} + + ## --- Custom angle / FOV path --- + var use_elev: float = 25.0 if custom_elevation == null else float(custom_elevation) + var use_azim: float = 30.0 if custom_azimuth == null else float(custom_azimuth) + var use_fov: float = saved_fov if custom_fov == null else float(custom_fov) + + var cam_xform := _frame_transform_for_aabb(combined_aabb, use_fov, use_elev, use_azim) + + if custom_fov != null: + RenderingServer.camera_set_perspective(cam_rid, use_fov, saved_near, saved_far) + RenderingServer.camera_set_transform(cam_rid, cam_xform) + RenderingServer.force_draw(false) + + var image: Image = viewport.get_texture().get_image() + + ## Restore camera state + if custom_fov != null: + RenderingServer.camera_set_perspective(cam_rid, saved_fov, saved_near, saved_far) + RenderingServer.camera_set_transform(cam_rid, saved_xform) + + if image == null or image.is_empty(): + return _empty_image_error( + "viewport", + "Framed viewport rendered an empty image after repositioning the camera onto the view_target. The 3D viewport produced no output — typically headless mode or the 3D viewport has not drawn a frame yet." + ) + + var result := _finalize_image(image, "viewport", max_resolution) + result.data["view_target"] = view_target + result.data["view_target_count"] = targets.size() + var aabb_c := combined_aabb.get_center() + var aabb_s := combined_aabb.size + result.data["aabb_center"] = [aabb_c.x, aabb_c.y, aabb_c.z] + result.data["aabb_size"] = [aabb_s.x, aabb_s.y, aabb_s.z] + result.data["aabb_longest_ground_axis"] = "x" if aabb_s.x >= aabb_s.z else "z" + if custom_elevation != null or custom_azimuth != null: + result.data["elevation"] = use_elev + result.data["azimuth"] = use_azim + if custom_fov != null: + result.data["fov"] = use_fov + if not not_found.is_empty(): + result.data["view_target_not_found"] = not_found + return result + + var image: Image = viewport.get_texture().get_image() + + if image == null or image.is_empty(): + return _empty_image_error( + source, + "Captured an empty image from %s. The 3D viewport produced no output — typically headless mode or the 3D viewport has not drawn a frame yet." % source + ) + + return _finalize_image(image, source, max_resolution) + + +## Render the edited scene through its active Camera3D without running the +## game. Mirrors Godot's "Cinematic Preview" display mode but via a +## throwaway SubViewport, so the output has no editor gizmos, selection +## outlines, or grid lines. +func _take_cinematic_screenshot(max_resolution: int) -> Dictionary: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var scene_camera := _find_current_camera_3d(scene_root) + if scene_camera == null: + return ErrorCodes.make( + ErrorCodes.NODE_NOT_FOUND, + "No current Camera3D in scene — mark a Camera3D as `current` or add one to the scene", + ) + + ## Default to a 16:9 HD capture; size is overridden by _finalize_image's + ## `max_resolution` downscale step when requested. + var render_size := Vector2i(1920, 1080) + var edit_vp := EditorInterface.get_editor_viewport_3d() + if edit_vp != null: + var vs := edit_vp.get_visible_rect().size + if vs.x >= 1.0 and vs.y >= 1.0: + render_size = Vector2i(int(vs.x), int(vs.y)) + + var sub_vp := SubViewport.new() + sub_vp.size = render_size + sub_vp.own_world_3d = false + sub_vp.transparent_bg = false + sub_vp.render_target_update_mode = SubViewport.UPDATE_ONCE + + var cam := Camera3D.new() + cam.fov = scene_camera.fov + cam.near = scene_camera.near + cam.far = scene_camera.far + cam.projection = scene_camera.projection + cam.size = scene_camera.size + cam.keep_aspect = scene_camera.keep_aspect + cam.cull_mask = scene_camera.cull_mask + cam.environment = scene_camera.environment + cam.attributes = scene_camera.attributes + cam.current = true + + sub_vp.add_child(cam) + scene_root.add_child(sub_vp) + ## global_transform is resolved against the ancestor Node3D chain, so it + ## must be set after parenting — otherwise the camera ends up at origin. + cam.global_transform = scene_camera.global_transform + ## NOTIFICATION_TRANSFORM_CHANGED is delivered deferred (next frame's + ## flush_transform_notifications), but force_draw renders immediately — + ## without this flush the RenderingServer still has the identity + ## transform pushed at ENTER_WORLD and the capture shows only sky + ## instead of the camera's actual view (issue #650). + cam.force_update_transform() + + RenderingServer.force_draw(false) + var image: Image = sub_vp.get_texture().get_image() + + scene_root.remove_child(sub_vp) + sub_vp.queue_free() + + if image == null or image.is_empty(): + return _empty_image_error( + "cinematic", + "Cinematic render produced an empty image. The SubViewport returned no texture — typically headless mode (force_draw has no rendered output) or the scene's Camera3D is positioned so nothing visible is in frame." + ) + + var result := _finalize_image(image, "cinematic", max_resolution) + result.data["camera_path"] = McpScenePath.from_node(scene_camera, scene_root) + return result + + +## Reject a `source="viewport"` screenshot before we ever pull the +## texture if the edited scene has no Node3D content. The 3D viewport +## returns an empty (or stale) image in that case; surfacing it as +## INTERNAL_ERROR ("Failed to capture image from viewport") gave LLM +## callers no signal that the right move is to switch source or open a +## 3D scene. 152 hits / 63 uuids in 24h across plugin versions 2.5.0 -> +## 2.5.6 traced back to this. Returns `{}` on success. +## +## Caller passes `EditorInterface.get_edited_scene_root()`; the static +## form lets tests exercise the branches with a synthetic scene root +## without driving the editor. +static func viewport_screenshot_precheck(scene_root: Node) -> Dictionary: + if scene_root == null: + var no_scene_err := _make_viewport_not_3d_error( + "", + "The editor 3D viewport is empty because no scene is open. Open a scene with `scene_open` first." + ) + ## The honest state here is "no scene", not "scene lacks 3D content" + ## — relabel the sub-code so telemetry doesn't conflate the two. + ## `editor_state` stays "viewport_not_3d" for pre-#651 consumers. + no_scene_err["error"]["data"]["sub_code"] = ErrorCodes.SUB_EDITOR_NO_SCENE + return no_scene_err + ## A scene with any Node3D content — root or descendant — has + ## something the 3D viewport can render. Walking the tree (rather + ## than only checking the root type) avoids a false reject on the + ## common `Node` / `Node2D` root + Node3D descendant pattern. + if _scene_has_node3d_content(scene_root): + return {} + var root_type := scene_root.get_class() + var hint: String + var is_2d_scene := scene_root is CanvasItem + if is_2d_scene: + hint = ( + "The 3D viewport is empty because the current scene is 2D (%s root) with no Node3D descendants. " + + "Options: (a) open a 3D scene, " + + "(b) use source=\"cinematic\" if a Camera3D exists in the scene, " + + "(c) use source=\"viewport_2d\" to capture the 2D editor viewport directly, " + + "(d) call scene_get_hierarchy first to inspect what's available." + ) % root_type + else: + hint = ( + "The 3D viewport is empty because the current scene (%s root) has no Node3D content anywhere in the tree. " + + "Options: (a) open or add a Node3D, " + + "(b) use source=\"cinematic\" if a Camera3D exists in the scene, " + + "(c) call scene_get_hierarchy first to inspect what's available." + ) % root_type + var err := _make_viewport_not_3d_error(root_type, hint) + if is_2d_scene: + err["error"]["data"]["suggestion"] = "use source='viewport_2d' for 2D scenes" + return err + + +## True if scene_root is itself a Node3D or owns any Node3D descendant. +## DFS short-circuits on the first hit so empty 2D scenes stay cheap. +static func _scene_has_node3d_content(scene_root: Node) -> bool: + if scene_root is Node3D: + return true + var stack: Array[Node] = [scene_root] + while not stack.is_empty(): + var node: Node = stack.pop_back() + for child in node.get_children(): + if child is Node3D: + return true + stack.append(child) + return false + + +static func _make_viewport_not_3d_error(scene_root_type: String, hint: String) -> Dictionary: + ## `hint` becomes `error.message`; not duplicated into `data` because + ## `GodotCommandError`'s string form already appends every `data` key + ## as a suffix on the agent-visible error. + var err := ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_VIEWPORT_NOT_3D, hint, false) + err["error"]["data"]["editor_state"] = "viewport_not_3d" + err["error"]["data"]["scene_root_type"] = scene_root_type + return err + + +## Reached only when the precheck passed but the texture still came +## back empty — headless rendering, a freshly opened editor whose 3D +## viewport hasn't drawn a frame, or a SubViewport that lost its target. +static func _empty_image_error(source: String, hint: String) -> Dictionary: + ## retryable=false: an empty capture is usually headless mode, where a + ## retry loops forever — the not-yet-drawn-frame case is transient but + ## indistinguishable from here, so don't invite a retry loop. + var err := ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_VIEWPORT_EMPTY, hint, false) + err["error"]["data"]["editor_state"] = "viewport_empty" + err["error"]["data"]["source"] = source + return err + + +## Return the Camera3D that would be active if the scene were running. +## Preference: a descendant with `current=true`, else the first Camera3D +## found in a depth-first walk. +func _find_current_camera_3d(root: Node) -> Camera3D: + var first: Camera3D = null + var stack: Array[Node] = [root] + while not stack.is_empty(): + var node: Node = stack.pop_back() + if node is Camera3D: + if node.current: + return node + if first == null: + first = node + for child in node.get_children(): + stack.append(child) + return first + + +func _finalize_image(image: Image, source: String, max_resolution: int) -> Dictionary: + ## Shared with the game-process copy in runtime/game_helper.gd (#716). + var encoded := McpScreenshotEncode.downscale_and_encode(image, max_resolution) + return { + "data": { + "source": source, + "width": encoded.width, + "height": encoded.height, + "original_width": encoded.original_width, + "original_height": encoded.original_height, + "format": "png", + "image_base64": encoded.base64, + } + } + + +## Recursively compute the visual bounding box of a Node3D and its children. +func _get_visual_aabb(node: Node3D) -> AABB: + var aabb := AABB() + var found := false + if node is VisualInstance3D: + aabb = node.global_transform * node.get_aabb() + found = true + for child in node.get_children(): + if child is Node3D: + var child_aabb := _get_visual_aabb(child) + if child_aabb.size != Vector3.ZERO: + if found: + aabb = aabb.merge(child_aabb) + else: + aabb = child_aabb + found = true + if not found: + aabb = AABB(node.global_position - Vector3(0.5, 0.5, 0.5), Vector3(1, 1, 1)) + return aabb + + +## Calculate a camera Transform3D that frames the given AABB nicely. +## elevation_deg: camera elevation (0 = level, 90 = directly above). Default 25. +## azimuth_deg: camera azimuth (0 = front, 90 = right side). Default 30. +## padding: distance multiplier for breathing room (1.2 = tight, 2.5 = context). Default 1.8. +func _frame_transform_for_aabb(aabb: AABB, fov_degrees: float = 75.0, elevation_deg: float = 25.0, azimuth_deg: float = 30.0, padding: float = 1.8) -> Transform3D: + var center := aabb.get_center() + var radius := aabb.size.length() * 0.5 + var fov_rad := deg_to_rad(fov_degrees) + var distance := radius / tan(fov_rad * 0.5) * padding + ## Floor with an absolute offset so unit-scale AABBs don't place the camera + ## inside or against the target. `radius * 2.0` alone scales to zero as the + ## AABB shrinks; the +1.0 guarantees a minimum of ~1 world-unit of standoff. + distance = maxf(distance, radius * 2.0 + 1.0) + var elev := deg_to_rad(elevation_deg) + var azim := deg_to_rad(azimuth_deg) + var cam_pos := center + Vector3( + distance * cos(elev) * sin(azim), + distance * sin(elev), + distance * cos(elev) * cos(azim), + ) + var xform := Transform3D(Basis.IDENTITY, cam_pos) + ## At ~90° elevation the view direction is parallel to Vector3.UP — use + ## FORWARD as the up hint so looking_at doesn't degenerate. + var up := Vector3.FORWARD if elevation_deg > 85.0 else Vector3.UP + return xform.looking_at(center, up) + + +func get_performance_monitors(params: Dictionary) -> Dictionary: + var filter: Array = params.get("monitors", []) + var result := {} + + if filter.is_empty(): + for key in MONITORS: + result[key] = Performance.get_monitor(MONITORS[key]) + else: + for key in filter: + if MONITORS.has(key): + result[key] = Performance.get_monitor(MONITORS[key]) + + return { + "data": { + "monitors": result, + "monitor_count": result.size(), + } + } + + +func clear_logs(params: Dictionary) -> Dictionary: + var count := _log_buffer.total_count() + _log_buffer.clear() + var data := {"cleared_count": count} + ## The Debugger Errors panel is user-visible editor UI, not an MCP-owned + ## buffer — wiping it stays behind an explicit opt-in. + if bool(params.get("clear_debugger_errors", false)): + data["debugger_errors_cleared"] = _clear_debugger_error_trees() + return {"data": data} + + +func _clear_debugger_error_trees() -> int: + return _surfaced_error_tracker.clear_debugger_error_trees() + + +func reload_plugin(_params: Dictionary) -> Dictionary: + _log_buffer.log("reload_plugin requested, reloading next frame") + ## Persist a pending plugin_reload telemetry event *before* the + ## disable kills the live WebSocket. The re-enabled plugin's + ## _enter_tree flushes via `_telemetry.flush_pending_plugin_reload()`. + Telemetry.record_pending_plugin_reload("mcp_tool") + _do_reload_plugin.call_deferred() + return {"data": {"status": "reloading", "message": "Plugin reload initiated"}} + + +## Force a filesystem rescan before toggling the plugin, so Godot's +## class-name registry picks up any .gd files added since the last scan +## (e.g. via git pull or an agent-driven sync). Without this, re-enable can +## fail with "Could not find type X" when new class_name scripts are on disk +## but not yet registered, leaving the plugin disabled with no recovery path +## short of killing the editor. See issue #83. +# `static` is load-bearing: the deferred coroutine captures no `self`, so +# it survives even if the EditorHandler RefCounted is freed mid-await — +# which is exactly what reload does to this handler's owner. An instance +# coroutine here resumes on a freed object under reload churn. +static func _do_reload_plugin() -> void: + var fs := EditorInterface.get_resource_filesystem() + fs.scan() + var tree := Engine.get_main_loop() as SceneTree + # Cap the wait so a long scan (huge project) doesn't hang reload. + var deadline_ms := Time.get_ticks_msec() + 5000 + while fs.is_scanning() and Time.get_ticks_msec() < deadline_ms: + await tree.process_frame + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", false) + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", true) + + +func quit_editor(_params: Dictionary) -> Dictionary: + _log_buffer.log("quit_editor requested, quitting next frame") + ## Defer the quit so the response is sent back before the editor exits. + EditorInterface.get_base_control().get_tree().call_deferred("quit") + return {"data": {"status": "quitting", "message": "Editor quit initiated"}} + + +func game_eval(params: Dictionary) -> Dictionary: + var code: String = params.get("code", "") + if code.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "code is required") + + if _debugger_plugin == null or _connection == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Debugger bridge unavailable — plugin may not be fully initialised") + + if not EditorInterface.is_playing_scene(): + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_GAME_NOT_RUNNING, + "Game is not running — start the project first", false, + "Start the game with project_run (or wait for the user to run it), then retry.") + + var request_id: String = params.get("_request_id", "") + if request_id.is_empty(): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Missing request_id — cannot correlate deferred response") + + _debugger_plugin.request_game_eval(code, request_id, _connection) + return McpDispatcher.DEFERRED_RESPONSE + + +func game_command(params: Dictionary) -> Dictionary: + var op: String = str(params.get("op", "")) + if op.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "op is required") + + if _debugger_plugin == null or _connection == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Debugger bridge unavailable — plugin may not be fully initialised") + + if not EditorInterface.is_playing_scene(): + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_GAME_NOT_RUNNING, + "Game is not running — start the project first", false, + "Start the game with project_run (or wait for the user to run it), then retry.") + + var request_id: String = params.get("_request_id", "") + if request_id.is_empty(): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Missing request_id — cannot correlate deferred response") + + var command_params: Dictionary = params.get("params", {}) + + ## input_sequence steps the game forward frame-by-frame in one call, so it + ## needs a far larger budget than the one-shot game ops that share the + ## `game_command` deferred entry (15s). Widen both timers only for it: the + ## debugger-side pending timer (below) and the dispatcher-side deferred + ## budget (via the sentinel's `_deferred_timeout_ms`). Every other op keeps + ## request_game_command's tight default. + if op == "input_sequence": + _debugger_plugin.request_game_command( + op, command_params, request_id, _connection, INPUT_SEQUENCE_TIMEOUT_SEC + ) + return { + "_deferred": true, + "_deferred_timeout_ms": int(INPUT_SEQUENCE_TIMEOUT_SEC * 1000.0), + } + + _debugger_plugin.request_game_command(op, command_params, request_id, _connection) + return McpDispatcher.DEFERRED_RESPONSE diff --git a/addons/godot_ai/handlers/editor_handler.gd.uid b/addons/godot_ai/handlers/editor_handler.gd.uid new file mode 100644 index 0000000..16d785f --- /dev/null +++ b/addons/godot_ai/handlers/editor_handler.gd.uid @@ -0,0 +1 @@ +uid://dcro7yc8bor6v diff --git a/addons/godot_ai/handlers/environment_handler.gd b/addons/godot_ai/handlers/environment_handler.gd new file mode 100644 index 0000000..6729f1e --- /dev/null +++ b/addons/godot_ai/handlers/environment_handler.gd @@ -0,0 +1,181 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Creates an Environment (+ optional Sky + ProceduralSkyMaterial) chain and +## either assigns it to a WorldEnvironment node or saves it to a .tres file. +## Bundles sub-resource creation + assignment in a single undo action. + +const ResourceHandler := preload("res://addons/godot_ai/handlers/resource_handler.gd") + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +const _PRESETS := { + "default": {"sky": true, "fog": false}, + "clear": {"sky": true, "fog": false}, + "sunset": {"sky": true, "fog": false}, + "night": {"sky": true, "fog": false}, + "fog": {"sky": true, "fog": true}, +} + + +func create_environment(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + var resource_path: String = params.get("resource_path", "") + var overwrite: bool = params.get("overwrite", false) + var preset: String = params.get("preset", "default") + var properties: Dictionary = params.get("properties", {}) + var sky_param = params.get("sky", null) # nullable — falls back to preset default + + # environment_create targets the whole WorldEnvironment node (no separate + # `property` param) — pass require_property=false. + var home_err := McpResourceIO.validate_home(params, false) + if home_err != null: + return home_err + + if not _PRESETS.has(preset): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid preset '%s'. Valid: %s" % [preset, ", ".join(_PRESETS.keys())] + ) + + var preset_config: Dictionary = _PRESETS[preset] + var want_sky: bool = preset_config.sky + var sky_properties: Dictionary = {} + if sky_param != null: + if sky_param is bool: + want_sky = sky_param + elif sky_param is Dictionary: + var sky_config: Dictionary = (sky_param as Dictionary).duplicate() + var material_type: String = String(sky_config.get("sky_material", "procedural")).to_lower() + if material_type != "procedural": + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "sky.sky_material must be 'procedural' when sky is a dictionary" + ) + sky_config.erase("sky_material") + sky_properties = sky_config + want_sky = true + else: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "sky must be a bool, null, or dictionary of ProceduralSkyMaterial properties" + ) + + var env := Environment.new() + var sky: Sky = null + var sky_material: ProceduralSkyMaterial = null + if want_sky: + sky_material = ProceduralSkyMaterial.new() + sky = Sky.new() + sky.sky_material = sky_material + env.background_mode = Environment.BG_SKY + env.sky = sky + else: + env.background_mode = Environment.BG_CLEAR_COLOR + + _apply_preset(env, sky_material, preset) + if not sky_properties.is_empty(): + var sky_apply_err := ResourceHandler._apply_resource_properties(sky_material, sky_properties) + if sky_apply_err != null: + return sky_apply_err + if preset_config.fog: + env.volumetric_fog_enabled = true + env.volumetric_fog_density = 0.03 + + if not properties.is_empty(): + var apply_err := ResourceHandler._apply_resource_properties(env, properties) + if apply_err != null: + return apply_err + + if not resource_path.is_empty(): + return _save_environment(env, sky, sky_material, resource_path, overwrite, preset) + return _assign_environment(env, sky, sky_material, node_path, preset) + + +static func _apply_preset(env: Environment, sky_material: ProceduralSkyMaterial, preset: String) -> void: + match preset: + "default", "clear": + if sky_material != null: + sky_material.sky_top_color = Color(0.38, 0.45, 0.55) + sky_material.sky_horizon_color = Color(0.65, 0.67, 0.7) + sky_material.ground_horizon_color = Color(0.65, 0.67, 0.7) + sky_material.ground_bottom_color = Color(0.2, 0.17, 0.13) + sky_material.sun_angle_max = 30.0 + env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY + env.ambient_light_energy = 1.0 + "sunset": + if sky_material != null: + sky_material.sky_top_color = Color(0.25, 0.3, 0.55) + sky_material.sky_horizon_color = Color(1.0, 0.55, 0.3) + sky_material.ground_horizon_color = Color(0.85, 0.4, 0.25) + sky_material.ground_bottom_color = Color(0.2, 0.12, 0.1) + env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY + env.ambient_light_color = Color(1.0, 0.75, 0.55) + env.ambient_light_energy = 0.8 + "night": + if sky_material != null: + sky_material.sky_top_color = Color(0.02, 0.02, 0.07) + sky_material.sky_horizon_color = Color(0.05, 0.07, 0.15) + sky_material.ground_horizon_color = Color(0.04, 0.05, 0.1) + sky_material.ground_bottom_color = Color(0.0, 0.0, 0.02) + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color(0.2, 0.22, 0.35) + env.ambient_light_energy = 0.4 + "fog": + if sky_material != null: + sky_material.sky_top_color = Color(0.65, 0.65, 0.7) + sky_material.sky_horizon_color = Color(0.8, 0.8, 0.82) + sky_material.ground_horizon_color = Color(0.7, 0.7, 0.72) + sky_material.ground_bottom_color = Color(0.3, 0.3, 0.32) + env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY + env.ambient_light_energy = 0.7 + + +func _assign_environment(env: Environment, sky: Sky, sky_material: ProceduralSkyMaterial, node_path: String, preset: String) -> Dictionary: + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + if not (node is WorldEnvironment): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node at %s is %s — must be WorldEnvironment" % [node_path, node.get_class()] + ) + + var old_env = (node as WorldEnvironment).environment + + _undo_redo.create_action("MCP: Create Environment (%s) for %s" % [preset, node.name]) + _undo_redo.add_do_property(node, "environment", env) + _undo_redo.add_undo_property(node, "environment", old_env) + _undo_redo.add_do_reference(env) + if sky != null: + _undo_redo.add_do_reference(sky) + if sky_material != null: + _undo_redo.add_do_reference(sky_material) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "preset": preset, + "sky_created": sky != null, + "sky_material_class": sky_material.get_class() if sky_material != null else "", + "undoable": true, + } + } + + +func _save_environment(env: Environment, _sky: Sky, _sky_material: ProceduralSkyMaterial, resource_path: String, overwrite: bool, preset: String) -> Dictionary: + return McpResourceIO.save_to_disk(env, resource_path, overwrite, "Environment", { + "preset": preset, + }, _connection) diff --git a/addons/godot_ai/handlers/environment_handler.gd.uid b/addons/godot_ai/handlers/environment_handler.gd.uid new file mode 100644 index 0000000..f495f8f --- /dev/null +++ b/addons/godot_ai/handlers/environment_handler.gd.uid @@ -0,0 +1 @@ +uid://b1k7jldwjp5jt diff --git a/addons/godot_ai/handlers/filesystem_handler.gd b/addons/godot_ai/handlers/filesystem_handler.gd new file mode 100644 index 0000000..b17ccc9 --- /dev/null +++ b/addons/godot_ai/handlers/filesystem_handler.gd @@ -0,0 +1,312 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const ScriptHandler := preload("res://addons/godot_ai/handlers/script_handler.gd") + +## Handles file read/write operations and reimport within the Godot project. + +## Bounds for the deferred scan wait. `write_file`/`reimport` register single +## files with `update_file()` (cheap, no global-class rebuild); `scan_filesystem` +## is the heavier, explicit "rebuild the class registry" path agents call after +## adding `class_name` scripts headlessly (no window focus to trigger it). +## Kept under the dispatcher's "scan_filesystem" deferred timeout (30s) so we +## always send a real reply before a DEFERRED_TIMEOUT is synthesised. +const _SCAN_START_GRACE_MSEC := 750 +const _SCAN_SETTLE_MAX_MSEC := 28000 + +## Sidecar the editor writes next to every imported resource. `reimport` reads +## it to tell imported assets from files that merely have a filesystem entry +## (see `_is_imported_resource`). +const IMPORT_SIDECAR_SUFFIX := ".import" + +## Shared single-flight latch for scan_filesystem. `is_scanning()` alone can't +## enforce single-flight: `EditorFileSystem.scan()` doesn't flip `is_scanning()` +## for a frame or two (hence _SCAN_START_GRACE_MSEC), so a second request landing +## in that window would observe `false` and stack another scan() — the exact +## stacked-worker SIGABRT this op exists to avoid (dsarno/godot#6). The latch is +## set before the first scan() and cleared when its settle coroutine finishes; +## concurrent requests coalesce onto the running scan instead of starting one. +## `static` so it's shared across handler instances; it resets on plugin reload +## (script re-parse), which self-heals any latch orphaned by a mid-await teardown. +static var _scan_in_flight := false + +var _connection: McpConnection + + +func _init(connection: McpConnection = null) -> void: + _connection = connection + + +func read_file(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + + var path_err = McpPathValidator.path_error(path, "path") + if path_err != null: + return path_err + + if not FileAccess.file_exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "File not found: %s" % path) + + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to open file: %s" % path) + + var content := file.get_as_text() + file.close() + + return { + "data": { + "path": path, + "content": content, + "size": content.length(), + "line_count": content.count("\n") + (1 if not content.is_empty() else 0), + } + } + + +func write_file(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var content: String = params.get("content", "") + + var path_err = McpPathValidator.path_error(path, "path", true) + if path_err != null: + return path_err + + var existed_before := FileAccess.file_exists(path) + + # Shared write path (#714): parent mkdir + write/flush + explicit error + # check live on McpResourceIO so this can't drift from create_script. + var write_failure: Variant = McpResourceIO.write_text_to_disk(path, content) + if write_failure != null: + return write_failure + + # Single-file register, not a full scan() — a scan() per write stacks + # filesystem WorkerThreadPool tasks under concurrent writes and can SIGABRT + # in the global-class update (see dsarno/godot#6 and create_script in + # script_handler.gd). update_file() is what reimport()/material/theme use. + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + var data := { + "path": path, + "size": content.length(), + "undoable": false, + "reason": "File system operations cannot be undone via editor undo", + } + var is_gdscript := path.ends_with(".gd") + ## A .gd written through the filesystem tool used to skip the parse + ## diagnostics create_script attaches (#714) — the agent's broken + ## script reported plain success and the parse error surfaced only in + ## later editor logs. Same shared check, same response fields. A bare + ## ScriptHandler works here: the diagnostics path touches no instance + ## state (it stays an instance method only for test stubbing). + if is_gdscript: + ScriptHandler.new(null)._attach_gdscript_diagnostics(data, path, content) + data["committed"] = true + data["import_settled"] = existed_before + data["import_settle"] = "already_known" if existed_before else "not_waited" + McpResourceIO.attach_cleanup_hint(data, existed_before, [path]) + + ## Fresh `.gd` writes take create_script's import-settle deferral (#714, + ## #261): reply only once ResourceLoader can see the new resource (or the + ## bounded window elapses), so write_file -> script_attach back-to-back + ## can't 404 on the not-yet-imported script. This CHANGES write_file's + ## response timing for that case — the reply lands up to + ## McpResourceIO.IMPORT_SETTLE_MAX_MSEC later instead of immediately. + ## Scoped to .gd: ResourceLoader never learns plain text files, so an + ## unconditional wait would burn the full window on every fresh .txt. + ## Overwrites, batch_execute (no request_id) and unit-test contexts (no + ## connection) keep the synchronous reply. + var request_id: String = params.get("_request_id", "") + if is_gdscript and not existed_before and _connection != null and not request_id.is_empty(): + McpResourceIO.finish_text_write_deferred(_connection, request_id, path, data) + return McpDispatcher.DEFERRED_RESPONSE + + return {"data": data} + + +func reimport(params: Dictionary) -> Dictionary: + var paths: Array = params.get("paths", []) + + if paths.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: paths (non-empty array)") + + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var reimported: Array[String] = [] + var skipped_non_imported: Array[String] = [] + var not_found: Array[String] = [] + + for path_variant in paths: + var path: String = str(path_variant) + var path_err := McpPathValidator.validate_resource_path(path) + if not path_err.is_empty(): + not_found.append("%s (%s)" % [path, path_err]) + continue + if not FileAccess.file_exists(path): + not_found.append("%s (file does not exist)" % path) + continue + efs.update_file(path) + if _is_imported_resource(path): + reimported.append(path) + else: + skipped_non_imported.append(path) + + var data := { + "reimported": reimported, + "skipped_non_imported": skipped_non_imported, + "not_found": not_found, + "reimported_count": reimported.size(), + "skipped_non_imported_count": skipped_non_imported.size(), + "not_found_count": not_found.size(), + "undoable": false, + "reason": "Reimport is a file system operation", + } + ## Only when it applies: a hint on every call would cost tokens on the + ## all-assets path this op is actually for. + if not skipped_non_imported.is_empty(): + data["skipped_non_imported_hint"] = ( + "%d path(s) are not imported resources. Their editor filesystem entry was " + + "refreshed, but no import ran — a success here is not evidence that a " + + "script parsed or that diagnostics were produced. Use script_patch/" + + "script_create for GDScript diagnostics, or filesystem_manage(op=\"scan\") " + + "for an asset the editor has not imported yet." + ) % skipped_non_imported.size() + return {"data": data} + + +## #778: `update_file()` registers a path with the resource pipeline; it only +## runs an *import* for files that have one. Scripts, scenes and hand-written +## `.tres` are not imported resources, so listing them under `reimported` reads +## as proof that a parse or import ran when nothing did. +## +## The `.import` sidecar is the editor's own record that a path goes through +## the import pipeline, so it decides the split. An extension allow-list was +## rejected: importers come and go with plugins, so the list would drift out of +## agreement with the editor it claims to describe. +## +## Known edge: an asset the editor has never imported (just written, no scan +## yet) has no sidecar and reports as non-imported. That is accurate at the +## moment of the call — `update_file()` did not import it either — and the +## hint names `scan` as the way through. +## +## Behaviour is unchanged for every path: `update_file()` still runs on all of +## them, because refreshing an externally-edited `.tscn`/`.tres` is a real use +## of this op. This splits the report, not the work. +static func _is_imported_resource(path: String) -> bool: + if path.ends_with(IMPORT_SIDECAR_SUFFIX): + return false ## The sidecar itself is not an imported resource. + return FileAccess.file_exists(path + IMPORT_SIDECAR_SUFFIX) + + +## Force a full EditorFileSystem scan and wait for it to settle. This is the +## headless equivalent of the editor regaining window focus: `update_file()` +## (used by write_file/reimport/script_create) registers a single file with the +## resource pipeline but does NOT rebuild the global `class_name` table, so a +## freshly-created `class_name MyThing extends Resource` stays invisible to +## `ClassDB`/`ProjectSettings.get_global_class_list()` until a scan runs. Agents +## driving the editor without focus call this once after a batch of script +## creates to make new types instantiable/referenceable. See issue #83. +func scan_filesystem(params: Dictionary) -> Dictionary: + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var request_id: String = params.get("_request_id", "") + # Async path: a scan can't be awaited on the calling frame without freezing + # the editor, so hand control back to the dispatcher (DEFERRED_RESPONSE) and + # push the real reply from a static coroutine once the scan settles — by + # which point new class_names are registered. + if _connection != null and not request_id.is_empty(): + _finish_scan_deferred(_connection, request_id, efs) + return McpDispatcher.DEFERRED_RESPONSE + + # Synchronous fallback: batch_execute (no request_id) and unit-test contexts + # (no connection) can't await, so kick a single-flight scan and return + # immediately without the settle confirmation. Respect the latch so we don't + # stack onto a deferred scan; don't set it (there's no coroutine here to + # clear it — the brief is_scanning() window covers the rest). + var already := _scan_in_flight or efs.is_scanning() + if not already: + efs.scan() + return { + "data": { + "scan_completed": false, + "scan_settle": "not_waited", + "was_already_scanning": already, + "global_class_count": ProjectSettings.get_global_class_list().size(), + # Present in both paths for a consistent response shape; the sync + # path doesn't await, so it can't measure a delta. + "global_classes_registered_delta": 0, + "undoable": false, + "reason": "Filesystem scan is an editor operation", + } + } + + +## `static` is load-bearing for the same reason as ScriptHandler's deferred +## finish: the coroutine must outlive the handler RefCounted, which can be freed +## mid-await (e.g. an editor_reload_plugin fired during the scan). Parameterise +## everything; reference no instance state. +static func _finish_scan_deferred( + connection: McpConnection, + request_id: String, + efs: EditorFileSystem, +) -> void: + if not is_instance_valid(connection): + return + var tree := connection.get_tree() + if tree == null: + return + var classes_before := ProjectSettings.get_global_class_list().size() + # Single-flight via the shared `_scan_in_flight` latch (NOT is_scanning(), + # which lags scan() by a frame or two — see the latch declaration). Only the + # request that sets the latch calls scan(); concurrent requests coalesce and + # just await the running scan. This is what actually prevents the stacked + # scan() SIGABRT (dsarno/godot#6), even within the start-grace window. + var was_already_scanning := _scan_in_flight or efs.is_scanning() + var we_started := not was_already_scanning + if we_started: + _scan_in_flight = true + efs.scan() + # Hand back a frame so _dispatch() registers this request as deferred before + # the coroutine can push a reply (mirrors McpResourceIO.finish_text_write_deferred). + await tree.process_frame + var deadline_ms := Time.get_ticks_msec() + _SCAN_SETTLE_MAX_MSEC + var start_grace_ms := Time.get_ticks_msec() + _SCAN_START_GRACE_MSEC + var saw_scanning := efs.is_scanning() + while Time.get_ticks_msec() < deadline_ms: + if efs.is_scanning(): + saw_scanning = true + elif saw_scanning or Time.get_ticks_msec() > start_grace_ms: + # Either the scan ran and finished, or it never flipped is_scanning() + # within the grace window (a no-op scan because nothing changed). + break + await tree.process_frame + # Clear the latch in all paths (no try/finally in GDScript): do it before the + # is_instance_valid early-return so a freed connection can't orphan it. + if we_started: + _scan_in_flight = false + if not is_instance_valid(connection): + return + var completed := not efs.is_scanning() + var classes_after := ProjectSettings.get_global_class_list().size() + connection.send_deferred_response(request_id, { + "data": { + "scan_completed": completed, + "scan_settle": "settled" if completed else "timeout", + "was_already_scanning": was_already_scanning, + "global_class_count": classes_after, + "global_classes_registered_delta": classes_after - classes_before, + "undoable": false, + "reason": "Filesystem scan is an editor operation", + } + }) diff --git a/addons/godot_ai/handlers/filesystem_handler.gd.uid b/addons/godot_ai/handlers/filesystem_handler.gd.uid new file mode 100644 index 0000000..94135a4 --- /dev/null +++ b/addons/godot_ai/handlers/filesystem_handler.gd.uid @@ -0,0 +1 @@ +uid://c7ovtpdiumtju diff --git a/addons/godot_ai/handlers/gridmap_handler.gd b/addons/godot_ai/handlers/gridmap_handler.gd new file mode 100644 index 0000000..75016e4 --- /dev/null +++ b/addons/godot_ai/handlers/gridmap_handler.gd @@ -0,0 +1,192 @@ +@tool +extends RefCounted + +## GridMap authoring — set, fill, clear, and read 3D cells plus mesh-library +## items directly in the editor scene with full undo/redo support. +## +## All ops target GridMap nodes in the currently edited scene by +## scene-relative path (e.g. "/Main/Terrain"). All write ops are undoable +## via EditorUndoRedoManager. + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const MAX_FILL_CELLS := 4096 + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +## Set a single cell item. item = -1 erases the cell. +## params: {path, item, map_x, map_y, map_z, orientation=0} +## Returns: {map_x, map_y, map_z, item, orientation, undoable} +func set_item(params: Dictionary) -> Dictionary: + var gm := _resolve_gridmap(params) + if gm.has("error"): return gm + var node: GridMap = gm.node + var pos := Vector3i(int(params.get("map_x", 0)), int(params.get("map_y", 0)), int(params.get("map_z", 0))) + var item := int(params.get("item", 0)) + var orientation := int(params.get("orientation", 0)) + if orientation < 0 or orientation > 24: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "orientation must be in 0..24 (GridMap baked rotations), got %d" % orientation) + var prev := _capture_cell_state(node, pos) + _undo_redo.create_action("MCP: GridMap set_item") + _undo_redo.add_do_method(node, "set_cell_item", pos, item, orientation) + _undo_redo.add_undo_method(self, "_restore_cell_state", node, pos, prev) + _undo_redo.commit_action() + return {"data": {"map_x": pos.x, "map_y": pos.y, "map_z": pos.z, + "item": item, "orientation": orientation, "undoable": true}} + + +## Fill a box region with one item in a single undo action. +## params: {path, item, rect_x, rect_y, rect_z, rect_w, rect_h, rect_d, orientation=0} +## Returns: {cells_filled, rect: {x, y, z, w, h, d}} +func fill(params: Dictionary) -> Dictionary: + var gm := _resolve_gridmap(params) + if gm.has("error"): return gm + var node: GridMap = gm.node + var item := int(params.get("item", 0)) + var orientation := int(params.get("orientation", 0)) + if orientation < 0 or orientation > 24: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "orientation must be in 0..24 (GridMap baked rotations), got %d" % orientation) + var rx := int(params.get("rect_x", 0)); var ry := int(params.get("rect_y", 0)); var rz := int(params.get("rect_z", 0)) + var rw := int(params.get("rect_w", 1)); var rh := int(params.get("rect_h", 1)); var rd := int(params.get("rect_d", 1)) + if rw <= 0 or rh <= 0 or rd <= 0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "rect_w, rect_h and rect_d must be > 0 (got %d x %d x %d)" % [rw, rh, rd]) + var cell_count := rw * rh * rd + if cell_count > MAX_FILL_CELLS: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Region too large: %d cells exceeds max %d" % [cell_count, MAX_FILL_CELLS]) + var snapshot: Array[Dictionary] = [] + for x in range(rx, rx + rw): + for y in range(ry, ry + rh): + for z in range(rz, rz + rd): + var pos := Vector3i(x, y, z) + snapshot.append({"pos": pos, "state": _capture_cell_state(node, pos)}) + _undo_redo.create_action("MCP: GridMap fill %dx%dx%d" % [rw, rh, rd]) + ## First callback targets the node so the action lands in the scene undo + ## history (first-target routing); _apply_fill batches the rest of the + ## region into a single history entry instead of one per cell. + _undo_redo.add_do_method(node, "set_cell_item", snapshot[0].pos, item, orientation) + _undo_redo.add_do_method(self, "_apply_fill", node, snapshot, item, orientation) + _undo_redo.add_undo_method(self, "_restore_rect_snapshot", node, snapshot) + _undo_redo.commit_action() + return {"data": {"cells_filled": snapshot.size(), + "rect": {"x": rx, "y": ry, "z": rz, "w": rw, "h": rh, "d": rd}, "undoable": true}} + + +## Remove all cells from the GridMap. +## params: {path} +## Returns: {cleared: true} +func clear_layer(params: Dictionary) -> Dictionary: + var gm := _resolve_gridmap(params) + if gm.has("error"): return gm + var node: GridMap = gm.node + var used := node.get_used_cells() + if used.size() > MAX_FILL_CELLS: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "GridMap has %d cells, exceeds max %d for undoable clear" + % [used.size(), MAX_FILL_CELLS]) + var snapshot := _capture_used_cells_snapshot(node) + _undo_redo.create_action("MCP: GridMap clear") + _undo_redo.add_do_method(node, "clear") + _undo_redo.add_undo_method(self, "_restore_cells_snapshot", node, snapshot) + _undo_redo.commit_action() + return {"data": {"cleared": true, "undoable": true}} + + +## Return all used cell coordinates. +## params: {path} +## Returns: {cells: [{x, y, z}, ...], count: int} +func get_used_cells(params: Dictionary) -> Dictionary: + var gm := _resolve_gridmap(params) + if gm.has("error"): return gm + var node: GridMap = gm.node + var result: Array = [] + for c in node.get_used_cells(): + result.append({"x": c.x, "y": c.y, "z": c.z}) + return {"data": {"cells": result, "count": result.size()}} + + +## List the items available in the GridMap's MeshLibrary, so agents can +## discover item ids and names before placing cells (the 3D analogue of +## tileset atlas inspection). +## params: {path} +## Returns: {library: res:// path or "", items: [{item, name, mesh}...], count} +func list_library_items(params: Dictionary) -> Dictionary: + var gm := _resolve_gridmap(params) + if gm.has("error"): return gm + var node: GridMap = gm.node + var library: MeshLibrary = node.mesh_library + if library == null: + return {"data": {"library": "", "items": [], "count": 0}} + var items: Array = [] + var ids := library.get_item_list() + ids.sort() + for item in ids: + var mesh: Mesh = library.get_item_mesh(item) + var mesh_path := mesh.resource_path if mesh != null else "" + items.append({ + "item": item, + "name": library.get_item_name(item), + "mesh": mesh_path, + }) + return {"data": {"library": library.resource_path, "items": items, "count": items.size()}} + + +## Resolve a GridMap node from params["path"] in the currently edited +## scene. Returns {"node": GridMap} on success, or an error dict. +func _resolve_gridmap(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var scene_file: String = params.get("scene_file", "") + var resolved := McpNodeValidator.resolve_or_error(path, "path", scene_file) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + if not node is GridMap: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Node is not a GridMap: %s" % path) + return {"node": node} + + +func _capture_cell_state(node: GridMap, pos: Vector3i) -> Dictionary: + var item := node.get_cell_item(pos) + if item == -1: + return {"has_item": false} + return {"has_item": true, "item": item, "orientation": node.get_cell_item_orientation(pos)} + + +func _capture_used_cells_snapshot(node: GridMap) -> Array[Dictionary]: + var snapshot: Array[Dictionary] = [] + for pos in node.get_used_cells(): + snapshot.append({"pos": pos, "state": _capture_cell_state(node, pos)}) + return snapshot + + +func _restore_cells_snapshot(node: GridMap, snapshot: Array[Dictionary]) -> void: + node.clear() + for entry in snapshot: + _restore_cell_state(node, entry.pos, entry.state) + + +## Batched do-method for fill: one undo-history entry applies the whole +## region instead of one entry per cell. +func _apply_fill(node: GridMap, snapshot: Array[Dictionary], item: int, orientation: int) -> void: + for entry in snapshot: + node.set_cell_item(entry.pos, item, orientation) + + +func _restore_rect_snapshot(node: GridMap, snapshot: Array[Dictionary]) -> void: + for entry in snapshot: + _restore_cell_state(node, entry.pos, entry.state) + + +func _restore_cell_state(node: GridMap, pos: Vector3i, state: Dictionary) -> void: + if not state.get("has_item", false): + node.set_cell_item(pos, -1) + return + node.set_cell_item(pos, int(state.get("item", 0)), int(state.get("orientation", 0))) diff --git a/addons/godot_ai/handlers/gridmap_handler.gd.uid b/addons/godot_ai/handlers/gridmap_handler.gd.uid new file mode 100644 index 0000000..35bb1d0 --- /dev/null +++ b/addons/godot_ai/handlers/gridmap_handler.gd.uid @@ -0,0 +1 @@ +uid://cdv1yrjeyo5es diff --git a/addons/godot_ai/handlers/input_handler.gd b/addons/godot_ai/handlers/input_handler.gd new file mode 100644 index 0000000..78ddd22 --- /dev/null +++ b/addons/godot_ai/handlers/input_handler.gd @@ -0,0 +1,462 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles input action listing, creation, removal, and event binding. +## Actions are persisted via ProjectSettings so they survive editor restarts. + + +func list_actions(params: Dictionary) -> Dictionary: + var include_builtin: bool = params.get("include_builtin", false) + ## Authoritative source for user-authored actions is the ``[input]`` + ## section of ``project.godot``. ``ProjectSettings.has_setting`` is not + ## reliable here because Godot registers ``ui_*`` defaults via + ## ``GLOBAL_DEF_BASIC``, which makes ``has_setting`` return true for + ## them. Reading the file via ``ConfigFile`` distinguishes the user's + ## entries from engine-registered defaults regardless of namespace. + ## See #213. + var user_authored := _read_user_authored_actions() + var actions: Array[Dictionary] = [] + var seen := {} + for action_name in InputMap.get_actions(): + var name_str := str(action_name) + var is_user_action := user_authored.has(name_str) + if not include_builtin and not is_user_action: + continue + seen[name_str] = true + var events: Array[Dictionary] = [] + for event in InputMap.action_get_events(action_name): + events.append(_serialize_event(event)) + actions.append({ + "name": name_str, + "events": events, + "event_count": events.size(), + "is_builtin": not is_user_action, + "loaded_in_input_map": true, + }) + for action_name in user_authored.keys(): + var name_str := str(action_name) + if seen.has(name_str): + continue + var setting: Dictionary = user_authored.get(name_str, {}) + var events: Array[Dictionary] = [] + for event in setting.get("events", []): + if event is InputEvent: + events.append(_serialize_event(event)) + else: + events.append({"type": type_string(typeof(event)), "string": str(event)}) + actions.append({ + "name": name_str, + "events": events, + "event_count": events.size(), + "is_builtin": false, + "loaded_in_input_map": false, + }) + return {"data": {"actions": actions, "count": actions.size()}} + + +func _read_user_authored_actions() -> Dictionary: + var cfg := ConfigFile.new() + if cfg.load("res://project.godot") != OK: + return {} + if not cfg.has_section("input"): + return {} + var result: Dictionary = {} + for key in cfg.get_section_keys("input"): + var value = cfg.get_value("input", key, {}) + result[key] = value if value is Dictionary else {} + return result + + +func add_action(params: Dictionary) -> Dictionary: + var action: String = params.get("action", "") + var deadzone: float = params.get("deadzone", 0.5) + + if action.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: action") + + var deadzone_error := _validate_deadzone(deadzone) + if deadzone_error.has("error"): + return deadzone_error + + if InputMap.has_action(action): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Action '%s' already exists" % action) + + InputMap.add_action(action, deadzone) + + var key := "input/%s" % action + ProjectSettings.set_setting(key, { + "deadzone": deadzone, + "events": [], + }) + var err := ProjectSettings.save() + if err != OK: + InputMap.erase_action(action) + ProjectSettings.clear(key) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while adding action '%s': %s (error %d)" % [action, error_string(err), err]) + + return { + "data": { + "action": action, + "deadzone": deadzone, + "undoable": false, + "reason": "Input actions are saved to project.godot", + } + } + + +func ensure_action(params: Dictionary) -> Dictionary: + var action: String = params.get("action", "") + var deadzone: float = params.get("deadzone", 0.5) + + if action.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: action") + + var deadzone_error := _validate_deadzone(deadzone) + if deadzone_error.has("error"): + return deadzone_error + + var result := _ensure_action_state(action, deadzone) + if result.has("error"): + return result + return {"data": result} + + +func remove_action(params: Dictionary) -> Dictionary: + var action: String = params.get("action", "") + if action.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: action") + + var key := "input/%s" % action + var was_loaded := InputMap.has_action(action) + var old_setting = ProjectSettings.get_setting(key) if ProjectSettings.has_setting(key) else null + + ## An action can live in the editor process's InputMap, in project.godot, + ## or both. Actions persisted by a previous editor session exist only on + ## disk (`loaded_in_input_map: false` in list_actions) — those must still + ## be removable. #632 + if not was_loaded and old_setting == null: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Action '%s' not found" % action) + + if was_loaded: + InputMap.erase_action(action) + + if old_setting != null: + ProjectSettings.clear(key) + var err := ProjectSettings.save() + if err != OK: + if was_loaded: + var dz: float = old_setting.get("deadzone", 0.5) if old_setting is Dictionary else 0.5 + InputMap.add_action(action, dz) + if old_setting is Dictionary: + for ev in old_setting.get("events", []): + if ev is InputEvent: + InputMap.action_add_event(action, ev) + ProjectSettings.set_setting(key, old_setting) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while removing action '%s': %s (error %d)" % [action, error_string(err), err]) + + return { + "data": { + "action": action, + "removed": true, + "was_loaded": was_loaded, + "undoable": false, + "reason": "Input actions are saved to project.godot", + } + } + + +func bind_event(params: Dictionary) -> Dictionary: + var action: String = params.get("action", "") + var event_type: String = params.get("event_type", "") + + if action.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: action") + if event_type.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: event_type") + + if not InputMap.has_action(action): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Action '%s' not found. Call input_map_manage(op='add_action', params={action: '%s'}) first." % [action, action]) + + var event_or_error = _create_event(event_type, params) + if event_or_error is Dictionary: + return event_or_error + var event: InputEvent = event_or_error + + InputMap.action_add_event(action, event) + + var err := _save_action_events(action) + if err != OK: + InputMap.action_erase_event(action, event) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while binding event to action '%s': %s (error %d)" % [action, error_string(err), err]) + + return { + "data": { + "action": action, + "event": _serialize_event(event), + "undoable": false, + "reason": "Input bindings are saved to project.godot", + } + } + + +func ensure_binding(params: Dictionary) -> Dictionary: + var action: String = params.get("action", "") + var event_type: String = params.get("event_type", "") + var deadzone: float = params.get("deadzone", 0.5) + + if action.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: action") + if event_type.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: event_type") + + var deadzone_error := _validate_deadzone(deadzone) + if deadzone_error.has("error"): + return deadzone_error + + var event_or_error = _create_event(event_type, params) + if event_or_error is Dictionary: + return event_or_error + var event: InputEvent = event_or_error + + var ensured := _ensure_action_state(action, deadzone) + if ensured.has("error"): + return ensured + + for existing in InputMap.action_get_events(action): + if _events_match(existing, event): + return { + "data": { + "action": action, + "event": _serialize_event(existing), + "already_bound": true, + "action_created": ensured.get("created", false), + "undoable": false, + "reason": "Input binding already exists", + } + } + + InputMap.action_add_event(action, event) + var err := _save_action_events(action) + if err != OK: + InputMap.action_erase_event(action, event) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while binding event to action '%s': %s (error %d)" % [action, error_string(err), err]) + + return { + "data": { + "action": action, + "event": _serialize_event(event), + "already_bound": false, + "action_created": ensured.get("created", false), + "undoable": false, + "reason": "Input bindings are saved to project.godot", + } + } + + +func _validate_deadzone(deadzone: float) -> Dictionary: + if deadzone < 0.0 or deadzone > 1.0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "deadzone must be in [0.0, 1.0] (got %s). Typical values are 0.2-0.5; default is 0.5." % deadzone) + return {} + + +func _ensure_action_state(action: String, deadzone: float) -> Dictionary: + var key := "input/%s" % action + var user_authored := _read_user_authored_actions() + var existed_in_input_map := InputMap.has_action(action) + var existed_in_project := user_authored.has(action) or ProjectSettings.has_setting(key) + var old_setting = user_authored.get(action, null) if user_authored.has(action) else null + if old_setting == null and ProjectSettings.has_setting(key): + old_setting = ProjectSettings.get_setting(key) + + if not existed_in_input_map: + var dz := deadzone + if old_setting is Dictionary: + dz = float(old_setting.get("deadzone", deadzone)) + InputMap.add_action(action, dz) + if old_setting is Dictionary: + for ev in old_setting.get("events", []): + if ev is InputEvent: + InputMap.action_add_event(action, ev) + + if not existed_in_project: + var err := _save_action_events(action) + if err != OK: + if not existed_in_input_map: + InputMap.erase_action(action) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, + "Failed to save project settings while ensuring action '%s': %s (error %d)" % [action, error_string(err), err]) + + var stored_deadzone := deadzone + if ProjectSettings.has_setting(key): + var stored = ProjectSettings.get_setting(key) + if stored is Dictionary: + stored_deadzone = float(stored.get("deadzone", deadzone)) + return { + "action": action, + "deadzone": stored_deadzone, + "created": not existed_in_input_map and not existed_in_project, + "already_exists": existed_in_input_map or existed_in_project, + "loaded_in_input_map": true, + "persisted": true, + "undoable": false, + "reason": "Input actions are saved to project.godot", + } + + +## Returns an InputEvent on success, or a Dictionary error on failure. +## Caller must check ``result is Dictionary`` before treating it as an event. +func _create_event(event_type: String, params: Dictionary): + match event_type: + "key": + var ev := InputEventKey.new() + var keycode_str: String = params.get("keycode", "") + if keycode_str.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "event_type='key' requires keycode (e.g. 'Space', 'A', 'Enter', 'Escape', 'F1').") + ev.keycode = OS.find_keycode_from_string(keycode_str) + if ev.keycode == KEY_NONE: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid keycode '%s'. Use Godot keycode names like 'A', 'Space', 'Enter', 'Escape', 'F1', 'Left', 'Right'." % keycode_str) + ev.ctrl_pressed = params.get("ctrl", false) + ev.alt_pressed = params.get("alt", false) + ev.shift_pressed = params.get("shift", false) + ev.meta_pressed = params.get("meta", false) + ev.device = -1 + return ev + "mouse_button": + if not params.has("button"): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "event_type='mouse_button' requires button (1=left, 2=right, 3=middle, 4=wheel up, 5=wheel down).") + var button: int = int(params.get("button", 0)) + if button <= 0: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "mouse_button button must be > 0 (got %d). Use 1=left, 2=right, 3=middle, 4=wheel up, 5=wheel down." % button) + var ev := InputEventMouseButton.new() + ev.button_index = button + ev.device = -1 + return ev + "joy_button": + if not params.has("button"): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "event_type='joy_button' requires button (JoyButton index, e.g. 0=A/Cross, 1=B/Circle).") + var ev := InputEventJoypadButton.new() + ev.button_index = int(params.get("button", 0)) + return ev + "joy_axis": + var axis_param = params.get("axis", null) + if axis_param == null: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, + "event_type='joy_axis' requires axis (JoyAxis index, e.g. 0=left stick X, 1=left stick Y).") + var axis: int + match typeof(axis_param): + TYPE_INT: + axis = axis_param + TYPE_FLOAT: + if axis_param != floor(axis_param): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "joy_axis axis must be an integer JoyAxis index (got %s)." % str(axis_param)) + axis = int(axis_param) + TYPE_STRING: + var axis_text := str(axis_param) + if not axis_text.is_valid_int(): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "joy_axis axis must be an integer JoyAxis index (got '%s')." % axis_text) + axis = int(axis_text) + _: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "joy_axis axis must be an integer JoyAxis index (got %s)." % type_string(typeof(axis_param))) + var ev := InputEventJoypadMotion.new() + ev.axis = axis + ev.axis_value = float(params.get("axis_value", 1.0)) + return ev + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Unsupported event_type: '%s'. Use 'key', 'mouse_button', 'joy_button', or 'joy_axis'." % event_type) + + +func _serialize_event(event: InputEvent) -> Dictionary: + if event is InputEventKey: + return { + "type": "key", + "keycode": OS.get_keycode_string(event.keycode), + "physical_keycode": OS.get_keycode_string(event.physical_keycode), + "ctrl": event.ctrl_pressed, + "alt": event.alt_pressed, + "shift": event.shift_pressed, + "meta": event.meta_pressed, + } + if event is InputEventMouseButton: + return { + "type": "mouse_button", + "button": event.button_index, + } + if event is InputEventJoypadButton: + return { + "type": "joy_button", + "button": event.button_index, + } + if event is InputEventJoypadMotion: + return { + "type": "joy_axis", + "axis": event.axis, + "axis_value": event.axis_value, + } + return {"type": event.get_class(), "string": str(event)} + + +func _events_match(a: InputEvent, b: InputEvent) -> bool: + if a is InputEventKey and b is InputEventKey: + return _key_events_match(a as InputEventKey, b as InputEventKey) + return _serialize_event(a) == _serialize_event(b) + + +func _key_events_match(a: InputEventKey, b: InputEventKey) -> bool: + if a.ctrl_pressed != b.ctrl_pressed: + return false + if a.alt_pressed != b.alt_pressed: + return false + if a.shift_pressed != b.shift_pressed: + return false + if a.meta_pressed != b.meta_pressed: + return false + var a_codes := [a.keycode, a.physical_keycode] + var b_codes := [b.keycode, b.physical_keycode] + for a_code in a_codes: + if int(a_code) == KEY_NONE: + continue + for b_code in b_codes: + if int(b_code) != KEY_NONE and int(a_code) == int(b_code): + return true + return false + + +func _save_action_events(action: String) -> int: + var events: Array = [] + for event in InputMap.action_get_events(action): + events.append(event) + var key := "input/%s" % action + var had_setting := ProjectSettings.has_setting(key) + var old_setting = ProjectSettings.get_setting(key) if had_setting else null + var deadzone: float = 0.5 + if old_setting is Dictionary: + deadzone = old_setting.get("deadzone", 0.5) + elif InputMap.has_action(action): + deadzone = InputMap.action_get_deadzone(action) + ProjectSettings.set_setting(key, { + "deadzone": deadzone, + "events": events, + }) + var err := ProjectSettings.save() + if err != OK: + if had_setting: + ProjectSettings.set_setting(key, old_setting) + else: + ProjectSettings.clear(key) + return err diff --git a/addons/godot_ai/handlers/input_handler.gd.uid b/addons/godot_ai/handlers/input_handler.gd.uid new file mode 100644 index 0000000..7d509f4 --- /dev/null +++ b/addons/godot_ai/handlers/input_handler.gd.uid @@ -0,0 +1 @@ +uid://buk68rbwssqwp diff --git a/addons/godot_ai/handlers/material_handler.gd b/addons/godot_ai/handlers/material_handler.gd new file mode 100644 index 0000000..d8a4981 --- /dev/null +++ b/addons/godot_ai/handlers/material_handler.gd @@ -0,0 +1,809 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles Material authoring: creating .tres files, setting BaseMaterial3D +## properties / shader uniforms, assigning to nodes, high-level presets. +## +## File-resource lifecycle mirrors ThemeHandler (create/load/mutate/save). +## Undo pattern mirrors AnimationHandler (single create_action bundles +## every dependency spawn). + +const MaterialValues := preload("res://addons/godot_ai/handlers/material_values.gd") +const MaterialPresets := preload("res://addons/godot_ai/handlers/material_presets.gd") + +const _TYPE_TO_CLASS := { + "standard": "StandardMaterial3D", + "orm": "ORMMaterial3D", + "canvas_item": "CanvasItemMaterial", + "shader": "ShaderMaterial", +} + +const _SUPPORTED_SUFFIXES := [".tres", ".material", ".res"] + + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +# ============================================================================ +# material_create +# ============================================================================ + +func create_material(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var type_str: String = params.get("type", "standard") + var shader_path: String = params.get("shader_path", "") + var overwrite: bool = params.get("overwrite", false) + + var err := _validate_material_path(path, "path", true) + if err != null: + return err + + if not _TYPE_TO_CLASS.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid material type '%s'. Valid: %s" % [type_str, ", ".join(_TYPE_TO_CLASS.keys())] + ) + + var existed_before := FileAccess.file_exists(path) + if existed_before and not overwrite: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Material already exists at %s (pass overwrite=true to replace)" % path + ) + + var mat := _instantiate_material(type_str) + if mat == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate material") + + if type_str == "shader": + if shader_path.is_empty(): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "ShaderMaterial requires shader_path (res:// / uid:// / user:// path to a .gdshader)" + ) + var shader_path_err = McpPathValidator.loadable_error(shader_path, "shader_path") + if shader_path_err != null: + return shader_path_err + if not ResourceLoader.exists(shader_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Shader not found: %s" % shader_path) + var shader_res := ResourceLoader.load(shader_path) + if not (shader_res is Shader): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Shader" % shader_path) + (mat as ShaderMaterial).shader = shader_res + + var dir_path := path.get_base_dir() + var mkdir_err := DirAccess.make_dir_recursive_absolute(dir_path) + if mkdir_err != OK and mkdir_err != ERR_ALREADY_EXISTS: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to create directory: %s (error %d)" % [dir_path, mkdir_err] + ) + + var save_err := McpResourceIO.guarded_save(mat, path, _connection) + if save_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to save material to %s (error %d)" % [path, save_err] + ) + + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + return { + "data": { + "path": path, + "type": type_str, + "class": mat.get_class(), + "shader_path": shader_path, + "overwritten": existed_before, + "undoable": false, + "reason": "File creation is persistent; delete the file manually to revert", + } + } + + +# ============================================================================ +# material_set_param +# ============================================================================ + +func set_param(params: Dictionary) -> Dictionary: + var load_result := _load_material_from_path(params.get("path", ""), true) + if load_result.has("error"): + return load_result + var mat: Material = load_result.material + var mat_path: String = load_result.path + + var property: String = params.get("param", "") + if property.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: param") + + if not ("value" in params): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: value") + + var raw_value = params.get("value") + + # Probe the property. We allow any property present in get_property_list, + # plus `shader` on ShaderMaterial. + var prop_type: int = TYPE_NIL + var property_exists := false + for prop in mat.get_property_list(): + if prop.name == property: + property_exists = true + prop_type = prop.get("type", TYPE_NIL) + break + if not property_exists: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(mat, property) + ) + + var coerced := MaterialValues.coerce_material_value(property, raw_value, prop_type) + if not coerced.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerced.error)) + var new_value = coerced.value + + var old_value = mat.get(property) + + _undo_redo.create_action("MCP: Set material %s.%s" % [mat_path.get_file(), property]) + _undo_redo.add_do_method(self, "_apply_param", mat_path, property, new_value, false) + _undo_redo.add_undo_method(self, "_apply_param", mat_path, property, old_value, false) + _undo_redo.commit_action() + + return { + "data": { + "path": mat_path, + "property": property, + "value": MaterialValues.serialize_value(new_value), + "previous_value": MaterialValues.serialize_value(old_value), + "undoable": true, + } + } + + +# ============================================================================ +# material_set_shader_param +# ============================================================================ + +func set_shader_param(params: Dictionary) -> Dictionary: + var load_result := _load_material_from_path(params.get("path", ""), true) + if load_result.has("error"): + return load_result + var mat: Material = load_result.material + var mat_path: String = load_result.path + + if not (mat is ShaderMaterial): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Material at %s is %s, not ShaderMaterial" % [mat_path, mat.get_class()] + ) + var shader_mat := mat as ShaderMaterial + if shader_mat.shader == null: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "ShaderMaterial at %s has no shader assigned" % mat_path + ) + + var param_name: String = params.get("param", "") + if param_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: param") + + if not ("value" in params): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: value") + + # Verify the uniform exists in the shader. + var uniform_type := _shader_uniform_type(shader_mat.shader, param_name) + if uniform_type == TYPE_NIL: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Shader uniform '%s' not declared on shader at %s" % [param_name, shader_mat.shader.resource_path] + ) + + var raw_value = params.get("value") + var coerced := MaterialValues.coerce_material_value(param_name, raw_value, uniform_type) + if not coerced.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerced.error)) + var new_value = coerced.value + + var old_value = shader_mat.get_shader_parameter(param_name) + + _undo_redo.create_action("MCP: Set shader param %s.%s" % [mat_path.get_file(), param_name]) + _undo_redo.add_do_method(self, "_apply_shader_param", mat_path, param_name, new_value) + _undo_redo.add_undo_method(self, "_apply_shader_param", mat_path, param_name, old_value) + _undo_redo.commit_action() + + return { + "data": { + "path": mat_path, + "param": param_name, + "value": MaterialValues.serialize_value(new_value), + "previous_value": MaterialValues.serialize_value(old_value), + "undoable": true, + } + } + + +# ============================================================================ +# material_get +# ============================================================================ + +func get_material(params: Dictionary) -> Dictionary: + var load_result := _load_material_from_path(params.get("path", "")) + if load_result.has("error"): + return load_result + var mat: Material = load_result.material + var mat_path: String = load_result.path + + var properties: Array[Dictionary] = [] + for prop in mat.get_property_list(): + var usage: int = prop.get("usage", 0) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + var name: String = prop.name + if name.begins_with("shader_parameter/"): + continue # handled below + var value = mat.get(name) + if value == null and prop.type != TYPE_NIL: + continue + properties.append({ + "name": name, + "type": type_string(prop.type), + "value": MaterialValues.serialize_value(value), + }) + + var shader_params: Array[Dictionary] = [] + if mat is ShaderMaterial: + var shader_mat := mat as ShaderMaterial + if shader_mat.shader != null: + for u in shader_mat.shader.get_shader_uniform_list(): + var u_name: String = u.get("name", "") + if u_name.is_empty(): + continue + shader_params.append({ + "name": u_name, + "type": type_string(u.get("type", TYPE_NIL)), + "value": MaterialValues.serialize_value(shader_mat.get_shader_parameter(u_name)), + }) + + var reverse_type_map := _reverse_type_map() + + var shader_path_str := "" + if mat is ShaderMaterial: + var sm := mat as ShaderMaterial + if sm.shader != null: + shader_path_str = sm.shader.resource_path + + return { + "data": { + "path": mat_path, + "class": mat.get_class(), + "type": reverse_type_map.get(mat.get_class(), ""), + "properties": properties, + "property_count": properties.size(), + "shader_parameters": shader_params, + "shader_path": shader_path_str, + } + } + + +# ============================================================================ +# material_list +# ============================================================================ + +func list_materials(params: Dictionary) -> Dictionary: + var root: String = params.get("root", "res://") + var type_filter: String = params.get("type", "") + + var root_err = McpPathValidator.path_error(root, "root") + if root_err != null: + return root_err + + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var results: Array[Dictionary] = [] + var start_dir := efs.get_filesystem_path(root) + if start_dir == null: + start_dir = efs.get_filesystem() + _scan_materials(start_dir, type_filter, root, results) + + return {"data": {"materials": results, "count": results.size()}} + + +func _scan_materials(dir: EditorFileSystemDirectory, type_filter: String, root: String, out: Array[Dictionary]) -> void: + if dir == null: + return + for i in dir.get_file_count(): + var file_path := dir.get_file_path(i) + if not file_path.begins_with(root): + continue + var file_type := dir.get_file_type(i) + var is_material := file_type == "Material" or ClassDB.is_parent_class(file_type, "Material") + if not is_material: + # Some material variants serialize as specific classes. + if not (file_type in _TYPE_TO_CLASS.values()): + continue + + if not type_filter.is_empty(): + if file_type != type_filter and not ClassDB.is_parent_class(file_type, type_filter): + continue + + out.append({"path": file_path, "class": file_type}) + + for i in dir.get_subdir_count(): + _scan_materials(dir.get_subdir(i), type_filter, root, out) + + +# ============================================================================ +# material_assign +# ============================================================================ + +func assign_material(params: Dictionary) -> Dictionary: + var node_path: String = params.get("node_path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: node_path") + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + var slot: String = params.get("slot", "override") + var resource_path: String = params.get("resource_path", "") + var create_if_missing: bool = params.get("create_if_missing", false) + var type_str: String = params.get("type", "standard") + + var slot_result := _resolve_slot_property(node, slot) + if slot_result.has("error"): + return slot_result + var property: String = slot_result.property + + # Load or create the material. + var mat: Material = null + var material_created := false + if not resource_path.is_empty(): + var rpath_err = McpPathValidator.loadable_error(resource_path, "resource_path") + if rpath_err != null: + return rpath_err + if not ResourceLoader.exists(resource_path): + if create_if_missing: + # We'd need to create a new file here — refuse; callers should + # use material_create first or omit resource_path to get an + # inline material. + return ErrorCodes.make( + ErrorCodes.RESOURCE_NOT_FOUND, + "Resource not found: %s. Create it first with material_create or omit resource_path for an inline material." % resource_path + ) + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % resource_path) + var loaded := ResourceLoader.load(resource_path) + if not (loaded is Material): + var loaded_class := "null" + if loaded != null: + loaded_class = loaded.get_class() + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Resource at %s is not a Material (got %s)" % [resource_path, loaded_class] + ) + mat = loaded + else: + if not create_if_missing: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Missing resource_path (pass create_if_missing=true to create a new inline material)" + ) + if not _TYPE_TO_CLASS.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid material type '%s'" % type_str + ) + mat = _instantiate_material(type_str) + material_created = true + + var old_value = node.get(property) + + _undo_redo.create_action("MCP: Assign material to %s.%s" % [node.name, property]) + _undo_redo.add_do_property(node, property, mat) + _undo_redo.add_undo_property(node, property, old_value) + if material_created: + _undo_redo.add_do_reference(mat) + _undo_redo.commit_action() + + return { + "data": { + "node_path": node_path, + "property": property, + "slot": slot, + "resource_path": resource_path, + "material_class": mat.get_class(), + "material_created": material_created, + "undoable": true, + } + } + + +# ============================================================================ +# material_apply_to_node +# ============================================================================ + +func apply_to_node(params: Dictionary) -> Dictionary: + var node_path: String = params.get("node_path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: node_path") + + var type_str: String = params.get("type", "standard") + if not _TYPE_TO_CLASS.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid material type '%s'. Valid: %s" % [type_str, ", ".join(_TYPE_TO_CLASS.keys())] + ) + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + var slot: String = params.get("slot", "override") + var slot_result := _resolve_slot_property(node, slot) + if slot_result.has("error"): + return slot_result + var property: String = slot_result.property + + var mat := _instantiate_material(type_str) + + var props_to_set: Dictionary = params.get("params", {}) + var applied: Array[String] = [] + for prop_name in props_to_set: + var apply_err := _apply_one_param_on_instance(mat, String(prop_name), props_to_set[prop_name]) + if apply_err != null: + return apply_err + applied.append(String(prop_name)) + + var save_to: String = params.get("save_to", "") + var saved := false + var overwritten := false + if not save_to.is_empty(): + var save_err_validation := _validate_material_path(save_to, "save_to", true) + if save_err_validation != null: + return save_err_validation + # Same clobber guard as create_material/apply_preset: agents reuse + # names like res://materials/metal.tres, and a silent save here + # destroys a hand-authored file that undo can't restore (undo only + # reverts the node's slot assignment, not file contents). See #685. + var existed_before := FileAccess.file_exists(save_to) + if existed_before and not params.get("overwrite", false): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Material already exists at %s (pass overwrite=true to replace)" % save_to + ) + overwritten = existed_before + var dir_path := save_to.get_base_dir() + var mkdir_err := DirAccess.make_dir_recursive_absolute(dir_path) + if mkdir_err != OK and mkdir_err != ERR_ALREADY_EXISTS: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to create directory: %s" % dir_path) + var save_err := McpResourceIO.guarded_save(mat, save_to, _connection) + if save_err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to save material to %s (error %d)" % [save_to, save_err]) + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(save_to) + # Prefer the on-disk reference (keeps the scene ref small), but fall + # back to the in-memory material if the reload fails — otherwise a null + # would clear the slot and crash mat.get_class() below. + var reloaded := ResourceLoader.load(save_to) + if reloaded != null: + mat = reloaded + saved = true + + var old_value = node.get(property) + + _undo_redo.create_action("MCP: Apply %s material to %s" % [type_str, node.name]) + _undo_redo.add_do_property(node, property, mat) + _undo_redo.add_undo_property(node, property, old_value) + _undo_redo.add_do_reference(mat) + _undo_redo.commit_action() + + return { + "data": { + "node_path": node_path, + "property": property, + "slot": slot, + "type": type_str, + "class": mat.get_class(), + "applied_params": applied, + "material_created": true, + "saved_to": save_to if saved else "", + "overwritten": overwritten, + "undoable": true, + } + } + + +# ============================================================================ +# material_apply_preset +# ============================================================================ + +func apply_preset(params: Dictionary) -> Dictionary: + var preset_name: String = params.get("preset", "") + if preset_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: preset") + + var overrides: Dictionary = params.get("overrides", {}) + var blueprint = MaterialPresets.build(preset_name, overrides) + if blueprint == null: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown preset '%s'. Valid: %s" % [preset_name, ", ".join(MaterialPresets.list())] + ) + + var type_str: String = blueprint.get("type", "standard") + var preset_params: Dictionary = blueprint.get("params", {}) + + var path: String = params.get("path", "") + var node_path: String = params.get("node_path", "") + + if path.is_empty() and node_path.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "Pass at least one of: path (save to disk), node_path (assign to node)" + ) + + # If both path and node_path, save to disk, then assign the saved resource. + # If only path, save to disk. + # If only node_path, inline material via apply_to_node. + + if not node_path.is_empty() and path.is_empty(): + # Inline + var inline_result := apply_to_node({ + "node_path": node_path, + "type": type_str, + "params": preset_params, + "slot": params.get("slot", "override"), + }) + if inline_result.has("data"): + inline_result.data["preset"] = preset_name + inline_result.data["assigned"] = true + inline_result.data["path"] = "" + inline_result.data["saved_to_disk"] = false + inline_result.data["reason"] = "Inline material assigned to node" + return inline_result + + # Save-to-disk path. Validate the path BEFORE the exists/overwrite + # check, matching create_material's order — an invalid path should + # always be reported as invalid, not as an overwrite conflict. + var path_err := _validate_material_path(path, "path", true) + if path_err != null: + return path_err + + var existed_before := FileAccess.file_exists(path) + if existed_before and not params.get("overwrite", false): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Material already exists at %s (pass overwrite=true to replace)" % path + ) + + var mat := _instantiate_material(type_str) + for prop_name in preset_params: + var apply_err := _apply_one_param_on_instance(mat, String(prop_name), preset_params[prop_name]) + if apply_err != null: + return apply_err + + var dir_path := path.get_base_dir() + var mkdir_err := DirAccess.make_dir_recursive_absolute(dir_path) + if mkdir_err != OK and mkdir_err != ERR_ALREADY_EXISTS: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to create directory: %s" % dir_path) + + var save_err := McpResourceIO.guarded_save(mat, path, _connection) + if save_err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to save material: %s" % path) + + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + var assigned := false + if not node_path.is_empty(): + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + var slot_result := _resolve_slot_property(node, params.get("slot", "override")) + if slot_result.has("error"): + return slot_result + var property: String = slot_result.property + var saved_mat := ResourceLoader.load(path) + var old_value = node.get(property) + _undo_redo.create_action("MCP: Apply preset %s to %s" % [preset_name, node.name]) + _undo_redo.add_do_property(node, property, saved_mat) + _undo_redo.add_undo_property(node, property, old_value) + _undo_redo.commit_action() + assigned = true + + return { + "data": { + "preset": preset_name, + "type": type_str, + "path": path, + "node_path": node_path, + "material_created": true, + "assigned": assigned, + "saved_to_disk": true, + "undoable": assigned, # assign is undoable; save is not + "reason": "" if assigned else "File save is not undoable", + } + } + + +# ============================================================================ +# Undo-callable: applies a param on the loaded resource and saves. +# ============================================================================ + +func _apply_param(mat_path: String, property: String, value: Variant, _is_shader: bool) -> void: + var mat: Material = ResourceLoader.load(mat_path) + if mat == null: + push_warning("MCP: Failed to load material for undo/redo: %s" % mat_path) + return + mat.set(property, value) + McpResourceIO.guarded_save(mat, mat_path, _connection) + + +func _apply_shader_param(mat_path: String, param_name: String, value: Variant) -> void: + var mat: Material = ResourceLoader.load(mat_path) + if mat == null or not (mat is ShaderMaterial): + push_warning("MCP: Failed to load shader material for undo/redo: %s" % mat_path) + return + (mat as ShaderMaterial).set_shader_parameter(param_name, value) + McpResourceIO.guarded_save(mat, mat_path, _connection) + + +# ============================================================================ +# Helpers +# ============================================================================ + +static func _instantiate_material(type_str: String) -> Material: + match type_str: + "standard": + return StandardMaterial3D.new() + "orm": + return ORMMaterial3D.new() + "canvas_item": + return CanvasItemMaterial.new() + "shader": + return ShaderMaterial.new() + return null + + +static func _reverse_type_map() -> Dictionary: + var out := {} + for k in _TYPE_TO_CLASS: + out[_TYPE_TO_CLASS[k]] = k + return out + + +static func _validate_material_path(path: String, param_name: String, for_write: bool = false) -> Variant: + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: %s" % param_name) + var path_err := McpPathValidator.validate_resource_path(path, for_write) + if not path_err.is_empty(): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "%s: %s" % [param_name, path_err]) + var has_suffix := false + for s in _SUPPORTED_SUFFIXES: + if path.ends_with(s): + has_suffix = true + break + if not has_suffix: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "%s must end with one of %s (got %s)" % [param_name, ", ".join(_SUPPORTED_SUFFIXES), path] + ) + return null + + +func _load_material_from_path(path: String, for_write: bool = false) -> Dictionary: + var err := _validate_material_path(path, "path", for_write) + if err != null: + return err + if not ResourceLoader.exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Material not found: %s" % path) + var res := ResourceLoader.load(path) + if res == null or not (res is Material): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Material" % path) + return {"material": res, "path": path} + + +## Map a slot name to a Godot property name on the given node. +## Returns {property: "..."} or an error dict. +func _resolve_slot_property(node: Node, slot: String) -> Dictionary: + if slot == "override": + if node is MeshInstance3D or node is CSGShape3D: + return {"property": "material_override"} + if node is CanvasItem: + return {"property": "material"} + if node is GPUParticles3D or node is GPUParticles2D or node is CPUParticles3D or node is CPUParticles2D: + return {"property": "material_override"} if node is GeometryInstance3D else {"property": "material"} + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Slot 'override' not supported on %s" % node.get_class() + ) + if slot == "canvas": + if node is CanvasItem: + return {"property": "material"} + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Slot 'canvas' requires a CanvasItem (got %s)" % node.get_class() + ) + if slot == "process": + if node is GPUParticles3D or node is GPUParticles2D: + return {"property": "process_material"} + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Slot 'process' requires a GPUParticles2D/3D (got %s)" % node.get_class() + ) + if slot.begins_with("surface_"): + if not (node is MeshInstance3D): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Slot '%s' requires a MeshInstance3D (got %s)" % [slot, node.get_class()] + ) + var idx_str := slot.substr(len("surface_")) + if not idx_str.is_valid_int(): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid surface slot: %s" % slot) + var idx := int(idx_str) + var mi := node as MeshInstance3D + var surf_count := mi.mesh.get_surface_count() if mi.mesh != null else 0 + if idx < 0 or idx >= surf_count: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Surface index %d out of range (mesh has %d surfaces)" % [idx, surf_count] + ) + return {"property": "surface_material_override/%d" % idx} + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown slot '%s'. Valid: override, canvas, process, surface_N" % slot + ) + + +## Apply one property to an in-memory material instance; returns null on +## success or an error dict on failure. +func _apply_one_param_on_instance(mat: Material, property: String, raw_value: Variant) -> Variant: + var prop_type: int = TYPE_NIL + var property_exists := false + for prop in mat.get_property_list(): + if prop.name == property: + property_exists = true + prop_type = prop.get("type", TYPE_NIL) + break + if not property_exists: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(mat, property) + ) + var coerced := MaterialValues.coerce_material_value(property, raw_value, prop_type) + if not coerced.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerced.error)) + mat.set(property, coerced.value) + return null + + +## Inspect a shader to get the Variant type of a uniform. Returns TYPE_NIL if +## the uniform is not declared. +static func _shader_uniform_type(shader: Shader, name: String) -> int: + if shader == null: + return TYPE_NIL + for u in shader.get_shader_uniform_list(): + if u.get("name", "") == name: + return int(u.get("type", TYPE_NIL)) + return TYPE_NIL diff --git a/addons/godot_ai/handlers/material_handler.gd.uid b/addons/godot_ai/handlers/material_handler.gd.uid new file mode 100644 index 0000000..fdf789a --- /dev/null +++ b/addons/godot_ai/handlers/material_handler.gd.uid @@ -0,0 +1 @@ +uid://blh4norn3rjga diff --git a/addons/godot_ai/handlers/material_presets.gd b/addons/godot_ai/handlers/material_presets.gd new file mode 100644 index 0000000..db48036 --- /dev/null +++ b/addons/godot_ai/handlers/material_presets.gd @@ -0,0 +1,92 @@ +@tool +extends RefCounted + +## Curated material preset blueprints. +## +## Each preset returns {type, params}. Handler applies them through the +## normal material build path so they get undo + validation for free. + + +const _PRESETS := { + "metal": { + "type": "orm", + "params": { + "metallic": 1.0, + "roughness": 0.25, + "albedo_color": {"r": 0.85, "g": 0.85, "b": 0.88, "a": 1.0}, + }, + }, + "glass": { + "type": "standard", + "params": { + "transparency": "alpha", + "albedo_color": {"r": 0.9, "g": 0.95, "b": 1.0, "a": 0.3}, + "metallic": 0.0, + "metallic_specular": 0.5, + "roughness": 0.05, + "refraction_enabled": true, + "refraction_scale": 0.05, + }, + }, + "emissive": { + "type": "standard", + "params": { + "emission_enabled": true, + "emission_energy_multiplier": 3.0, + "emission": {"r": 1.0, "g": 1.0, "b": 1.0, "a": 1.0}, + "albedo_color": {"r": 1.0, "g": 1.0, "b": 1.0, "a": 1.0}, + }, + }, + "unlit": { + "type": "standard", + "params": { + "shading_mode": "unshaded", + "albedo_color": {"r": 1.0, "g": 1.0, "b": 1.0, "a": 1.0}, + }, + }, + "matte": { + "type": "standard", + "params": { + "roughness": 1.0, + "metallic": 0.0, + "albedo_color": {"r": 0.7, "g": 0.7, "b": 0.7, "a": 1.0}, + }, + }, + "ceramic": { + "type": "standard", + "params": { + "roughness": 0.4, + "metallic": 0.0, + "clearcoat_enabled": true, + "clearcoat": 0.7, + "clearcoat_roughness": 0.15, + "albedo_color": {"r": 0.95, "g": 0.95, "b": 0.95, "a": 1.0}, + }, + }, +} + + +static func list() -> Array: + return _PRESETS.keys() + + +static func has(preset_name: String) -> bool: + return _PRESETS.has(preset_name) + + +## Returns a deep-copied {type, params} blueprint for the named preset, or +## null if the preset is unknown. Overrides are merged into params. +static func build(preset_name: String, overrides: Dictionary) -> Variant: + if not _PRESETS.has(preset_name): + return null + var entry: Dictionary = _PRESETS[preset_name].duplicate(true) + var params: Dictionary = entry.get("params", {}) + # Allow overrides to change type, too. + if overrides.has("type"): + entry["type"] = overrides["type"] + for key in overrides: + if key == "type": + continue + params[key] = overrides[key] + entry["params"] = params + return entry diff --git a/addons/godot_ai/handlers/material_presets.gd.uid b/addons/godot_ai/handlers/material_presets.gd.uid new file mode 100644 index 0000000..2f46051 --- /dev/null +++ b/addons/godot_ai/handlers/material_presets.gd.uid @@ -0,0 +1 @@ +uid://bnuwye1r8ow7g diff --git a/addons/godot_ai/handlers/material_values.gd b/addons/godot_ai/handlers/material_values.gd new file mode 100644 index 0000000..d6a7f1d --- /dev/null +++ b/addons/godot_ai/handlers/material_values.gd @@ -0,0 +1,194 @@ +@tool +extends RefCounted + +## Value coercion helpers for material authoring. +## +## Extends node_handler._coerce_value with material-specific cases: +## - enum-by-name (transparency="alpha" → TRANSPARENCY_ALPHA) +## - texture path → Texture2D +## - {r,g,b,a} dict → Color (also handled by node coerce, but we want it inline) + + +const _ENUM_TABLES := { + "transparency": { + "disabled": BaseMaterial3D.TRANSPARENCY_DISABLED, + "alpha": BaseMaterial3D.TRANSPARENCY_ALPHA, + "alpha_scissor": BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR, + "alpha_hash": BaseMaterial3D.TRANSPARENCY_ALPHA_HASH, + "alpha_depth_pre_pass": BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS, + }, + "shading_mode": { + "unshaded": BaseMaterial3D.SHADING_MODE_UNSHADED, + "per_pixel": BaseMaterial3D.SHADING_MODE_PER_PIXEL, + "per_vertex": BaseMaterial3D.SHADING_MODE_PER_VERTEX, + }, + "blend_mode": { + "mix": BaseMaterial3D.BLEND_MODE_MIX, + "add": BaseMaterial3D.BLEND_MODE_ADD, + "sub": BaseMaterial3D.BLEND_MODE_SUB, + "mul": BaseMaterial3D.BLEND_MODE_MUL, + }, + "cull_mode": { + "back": BaseMaterial3D.CULL_BACK, + "front": BaseMaterial3D.CULL_FRONT, + "disabled": BaseMaterial3D.CULL_DISABLED, + }, + "depth_draw_mode": { + "opaque_only": BaseMaterial3D.DEPTH_DRAW_OPAQUE_ONLY, + "always": BaseMaterial3D.DEPTH_DRAW_ALWAYS, + "disabled": BaseMaterial3D.DEPTH_DRAW_DISABLED, + }, + "diffuse_mode": { + "burley": BaseMaterial3D.DIFFUSE_BURLEY, + "lambert": BaseMaterial3D.DIFFUSE_LAMBERT, + "lambert_wrap": BaseMaterial3D.DIFFUSE_LAMBERT_WRAP, + "toon": BaseMaterial3D.DIFFUSE_TOON, + }, + "specular_mode": { + "schlick_ggx": BaseMaterial3D.SPECULAR_SCHLICK_GGX, + "toon": BaseMaterial3D.SPECULAR_TOON, + "disabled": BaseMaterial3D.SPECULAR_DISABLED, + }, + "billboard_mode": { + "disabled": BaseMaterial3D.BILLBOARD_DISABLED, + "enabled": BaseMaterial3D.BILLBOARD_ENABLED, + "fixed_y": BaseMaterial3D.BILLBOARD_FIXED_Y, + "particles": BaseMaterial3D.BILLBOARD_PARTICLES, + }, + "texture_filter": { + "nearest": BaseMaterial3D.TEXTURE_FILTER_NEAREST, + "linear": BaseMaterial3D.TEXTURE_FILTER_LINEAR, + "nearest_mipmap": BaseMaterial3D.TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, + "linear_mipmap": BaseMaterial3D.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, + }, +} + + +## Return the enum int for (property, string_name), or null if not a known enum string. +static func resolve_enum(property: String, value: Variant) -> Variant: + if not (value is String): + return null + if not _ENUM_TABLES.has(property): + return null + var table: Dictionary = _ENUM_TABLES[property] + var key: String = String(value).to_lower() + if table.has(key): + return table[key] + return null + + +## Parse a color from Color, "#rrggbb(aa)", named string, {r,g,b[,a]} dict, +## or [r,g,b(,a)] array. Delegates to the canonical parser (#714); returns +## null if the input cannot be parsed. +static func parse_color(value: Variant) -> Variant: + return McpJsonValues.parse_color(value) + + +static func parse_vector3(value: Variant) -> Variant: + return McpJsonValues.parse_vector3(value) + + +static func parse_vector2(value: Variant) -> Variant: + return McpJsonValues.parse_vector2(value) + + +## Load a Texture2D from a res:// / uid:// / user:// path (validate_loadable_path). +## Returns null on failure (including a path that fails confinement / traversal). +static func load_texture(path: String) -> Texture2D: + if not McpPathValidator.validate_loadable_path(path).is_empty(): + return null + if not ResourceLoader.exists(path): + return null + var res := ResourceLoader.load(path) + if res is Texture2D: + return res + return null + + +## Coerce a JSON-shaped value for a material property. +## Returns a dict {ok: true, value: ...} on success, or {ok: false, error: "..."} on failure. +## For properties the coercer doesn't have special logic for, falls back to target_type. +static func coerce_material_value(property: String, value: Variant, target_type: int) -> Dictionary: + # Enum-by-name: must match before generic TYPE_INT coercion. + if _ENUM_TABLES.has(property): + if value is String: + var enum_val = resolve_enum(property, value) + if enum_val == null: + return { + "ok": false, + "error": "Invalid %s value: '%s'. Valid: %s" % [ + property, value, ", ".join(_ENUM_TABLES[property].keys()) + ], + } + return {"ok": true, "value": int(enum_val)} + if value is int or value is float: + return {"ok": true, "value": int(value)} + + match target_type: + TYPE_COLOR: + var c = parse_color(value) + if c == null: + return {"ok": false, "error": "Invalid color for %s: %s" % [property, value]} + return {"ok": true, "value": c} + TYPE_VECTOR3: + var v3 = parse_vector3(value) + if v3 == null: + return {"ok": false, "error": "Invalid vector3 for %s: %s" % [property, value]} + return {"ok": true, "value": v3} + TYPE_VECTOR2: + var v2 = parse_vector2(value) + if v2 == null: + return {"ok": false, "error": "Invalid vector2 for %s: %s" % [property, value]} + return {"ok": true, "value": v2} + TYPE_BOOL: + if value is bool: + return {"ok": true, "value": value} + if value is int or value is float: + return {"ok": true, "value": bool(value)} + return {"ok": false, "error": "Expected bool for %s" % property} + TYPE_INT: + if value is int: + return {"ok": true, "value": value} + if value is float: + return {"ok": true, "value": int(value)} + return {"ok": false, "error": "Expected int for %s" % property} + TYPE_FLOAT: + if value is float: + return {"ok": true, "value": value} + if value is int: + return {"ok": true, "value": float(value)} + return {"ok": false, "error": "Expected number for %s" % property} + TYPE_OBJECT: + if value == null: + return {"ok": true, "value": null} + if value is Object: + return {"ok": true, "value": value} + if value is String: + var tex := load_texture(value) + if tex == null: + return {"ok": false, "error": "Resource not found or wrong type: %s" % value} + return {"ok": true, "value": tex} + return {"ok": false, "error": "Expected resource path (string) for %s" % property} + TYPE_STRING: + return {"ok": true, "value": String(value)} + + # Unknown target type — pass through. + return {"ok": true, "value": value} + + +## Serialize a Variant into JSON-friendly shape for responses. +static func serialize_value(value: Variant) -> Variant: + if value == null: + return null + if value is Color: + return {"r": value.r, "g": value.g, "b": value.b, "a": value.a} + if value is Vector3: + return {"x": value.x, "y": value.y, "z": value.z} + if value is Vector2: + return {"x": value.x, "y": value.y} + if value is Resource: + var path := (value as Resource).resource_path + if path.is_empty(): + return {"type": value.get_class(), "path": ""} + return {"type": value.get_class(), "path": path} + return value diff --git a/addons/godot_ai/handlers/material_values.gd.uid b/addons/godot_ai/handlers/material_values.gd.uid new file mode 100644 index 0000000..7f8bbe9 --- /dev/null +++ b/addons/godot_ai/handlers/material_values.gd.uid @@ -0,0 +1 @@ +uid://daqgjkflia8nk diff --git a/addons/godot_ai/handlers/node_handler.gd b/addons/godot_ai/handlers/node_handler.gd new file mode 100644 index 0000000..6d7e1ff --- /dev/null +++ b/addons/godot_ai/handlers/node_handler.gd @@ -0,0 +1,1390 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const VariantSerializer := preload("res://addons/godot_ai/utils/variant_serializer.gd") + +## Handles node creation and manipulation with undo/redo support. + +const ResourceHandler := preload("res://addons/godot_ai/handlers/resource_handler.gd") + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +func create_node(params: Dictionary) -> Dictionary: + var node_type: String = params.get("type", "") + var node_name: String = params.get("name", "") + var parent_path: String = params.get("parent_path", "") + var scene_path: String = params.get("scene_path", "") + + var scene_check := McpScenePath.require_edited_scene(params.get("scene_file", "")) + if scene_check.has("error"): + return scene_check + var scene_root: Node = scene_check.node + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var new_node: Node + + if not scene_path.is_empty(): + # Scene instancing path — load and instantiate a PackedScene. + # GEN_EDIT_STATE_INSTANCE makes the editor treat the result as a real + # scene instance (foldout icon, the .tscn stores a reference instead of + # an exploded subtree). Descendants remain owned by their sub-scene; + # setting their owner to our scene_root would break the instance link. + var scene_path_err = McpPathValidator.loadable_error(scene_path, "scene_path") + if scene_path_err != null: + return scene_path_err + if not ResourceLoader.exists(scene_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Scene not found: %s" % scene_path) + var packed_scene = ResourceLoader.load(scene_path) + if packed_scene == null or not packed_scene is PackedScene: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a PackedScene" % scene_path) + new_node = packed_scene.instantiate(PackedScene.GEN_EDIT_STATE_INSTANCE) + if new_node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate scene: %s" % scene_path) + else: + # ClassDB path — create by type. + if node_type.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: type (or provide scene_path)") + if not ClassDB.class_exists(node_type): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown node type: %s" % node_type) + if not ClassDB.is_parent_class(node_type, "Node"): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s is not a Node type" % node_type) + new_node = ClassDB.instantiate(node_type) + if new_node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % node_type) + + if not node_name.is_empty(): + new_node.name = node_name + + _undo_redo.create_action("MCP: Create %s" % new_node.name) + _undo_redo.add_do_method(parent, "add_child", new_node, true) + _undo_redo.add_do_method(new_node, "set_owner", scene_root) + _undo_redo.add_do_reference(new_node) + _undo_redo.add_undo_method(parent, "remove_child", new_node) + _undo_redo.commit_action() + + var response := { + "name": new_node.name, + "type": new_node.get_class(), + "path": McpScenePath.from_node(new_node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "undoable": true, + } + if not scene_path.is_empty(): + response["scene_path"] = scene_path + return {"data": response} + + +func delete_node(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var root_err := _reject_if_scene_root(node, scene_root, "delete") + if root_err != null: + return root_err + + var parent := node.get_parent() + var idx := node.get_index() + + _undo_redo.create_action("MCP: Delete %s" % node.name) + _undo_redo.add_do_method(parent, "remove_child", node) + _undo_redo.add_undo_method(parent, "add_child", node, true) + _undo_redo.add_undo_method(parent, "move_child", node, idx) + _undo_redo.add_undo_method(node, "set_owner", scene_root) + _undo_redo.add_undo_reference(node) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "undoable": true, + } + } + + +func reparent_node(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var new_parent_path: String = params.get("new_parent", "") + if new_parent_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: new_parent") + + var new_parent := McpScenePath.resolve(new_parent_path, scene_root) + if new_parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(new_parent_path, scene_root)) + + var root_err := _reject_if_scene_root(node, scene_root, "reparent") + if root_err != null: + return root_err + + # Prevent reparenting a node to itself or to one of its own descendants. + # Godot's `A.is_ancestor_of(B)` returns true iff B is a descendant of A, so + # the direction here matters: we want `node.is_ancestor_of(new_parent)` to + # catch "new_parent is below node in the tree" and thus would create a + # cycle. The previous direction (`new_parent.is_ancestor_of(node)`) asked + # the opposite question — whether we were trying to move a node to one of + # its own ancestors — which is a perfectly valid operation. See issue #121. + if node == new_parent or node.is_ancestor_of(new_parent): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Cannot reparent a node to itself or its descendant") + + var old_parent := node.get_parent() + var old_idx := node.get_index() + + _undo_redo.create_action("MCP: Reparent %s" % node.name) + _undo_redo.add_do_method(old_parent, "remove_child", node) + _undo_redo.add_do_method(new_parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + _undo_redo.add_undo_method(new_parent, "remove_child", node) + _undo_redo.add_undo_method(old_parent, "add_child", node, true) + _undo_redo.add_undo_method(old_parent, "move_child", node, old_idx) + _undo_redo.add_undo_method(node, "set_owner", scene_root) + _undo_redo.add_undo_reference(node) + _undo_redo.commit_action() + + # Re-set owner for all descendants (reparent can break ownership chain) + _set_owner_recursive(node, scene_root) + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "old_parent": McpScenePath.from_node(old_parent, scene_root), + "new_parent": McpScenePath.from_node(new_parent, scene_root), + "undoable": true, + } + } + + +func set_property(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var property: String = params.get("property", "") + if property.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: property") + + if not "value" in params: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: value") + + var value = params.get("value") + + var found := false + var prop_type: int = TYPE_NIL + for prop in node.get_property_list(): + if prop.name == property: + found = true + prop_type = prop.get("type", TYPE_NIL) + break + if not found: + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, McpPropertyErrors.build_message(node, property)) + + var old_value = node.get(property) + # Prefer declared property type; fall back to runtime type for dynamic props + # (scripted @export vars can report TYPE_NIL in the property list). + var target_type: int = prop_type if prop_type != TYPE_NIL else typeof(old_value) + + var instantiated_resource := false + + # Some MCP clients (Cline) stringify the documented {"__class__": "BoxMesh", ...} + # value before sending. Promote that string back to a Dictionary here so the + # `__class__` branch below handles it, instead of the next branch treating + # the JSON blob as a res:// path and emitting "Resource not found: {...}". + # See #206. + if target_type == TYPE_OBJECT and value is String and value.begins_with("{"): + var json := JSON.new() + if json.parse(value) == OK and json.data is Dictionary and (json.data as Dictionary).has("__class__"): + value = json.data + + var nil_resource_string: bool = target_type == TYPE_NIL and (value == "" or (value is String and value.begins_with("res://"))) + var resource_string_value: bool = value is String and (target_type == TYPE_OBJECT or nil_resource_string) + if resource_string_value: + if value == "": + value = null + else: + var value_path_err = McpPathValidator.loadable_error(value, "value") + if value_path_err != null: + return value_path_err + if not ResourceLoader.exists(value): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % value) + var loaded := ResourceLoader.load(value) + if loaded == null: + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % value) + value = loaded + elif target_type == TYPE_OBJECT and value is Dictionary and value.has("__class__"): + # Shortcut: {"__class__": "BoxMesh", "size": {...}} instantiates a + # fresh Resource subclass and applies the remaining keys as + # properties. Mirrors resource_create's inline-assign path but + # avoids a separate tool call for the common case. + var type_str: String = value.get("__class__", "") + var made := ResourceHandler._instantiate_resource(type_str) + if made is Dictionary: + return made + var res: Resource = made + var remaining: Dictionary = (value as Dictionary).duplicate() + remaining.erase("__class__") + if not remaining.is_empty(): + var apply_err := ResourceHandler._apply_resource_properties(res, remaining) + if apply_err != null: + return apply_err + value = res + instantiated_resource = true + elif target_type == TYPE_ARRAY and old_value is Array and (old_value as Array).is_typed(): + ## Typed Array[T] slot (#612): the generic TYPE_ARRAY passthrough + ## hands an untyped Array to Godot's typed setter, which rejects it + ## wholesale and leaves the slot at its default — with success still + ## reported. Route through the element-aware coercer instead; errors + ## name the offending element index. + var typed_out: Variant = _coerce_typed_array(value, old_value) + if typed_out is Dictionary: + return typed_out + value = typed_out + elif ( + target_type == TYPE_DICTIONARY + and old_value is Dictionary + and (old_value as Dictionary).is_typed() + ): + ## Typed Dictionary[K, V] slot (#612 stage 3) — same silent-drop + ## family as typed arrays. A successful result is always a TYPED + ## Dictionary (a cleared duplicate of the slot), while the error + ## envelope is an untyped {"error": ...} — that's the discriminator + ## (a legit payload could contain an "error" key; typedness can't lie). + var typed_dict_out: Dictionary = _coerce_typed_dictionary(value, old_value) + if not typed_dict_out.is_typed(): + return typed_dict_out + value = typed_dict_out + else: + value = _coerce_value(value, target_type) + ## Refuse any value that didn't land as the target compound Variant + ## — wrong-shape dict (#123) or non-dict input like list / JSON string + ## that used to silently default-construct Vector3.ZERO (#191). + var coerce_err := _check_coerced(value, target_type) + if coerce_err != null: + return coerce_err + + _undo_redo.create_action("MCP: Set %s.%s" % [node.name, property]) + _undo_redo.add_do_property(node, property, value) + _undo_redo.add_undo_property(node, property, old_value) + if instantiated_resource: + _undo_redo.add_do_reference(value) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "property": property, + "value": _serialize_value(node.get(property)), + "old_value": _serialize_value(old_value), + "undoable": true, + } + } + + +func rename_node(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var new_name: String = params.get("new_name", "") + if new_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: new_name") + + ## The scene root's name is baked into the .tscn serialization and is + ## referenced by every NodePath that starts with `/` (AnimationPlayer + ## tracks, RemoteTransform3D targets, exported NodePath @vars, etc.). + ## Renaming it silently breaks those references. The MCP tool's docstring + ## has always promised "Cannot rename the scene root" — enforce it. #122 + if node == scene_root: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Cannot rename the scene root") + + if new_name.validate_node_name() != new_name: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid characters in name: %s" % new_name) + + var old_name := String(node.name) + if old_name == new_name: + return { + "data": { + "path": node_path, + "name": new_name, + "old_name": old_name, + "unchanged": true, + "undoable": false, + "reason": "Name unchanged", + } + } + + var parent := node.get_parent() + for sibling in parent.get_children(): + if sibling != node and String(sibling.name) == new_name: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "A sibling already has the name '%s'" % new_name) + + _undo_redo.create_action("MCP: Rename %s to %s" % [old_name, new_name]) + _undo_redo.add_do_property(node, "name", new_name) + _undo_redo.add_undo_property(node, "name", old_name) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "old_path": node_path, + "name": String(node.name), + "old_name": old_name, + "undoable": true, + } + } + + +func duplicate_node(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var root_err := _reject_if_scene_root(node, scene_root, "duplicate") + if root_err != null: + return root_err + + var parent := node.get_parent() + var dup: Node = node.duplicate() + if dup == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to duplicate node") + + # Apply optional name + var new_name: String = params.get("name", "") + if not new_name.is_empty(): + dup.name = new_name + + _undo_redo.create_action("MCP: Duplicate %s" % node.name) + _undo_redo.add_do_method(parent, "add_child", dup, true) + _undo_redo.add_do_method(dup, "set_owner", scene_root) + _undo_redo.add_do_reference(dup) + _undo_redo.add_undo_method(parent, "remove_child", dup) + _undo_redo.commit_action() + + # Set owner for all descendants of the duplicate + _set_owner_recursive(dup, scene_root) + + return { + "data": { + "path": McpScenePath.from_node(dup, scene_root), + "original_path": node_path, + "name": dup.name, + "type": dup.get_class(), + "undoable": true, + } + } + + +func move_node(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var root_err := _reject_if_scene_root(node, scene_root, "reorder") + if root_err != null: + return root_err + + if not "index" in params: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: index") + + var new_index: int = params.get("index", 0) + var parent := node.get_parent() + var old_index := node.get_index() + var sibling_count := parent.get_child_count() + + if new_index < 0 or new_index >= sibling_count: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Index %d out of range (0..%d)" % [new_index, sibling_count - 1]) + + _undo_redo.create_action("MCP: Move %s to index %d" % [node.name, new_index]) + _undo_redo.add_do_method(parent, "move_child", node, new_index) + _undo_redo.add_undo_method(parent, "move_child", node, old_index) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "old_index": old_index, + "new_index": new_index, + "undoable": true, + } + } + + +func add_to_group(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var group_value: Variant = params.get("group", "") + var type_err := McpParamValidators.require_string("group", group_value) + if type_err != null: + return type_err + var group := String(group_value) + if group.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: group") + + if node.is_in_group(group): + return {"data": {"path": node_path, "group": group, "already_member": true, "undoable": false, "reason": "No change made"}} + + _undo_redo.create_action("MCP: Add %s to group %s" % [node.name, group]) + _undo_redo.add_do_method(node, "add_to_group", group, true) + _undo_redo.add_undo_method(node, "remove_from_group", group) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "group": group, + "undoable": true, + } + } + + +func remove_from_group(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var group_value: Variant = params.get("group", "") + var type_err := McpParamValidators.require_string("group", group_value) + if type_err != null: + return type_err + var group := String(group_value) + if group.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: group") + + if not node.is_in_group(group): + return {"data": {"path": node_path, "group": group, "not_member": true, "undoable": false, "reason": "Node not in group"}} + + _undo_redo.create_action("MCP: Remove %s from group %s" % [node.name, group]) + _undo_redo.add_do_method(node, "remove_from_group", group) + _undo_redo.add_undo_method(node, "add_to_group", group, true) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "group": group, + "undoable": true, + } + } + + +func set_selection(params: Dictionary) -> Dictionary: + var paths: Array = params.get("paths", []) + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var selection := EditorInterface.get_selection() + selection.clear() + + var selected: Array[String] = [] + var not_found: Array[String] = [] + for path_variant in paths: + var path: String = str(path_variant) + var node := McpScenePath.resolve(path, scene_root) + if node: + selection.add_node(node) + selected.append(path) + else: + not_found.append(path) + + return { + "data": { + "selected": selected, + "not_found": not_found, + "count": selected.size(), + "undoable": false, + "reason": "Selection changes are not tracked in undo history", + } + } + + +func _set_owner_recursive(node: Node, owner: Node) -> void: + for child in node.get_children(): + child.set_owner(owner) + _set_owner_recursive(child, owner) + + +## Canonical dict-key sets for dict→Variant coercion. Alpha on `COLOR_KEYS` +## is optional — the coercer defaults it to 1.0 when absent. +const VECTOR2_KEYS: Array[String] = ["x", "y"] +const VECTOR3_KEYS: Array[String] = ["x", "y", "z"] +const VECTOR4_KEYS: Array[String] = ["x", "y", "z", "w"] +const COLOR_KEYS: Array[String] = ["r", "g", "b"] + + +## End-to-end coerce check for compound JSON-shaped targets +## (Vector2/Vector3/Color). Returns a full `make(...)`-shaped error dict +## if `value` didn't land as the target Variant after `_coerce_value`, +## else null. Wrong-shape dicts get the `_check_dict_coerce_failed` +## message (expected-vs-got keys); non-dict inputs (Array, String, +## primitive) name the received type and a JSON shape hint. No-op for +## non-compound targets — Godot's setter handles those. +## +## Used by set_property, resource_handler, and validation handlers +## (curve, texture). Issue #191 — passing a list, JSON string, or +## anything else to a Vector3 property used to silently store +## Vector3.ZERO; this gates that path. +static func _check_coerced(value: Variant, target_type: int, prefix: String = "") -> Variant: + var ok := false + match target_type: + TYPE_VECTOR2: + ok = value is Vector2 + TYPE_VECTOR3: + ok = value is Vector3 + TYPE_COLOR: + ok = value is Color + TYPE_PACKED_VECTOR2_ARRAY: + ok = value is PackedVector2Array + TYPE_PACKED_VECTOR3_ARRAY: + ok = value is PackedVector3Array + TYPE_PACKED_VECTOR4_ARRAY: + ok = value is PackedVector4Array + TYPE_PACKED_COLOR_ARRAY: + ok = value is PackedColorArray + TYPE_PACKED_INT32_ARRAY: + ok = value is PackedInt32Array + TYPE_PACKED_INT64_ARRAY: + ok = value is PackedInt64Array + TYPE_PACKED_FLOAT32_ARRAY: + ok = value is PackedFloat32Array + TYPE_PACKED_FLOAT64_ARRAY: + ok = value is PackedFloat64Array + TYPE_PACKED_STRING_ARRAY: + ok = value is PackedStringArray + TYPE_VECTOR2I: ok = value is Vector2i + TYPE_VECTOR3I: ok = value is Vector3i + TYPE_VECTOR4: ok = value is Vector4 + TYPE_VECTOR4I: ok = value is Vector4i + TYPE_QUATERNION: ok = value is Quaternion + TYPE_RECT2: ok = value is Rect2 + TYPE_RECT2I: ok = value is Rect2i + TYPE_AABB: ok = value is AABB + TYPE_PLANE: ok = value is Plane + TYPE_BASIS: ok = value is Basis + TYPE_TRANSFORM2D: ok = value is Transform2D + TYPE_TRANSFORM3D: ok = value is Transform3D + TYPE_PROJECTION: ok = value is Projection + _: + # null / untyped-TYPE_NIL / already-correct-type are handled by + # Godot's setter; anything else would silently no-op, so error. + if value == null or target_type == TYPE_NIL or typeof(value) == target_type: + return null + var unsupported := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot write %s to a %s property; godot-ai has no coercion for that type" % [ + type_string(typeof(value)), type_string(target_type), + ], + ) + return ErrorCodes.prefix_message(unsupported, prefix) + if ok: + return null + var dict_err := _check_dict_coerce_failed(value, target_type) + if dict_err != null: + return ErrorCodes.prefix_message(dict_err, prefix) + ## Wording stays neutral on shape — `_shape_hint` already produces a + ## dict-shaped string for Vector2/3/Color and a list-shaped one for + ## the Packed*Array slots. The old "expected a dict like [...]" phrasing + ## read self-contradictory for packed targets (PR #424 review). + var err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot coerce %s to %s; expected %s" % [ + type_string(typeof(value)), type_string(target_type), _shape_hint(target_type), + ], + ) + return ErrorCodes.prefix_message(err, prefix) + + +## Build a "{\"x\":1,...}" hint string from the canonical key constants +## so adding a key (e.g. Vector4) only touches VECTORN_KEYS. Packed*Array +## targets short-circuit to a literal list-shaped hint. +static func _shape_hint(target_type: int) -> String: + match target_type: + TYPE_PACKED_VECTOR2_ARRAY: + return "[{\"x\":0,\"y\":0}, ...]" + TYPE_PACKED_VECTOR3_ARRAY: + return "[{\"x\":0,\"y\":0,\"z\":0}, ...]" + TYPE_PACKED_VECTOR4_ARRAY: + return "[{\"x\":0,\"y\":0,\"z\":0,\"w\":0}, ...]" + TYPE_PACKED_COLOR_ARRAY: + return "[{\"r\":0,\"g\":0,\"b\":0,\"a\":1}, ...]" + TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY: + return "[int, ...]" + TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY: + return "[float, ...]" + TYPE_PACKED_STRING_ARRAY: + return "[\"...\", ...]" + TYPE_VECTOR2I: + return "{\"x\":0,\"y\":0}" + TYPE_VECTOR3I: + return "{\"x\":0,\"y\":0,\"z\":0}" + TYPE_VECTOR4, TYPE_VECTOR4I, TYPE_QUATERNION: + return "{\"x\":0,\"y\":0,\"z\":0,\"w\":0}" + TYPE_RECT2, TYPE_RECT2I, TYPE_AABB: + return "{\"position\":{...},\"size\":{...}}" + TYPE_PLANE: + return "{\"normal\":{...},\"d\":0}" + TYPE_BASIS: + return "{\"x\":{...},\"y\":{...},\"z\":{...}}" + TYPE_TRANSFORM2D: + return "{\"x\":{...},\"y\":{...},\"origin\":{...}}" + TYPE_TRANSFORM3D: + return "{\"basis\":{...},\"origin\":{...}}" + TYPE_PROJECTION: + return "{\"x\":{...},\"y\":{...},\"z\":{...},\"w\":{...}}" + var keys: Array[String] = [] + match target_type: + TYPE_VECTOR2: keys = VECTOR2_KEYS + TYPE_VECTOR3: keys = VECTOR3_KEYS + TYPE_COLOR: keys = COLOR_KEYS + var pairs: Array[String] = [] + for k in keys: + pairs.append("\"%s\":0" % k) + return "{" + ",".join(pairs) + "}" + + +## Detect a failed dict→typed-Variant coercion. Returns an INVALID_PARAMS +## error dict if `value` is still a Dictionary after a coercion attempt +## targeting a Vector2/Vector3/Color slot, else null. Message names the +## expected keys and the keys actually received so agents self-correct +## on the next retry. +static func _check_dict_coerce_failed(value: Variant, target_type: int) -> Variant: + if not (value is Dictionary): + return null + var expected: Array[String] = [] + var type_name := "" + match target_type: + TYPE_VECTOR2: + expected = VECTOR2_KEYS + type_name = "Vector2" + TYPE_VECTOR3: + expected = VECTOR3_KEYS + type_name = "Vector3" + TYPE_COLOR: + expected = COLOR_KEYS + type_name = "Color" + _: + return null + var got_keys: Array = (value as Dictionary).keys() + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot coerce dict to %s: expected keys %s; got %s" % [type_name, str(expected), str(got_keys)] + ) + + +## Coerce JSON-shaped values into Godot Variants when the target property +## type is known. Returns the coerced value on success, or the input +## unchanged on failure — callers detect the type mismatch via an +## `is ` check (curve_handler, texture_handler) or via the +## `_check_dict_coerce_failed` helper (set_property, resource_handler). +## +## Dictionary→Vector2/Vector3/Color cases REQUIRE all canonical keys; +## wrong-shape dicts flow through unchanged. See issue #123 — previous +## `dict.get(key, 0)` defaults silently zero-filled missing axes. +static func _coerce_value(value: Variant, target_type: int) -> Variant: + match target_type: + ## Vector2/Vector3/Color route through the canonical strict parser + ## (#714): same dict/array/string shapes as every other handler, and + ## non-numeric components fall through (returning the original + ## value) so _check_coerced flags them instead of crashing a typed + ## constructor or silently writing black/zeros. + TYPE_VECTOR2: + var v2 = McpJsonValues.parse_vector2(value) + if v2 != null: + return v2 + TYPE_VECTOR3: + var v3 = McpJsonValues.parse_vector3(value) + if v3 != null: + return v3 + TYPE_COLOR: + var col = McpJsonValues.parse_color(value) + if col != null: + return col + TYPE_BOOL: + if value is float or value is int: + return bool(value) + TYPE_INT: + if value is float: + return int(value) + TYPE_FLOAT: + if value is int: + return float(value) + TYPE_STRING_NAME: + if value is String: + return StringName(value) + TYPE_NODE_PATH: + if value is String: + return NodePath(value) + if value == null: + return NodePath() + TYPE_OBJECT: + # Resource loading is handled in set_property so we can return a + # typed error; here we only pass through cleared values. + if value == null: + return null + TYPE_ARRAY: + if value is Array: + return value + TYPE_DICTIONARY: + if value is Dictionary: + return value + TYPE_PACKED_VECTOR2_ARRAY: + if value is Array: + var out := PackedVector2Array() + for item in value: + if item is Vector2: + out.append(item) + elif item is Dictionary and item.has_all(VECTOR2_KEYS): + out.append(Vector2(item["x"], item["y"])) + else: + return value # leave for _check_coerced to flag + return out + TYPE_PACKED_VECTOR3_ARRAY: + if value is Array: + var out := PackedVector3Array() + for item in value: + if item is Vector3: + out.append(item) + elif item is Dictionary and item.has_all(VECTOR3_KEYS): + out.append(Vector3(item["x"], item["y"], item["z"])) + else: + return value + return out + TYPE_PACKED_VECTOR4_ARRAY: + if value is Array: + var out := PackedVector4Array() + for item in value: + if item is Vector4: + out.append(item) + elif item is Dictionary and item.has_all(VECTOR4_KEYS): + out.append(Vector4(item["x"], item["y"], item["z"], item["w"])) + else: + return value + return out + TYPE_PACKED_COLOR_ARRAY: + if value is Array: + var out := PackedColorArray() + for item in value: + if item is Color: + out.append(item) + elif item is Dictionary and item.has_all(COLOR_KEYS): + out.append(Color(item["r"], item["g"], item["b"], item.get("a", 1.0))) + elif item is String: + out.append(Color(item)) + else: + return value + return out + TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY: + if value is Array: + var out: Variant = PackedInt32Array() if target_type == TYPE_PACKED_INT32_ARRAY else PackedInt64Array() + for item in value: + if item is int or item is float: + out.append(int(item)) + else: + return value + return out + TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY: + if value is Array: + var out: Variant = PackedFloat32Array() if target_type == TYPE_PACKED_FLOAT32_ARRAY else PackedFloat64Array() + for item in value: + if item is float or item is int: + out.append(float(item)) + else: + return value + return out + TYPE_PACKED_STRING_ARRAY: + if value is Array: + var out := PackedStringArray() + for item in value: + if item is String: + out.append(item) + else: + return value + return out + TYPE_VECTOR2I: + if value is Dictionary and value.has_all(VECTOR2_KEYS): + return Vector2i(int(value["x"]), int(value["y"])) + TYPE_VECTOR3I: + if value is Dictionary and value.has_all(VECTOR3_KEYS): + return Vector3i(int(value["x"]), int(value["y"]), int(value["z"])) + TYPE_VECTOR4: + if value is Dictionary and value.has_all(VECTOR4_KEYS): + return Vector4(value["x"], value["y"], value["z"], value["w"]) + TYPE_VECTOR4I: + if value is Dictionary and value.has_all(VECTOR4_KEYS): + return Vector4i(int(value["x"]), int(value["y"]), int(value["z"]), int(value["w"])) + TYPE_QUATERNION: + if value is Dictionary and value.has_all(VECTOR4_KEYS): + return Quaternion(value["x"], value["y"], value["z"], value["w"]) + TYPE_RECT2: + if value is Dictionary and value.has("position") and value.has("size"): + var p: Variant = _coerce_value(value["position"], TYPE_VECTOR2) + var s: Variant = _coerce_value(value["size"], TYPE_VECTOR2) + if p is Vector2 and s is Vector2: + return Rect2(p, s) + TYPE_RECT2I: + if value is Dictionary and value.has("position") and value.has("size"): + var p: Variant = _coerce_value(value["position"], TYPE_VECTOR2I) + var s: Variant = _coerce_value(value["size"], TYPE_VECTOR2I) + if p is Vector2i and s is Vector2i: + return Rect2i(p, s) + TYPE_AABB: + if value is Dictionary and value.has("position") and value.has("size"): + var p: Variant = _coerce_value(value["position"], TYPE_VECTOR3) + var s: Variant = _coerce_value(value["size"], TYPE_VECTOR3) + if p is Vector3 and s is Vector3: + return AABB(p, s) + TYPE_PLANE: + if value is Dictionary and value.has("normal") and value.has("d"): + var n: Variant = _coerce_value(value["normal"], TYPE_VECTOR3) + if n is Vector3: + return Plane(n, float(value["d"])) + TYPE_BASIS: + if value is Dictionary and value.has_all(["x", "y", "z"]): + var bx: Variant = _coerce_value(value["x"], TYPE_VECTOR3) + var by: Variant = _coerce_value(value["y"], TYPE_VECTOR3) + var bz: Variant = _coerce_value(value["z"], TYPE_VECTOR3) + if bx is Vector3 and by is Vector3 and bz is Vector3: + return Basis(bx, by, bz) + TYPE_TRANSFORM2D: + if value is Dictionary and value.has_all(["x", "y", "origin"]): + var tx: Variant = _coerce_value(value["x"], TYPE_VECTOR2) + var ty: Variant = _coerce_value(value["y"], TYPE_VECTOR2) + var to_: Variant = _coerce_value(value["origin"], TYPE_VECTOR2) + if tx is Vector2 and ty is Vector2 and to_ is Vector2: + return Transform2D(tx, ty, to_) + TYPE_TRANSFORM3D: + if value is Dictionary and value.has("basis") and value.has("origin"): + var b: Variant = _coerce_value(value["basis"], TYPE_BASIS) + var o: Variant = _coerce_value(value["origin"], TYPE_VECTOR3) + if b is Basis and o is Vector3: + return Transform3D(b, o) + TYPE_PROJECTION: + if value is Dictionary and value.has_all(VECTOR4_KEYS): + var px: Variant = _coerce_value(value["x"], TYPE_VECTOR4) + var py: Variant = _coerce_value(value["y"], TYPE_VECTOR4) + var pz: Variant = _coerce_value(value["z"], TYPE_VECTOR4) + var pw: Variant = _coerce_value(value["w"], TYPE_VECTOR4) + if px is Vector4 and py is Vector4 and pz is Vector4 and pw is Vector4: + return Projection(px, py, pz, pw) + # PackedByteArray intentionally unhandled — needs design decision + # (base64 string vs. raw int list); JSON has no native byte type. + return value + + +## Fill a typed `Array[T]` slot from a JSON list (#612 stage 1: value-element +## types). `slot_value` is the property's current typed Array — Godot's getter +## returns the (possibly empty) typed container, which carries the element +## type, so no PROPERTY_HINT_TYPE_STRING parsing is needed. Elements coerce +## one at a time through the existing `_coerce_value` / `_check_coerced` +## pair, then bulk-move via `Array.assign()` with a post-assign size check, +## so a wrong element can never silently drop the write: it errors naming +## the element index. Returns the filled typed Array on success, or a +## `make(...)`-shaped error Dictionary (callers discriminate on +## `result is Dictionary` — a successful result is always an Array). +## +## Object elements (Array[Texture2D], Array[MyResource], ...) coerce per +## element through `_coerce_object_element` (#612 stage 2), mirroring the +## single-slot TYPE_OBJECT paths: res:// strings load, {"__class__": ...} +## instantiates, and each landed element is conformance-checked against the +## slot's element class/script so a wrong-class Resource errors naming the +## index instead of being rejected wholesale by `assign`. +static func _coerce_typed_array(value: Variant, slot_value: Array, prefix: String = "") -> Variant: + var elem_label := _typed_array_element_label(slot_value) + if not (value is Array): + var err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot write %s to a typed Array[%s] property; expected a list" % [ + type_string(typeof(value)), elem_label, + ], + ) + return ErrorCodes.prefix_message(err, prefix) + var elem_type := slot_value.get_typed_builtin() + var staging: Array = [] + var in_list: Array = value + for i in in_list.size(): + var elem_prefix := ("element %d" % i) if prefix.is_empty() else "%s element %d" % [prefix, i] + var coerced: Variant + if elem_type == TYPE_OBJECT: + coerced = _coerce_object_element(in_list[i], elem_prefix) + if coerced is Dictionary: + ## Object elements are never legit Dictionaries (a dict input + ## is either {"__class__"} — consumed above — or an error), so + ## a Dictionary return is unambiguously the error envelope. + return coerced + if coerced != null and not _object_element_conforms(coerced, slot_value): + var conform_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "element is %s, which is not a %s" % [ + (coerced as Object).get_class(), elem_label, + ], + ) + return ErrorCodes.prefix_message(conform_err, elem_prefix) + else: + coerced = _coerce_value(in_list[i], elem_type) + var elem_err := _check_coerced(coerced, elem_type, elem_prefix) + if elem_err != null: + return elem_err + if coerced == null: + ## Prefix with `elem_prefix` (which already folds in `prefix`), + ## not `prefix` again — the latter double-stamped the property + ## context (PR #682 review). Object arrays allow null entries + ## (Godot typed object arrays store null); value-type arrays + ## don't. + var null_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "cannot store null in Array[%s]" % elem_label, + ) + return ErrorCodes.prefix_message(null_err, elem_prefix) + staging.append(coerced) + var out := slot_value.duplicate() + out.clear() + out.assign(staging) + if out.size() != staging.size(): + ## Backstop for element shapes `_check_coerced` waves through but the + ## typed container still rejects — `assign` loud-rejects and leaves a + ## short array, which without this check would be a partial write. + var assign_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Array[%s] element conversion failed during assign (%d of %d elements landed)" % [ + elem_label, out.size(), staging.size(), + ], + ) + return ErrorCodes.prefix_message(assign_err, prefix) + return out + + +## "int" / "Vector3" / "Texture2D" / "MyItemData" — element-type name of a +## typed Array slot, for error messages. +static func _typed_array_element_label(slot_value: Array) -> String: + if slot_value.get_typed_builtin() == TYPE_OBJECT: + return _object_type_label(slot_value.get_typed_class_name(), slot_value.get_typed_script()) + return type_string(slot_value.get_typed_builtin()) + + +## Coerce one element of an object-typed Array (#612 stage 2). Mirrors the +## single-slot TYPE_OBJECT paths in set_property: a res:// path string loads +## the Resource; {"__class__": "X", ...} (including the #206 stringified +## form) instantiates via ResourceHandler and applies the remaining keys; +## "" / null store a null entry (typed object arrays allow them). Returns +## the Object (or null), or a make(...)-shaped error Dictionary with +## `elem_prefix` already folded in. +static func _coerce_object_element(elem: Variant, elem_prefix: String) -> Variant: + if elem == null: + return null + if elem is Object: + return elem + if elem is String and (elem as String).begins_with("{"): + var json := JSON.new() + if json.parse(elem) == OK and json.data is Dictionary and (json.data as Dictionary).has("__class__"): + elem = json.data + if elem is String: + if String(elem).is_empty(): + return null + var path_err = McpPathValidator.loadable_error(elem, "value") + if path_err != null: + return ErrorCodes.prefix_message(path_err, elem_prefix) + if not ResourceLoader.exists(elem): + return ErrorCodes.prefix_message( + ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % elem), + elem_prefix, + ) + var loaded := ResourceLoader.load(elem) + if loaded == null: + return ErrorCodes.prefix_message( + ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % elem), + elem_prefix, + ) + return loaded + if elem is Dictionary and (elem as Dictionary).has("__class__"): + var type_str: String = (elem as Dictionary).get("__class__", "") + var made := ResourceHandler._instantiate_resource(type_str) + if made is Dictionary: + return ErrorCodes.prefix_message(made, elem_prefix) + var res: Resource = made + var remaining: Dictionary = (elem as Dictionary).duplicate() + remaining.erase("__class__") + if not remaining.is_empty(): + var apply_err: Variant = ResourceHandler._apply_resource_properties(res, remaining) + if apply_err != null: + return ErrorCodes.prefix_message(apply_err, elem_prefix) + return res + return ErrorCodes.prefix_message( + ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + 'cannot convert %s to an Object element; pass a res:// path or {"__class__": ...}' + % type_string(typeof(elem)), + ), + elem_prefix, + ) + + +## True when `elem` satisfies the object-typed slot's element constraint — +## script type when the slot is Array[MyScriptClass], native class +## otherwise. Checked per element so a wrong-class Resource errors naming +## the index instead of being rejected wholesale by `Array.assign()`. +static func _object_element_conforms(elem: Object, slot_value: Array) -> bool: + return _object_conforms(elem, slot_value.get_typed_class_name(), slot_value.get_typed_script()) + + +## Shared class/script conformance predicate for typed Array elements and +## typed Dictionary values (#612 stages 2–3). +static func _object_conforms(elem: Object, cls_name: StringName, script: Variant) -> bool: + if script is Script: + return is_instance_of(elem, script) + var cls := String(cls_name) + return cls.is_empty() or elem.is_class(cls) + + +## Fill a typed `Dictionary[K, V]` slot from a JSON object (#612 stage 3). +## `slot_value` is the property's current typed Dictionary — the getter +## returns the (possibly empty) typed container carrying both constraint +## sides. Keys coerce via `_coerce_typed_dict_key` (JSON object keys are +## always Strings, so int/float/StringName key slots parse the string and +## fail closed on anything inexact); values mirror the typed-array element +## rules — object values through `_coerce_object_element` + conformance, +## everything else through `_coerce_value`/`_check_coerced`. Never partial: +## any bad key or value errors naming the key and nothing is written. +## +## Returns the filled TYPED Dictionary on success or an UNTYPED +## `make(...)`-shaped error Dictionary — callers discriminate on +## `is_typed()`, since a success result is always a duplicate of the typed +## slot and error envelopes are plain dicts. +static func _coerce_typed_dictionary( + value: Variant, slot_value: Dictionary, prefix: String = "" +) -> Dictionary: + var label := _typed_dictionary_label(slot_value) + if not (value is Dictionary): + var err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot write %s to a typed %s property; expected an object" % [ + type_string(typeof(value)), label, + ], + ) + return ErrorCodes.prefix_message(err, prefix) + var key_type := slot_value.get_typed_key_builtin() if slot_value.is_typed_key() else TYPE_NIL + var value_type := ( + slot_value.get_typed_value_builtin() if slot_value.is_typed_value() else TYPE_NIL + ) + var out := slot_value.duplicate() + out.clear() + var in_dict: Dictionary = value + for raw_key in in_dict.keys(): + var key_prefix := ( + 'key "%s"' % str(raw_key) if prefix.is_empty() + else '%s key "%s"' % [prefix, str(raw_key)] + ) + var key: Variant = _coerce_typed_dict_key(raw_key, key_type, label, key_prefix) + if key is Dictionary: + ## Scalar-only key coercion never returns a legit Dictionary key, + ## so a Dictionary here is unambiguously the error envelope. + return key + var raw_value: Variant = in_dict[raw_key] + var coerced: Variant + if value_type == TYPE_NIL: + ## Untyped value side (e.g. Dictionary[String, Variant]). + coerced = raw_value + elif value_type == TYPE_OBJECT: + coerced = _coerce_object_element(raw_value, key_prefix) + if coerced is Dictionary: + return coerced + if coerced != null and not _object_conforms( + coerced, + slot_value.get_typed_value_class_name(), + slot_value.get_typed_value_script(), + ): + var conform_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "value is %s, which is not a %s" % [ + (coerced as Object).get_class(), + _object_type_label( + slot_value.get_typed_value_class_name(), + slot_value.get_typed_value_script(), + ), + ], + ) + return ErrorCodes.prefix_message(conform_err, key_prefix) + else: + coerced = _coerce_value(raw_value, value_type) + var value_err := _check_coerced(coerced, value_type, key_prefix) + if value_err != null: + return value_err + if coerced == null: + var null_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "cannot store null as a %s value in %s" % [type_string(value_type), label], + ) + return ErrorCodes.prefix_message(null_err, key_prefix) + out[key] = coerced + if out.size() != in_dict.size(): + ## Two input keys collapsing onto one coerced key ("1" and "01" both + ## parse to int 1) would silently lose an entry — refuse instead. + var collide_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s keys collide after coercion (%d of %d entries landed)" % [ + label, out.size(), in_dict.size(), + ], + ) + return ErrorCodes.prefix_message(collide_err, prefix) + return out + + +## Coerce one JSON-object key onto a typed Dictionary's key slot. JSON keys +## are always Strings, so int/float/StringName key types accept exactly the +## strings that parse cleanly; everything else fails closed naming the key. +## Object/compound key types are unreachable from JSON and refuse loudly. +static func _coerce_typed_dict_key( + raw_key: Variant, key_type: int, label: String, key_prefix: String +) -> Variant: + if key_type == TYPE_NIL or typeof(raw_key) == key_type: + return raw_key + if raw_key is String: + var key_str := raw_key as String + match key_type: + TYPE_STRING_NAME: + return StringName(key_str) + TYPE_INT: + if key_str.is_valid_int(): + return int(key_str) + TYPE_FLOAT: + if key_str.is_valid_float(): + return float(key_str) + ## String key that didn't parse: JSON object keys are ALWAYS strings, + ## so blaming the String-ness would imply the caller could somehow + ## send a non-string key — name the expected key type instead. + var parse_err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "key does not parse as %s (the %s key type)" % [type_string(key_type), label], + ) + return ErrorCodes.prefix_message(parse_err, key_prefix) + if raw_key is float and key_type == TYPE_INT and is_equal_approx(raw_key, roundf(raw_key)): + ## Whole JSON numbers arrive as floats through some non-JSON callers. + return int(raw_key) + var err := ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "cannot use %s as a %s key" % [type_string(typeof(raw_key)), label], + ) + return ErrorCodes.prefix_message(err, key_prefix) + + +## "Dictionary[String, int]" / "Dictionary[int, Texture2D]" — for error +## messages. Untyped sides read as Variant. +static func _typed_dictionary_label(slot_value: Dictionary) -> String: + var key_label := "Variant" + if slot_value.is_typed_key(): + key_label = ( + _object_type_label( + slot_value.get_typed_key_class_name(), slot_value.get_typed_key_script() + ) + if slot_value.get_typed_key_builtin() == TYPE_OBJECT + else type_string(slot_value.get_typed_key_builtin()) + ) + var value_label := "Variant" + if slot_value.is_typed_value(): + value_label = ( + _object_type_label( + slot_value.get_typed_value_class_name(), slot_value.get_typed_value_script() + ) + if slot_value.get_typed_value_builtin() == TYPE_OBJECT + else type_string(slot_value.get_typed_value_builtin()) + ) + return "Dictionary[%s, %s]" % [key_label, value_label] + + +## Class/script display name for an object-typed constraint side. +static func _object_type_label(cls_name: StringName, script: Variant) -> String: + var cls := String(cls_name) + if script is Script and not String((script as Script).get_global_name()).is_empty(): + cls = String((script as Script).get_global_name()) + return cls if not cls.is_empty() else "Object" + + +func get_node_properties(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + # Optional token-reducing filter: `fields` restricts the response to a + # named subset. Defaults off (empty), so existing callers see the full + # dump unchanged. The MCP tool types this as a list, but batch_execute and + # raw callers bypass that, so validate the shape here before iterating. + var fields_param: Variant = params.get("fields", []) + if fields_param == null: + fields_param = [] + if not (fields_param is Array): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "'fields' must be an array of property names, got %s (%s)" % [ + type_string(typeof(fields_param)), str(fields_param), + ], + ) + var field_filter := {} + for f in fields_param: + ## Property names are strings on the wire; anything else is a + ## malformed filter (e.g. [123] or [["fov"]]) — reject rather than + ## silently stringify into a filter that matches nothing (#123/#126: + ## strict within the accepted shape). StringName is allowed for + ## editor-side callers. + if not (f is String or f is StringName): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "'fields' elements must be property-name strings, got %s in %s" % [ + type_string(typeof(f)), str(fields_param), + ], + ) + field_filter[str(f)] = true + var use_field_filter := not field_filter.is_empty() + + var properties: Array[Dictionary] = [] + var editor_property_count := 0 + var matched_fields := {} + for prop in node.get_property_list(): + var usage: int = prop.get("usage", 0) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + editor_property_count += 1 + if use_field_filter: + if not field_filter.has(prop.name): + continue + matched_fields[prop.name] = true + # Null reads are values, not omissions: `script` on an unscripted node + # and unset Resource slots (mesh, material, …) read back null and must + # appear as "value": null with their declared type, so callers can tell + # "Object-typed, currently unset" from "doesn't exist" (#771). + properties.append({ + "name": prop.name, + "type": type_string(prop.type), + "value": _serialize_value(node.get(prop.name)), + }) + # Requested names that matched no editor-visible property — distinguishes + # "you asked for something that doesn't exist" from "exists and is null". + var unknown_fields: Array[String] = [] + for f in field_filter: + if not matched_fields.has(f): + unknown_fields.append(f) + return { + "data": { + "path": node_path, + "node_type": node.get_class(), + "properties": properties, + "count": properties.size(), + # Total editor-visible properties before field filtering, so a + # caller that passed `fields` knows how many were withheld. + # Invariant: an unfiltered call returns every editor-visible + # property, so count == total_count; only the `fields` filter + # can make count < total_count. + "total_count": editor_property_count, + "unknown_fields": unknown_fields, + } + } + + +func get_children(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var scene_root: Node = resolved.scene_root + + var children: Array[Dictionary] = [] + for child in node.get_children(): + children.append({ + "name": child.name, + "type": child.get_class(), + "path": McpScenePath.from_node(child, scene_root), + "children_count": child.get_child_count(), + }) + return { + "data": { + "parent_path": node_path, + "children": children, + "count": children.size(), + } + } + + +func get_groups(params: Dictionary) -> Dictionary: + var resolved := _resolve_node(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var groups: Array[String] = [] + for group in node.get_groups(): + # Skip internal groups (start with underscore) + if not str(group).begins_with("_"): + groups.append(str(group)) + return { + "data": { + "path": node_path, + "groups": groups, + "count": groups.size(), + } + } + + +## Validate path param, resolve to node. Returns dict with node/path/scene_root +## on success, or an error dict (has "error" key) on failure. Thin wrapper +## around the shared `McpNodeValidator.resolve_or_error` helper (audit-v2 #20). +func _resolve_node(params: Dictionary) -> Dictionary: + return McpNodeValidator.resolve_or_error( + params.get("path", ""), "path", params.get("scene_file", ""), + ) + + +## Reject operations targeting the scene root. Returns an INVALID_PARAMS error +## dict with "Cannot the scene root", or null if `node` is not the root. +static func _reject_if_scene_root(node: Node, scene_root: Node, op: String) -> Variant: + if node == scene_root: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Cannot %s the scene root" % op) + return null + + +## Convert a Godot Variant to a JSON-safe value. Compound geometry types +## (AABB, Rect2, Transforms, …) and packed arrays serialize as structured +## dicts/arrays so agents can inspect fields instead of parsing Godot's +## debug repr — see issue #214. +static func _serialize_value(value: Variant) -> Variant: + return VariantSerializer.serialize(value) diff --git a/addons/godot_ai/handlers/node_handler.gd.uid b/addons/godot_ai/handlers/node_handler.gd.uid new file mode 100644 index 0000000..86149b4 --- /dev/null +++ b/addons/godot_ai/handlers/node_handler.gd.uid @@ -0,0 +1 @@ +uid://qhhd5mm5awym diff --git a/addons/godot_ai/handlers/particle_handler.gd b/addons/godot_ai/handlers/particle_handler.gd new file mode 100644 index 0000000..5604355 --- /dev/null +++ b/addons/godot_ai/handlers/particle_handler.gd @@ -0,0 +1,860 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles particle emitter authoring (GPU + CPU, 2D + 3D). +## +## All write operations bundle node creation and sub-resource spawns +## (ParticleProcessMaterial, default QuadMesh) in a single create_action +## so Ctrl-Z rolls back the whole effect atomically. + +const ParticleValues := preload("res://addons/godot_ai/handlers/particle_values.gd") +const ParticlePresets := preload("res://addons/godot_ai/handlers/particle_presets.gd") + +const _VALID_TYPES := { + "gpu_3d": "GPUParticles3D", + "gpu_2d": "GPUParticles2D", + "cpu_3d": "CPUParticles3D", + "cpu_2d": "CPUParticles2D", +} + +const _MAIN_KEYS := [ + "amount", + "lifetime", + "one_shot", + "explosiveness", + "preprocess", + "speed_scale", + "randomness", + "fixed_fps", + "emitting", + "local_coords", + "interp_to_end", +] + + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +# ============================================================================ +# particle_create +# ============================================================================ + +func create_particle(params: Dictionary) -> Dictionary: + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "Particles") + var type_str: String = params.get("type", "gpu_3d") + + if not _VALID_TYPES.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid particle type '%s'. Valid: %s" % [type_str, ", ".join(_VALID_TYPES.keys())] + ) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var node := _instantiate_particle(type_str) + if node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate particle node") + if not node_name.is_empty(): + node.name = node_name + + var process_mat: ParticleProcessMaterial = null + var process_material_created := false + var draw_mesh: Mesh = null + var draw_material: StandardMaterial3D = null + var draw_pass_mesh_created := false + var draw_material_created := false + + if type_str == "gpu_3d" or type_str == "gpu_2d": + process_mat = ParticleProcessMaterial.new() + process_material_created = true + if type_str == "gpu_3d": + draw_mesh = QuadMesh.new() + (draw_mesh as QuadMesh).size = Vector2(0.25, 0.25) + # Without a material, the mesh renders flat white — ignoring + # ParticleProcessMaterial.color_ramp entirely. Give it the standard + # billboard + vertex-color-as-albedo setup so color_ramp works. + draw_material = ParticleValues.build_draw_material({}).material + (draw_mesh as QuadMesh).material = draw_material + draw_pass_mesh_created = true + draw_material_created = true + + _undo_redo.create_action("MCP: Create %s '%s'" % [_VALID_TYPES[type_str], node.name]) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + if process_mat != null: + _undo_redo.add_do_property(node, "process_material", process_mat) + _undo_redo.add_do_reference(process_mat) + if draw_mesh != null: + _undo_redo.add_do_property(node, "draw_pass_1", draw_mesh) + _undo_redo.add_do_reference(draw_mesh) + if draw_material != null: + _undo_redo.add_do_reference(draw_material) + _undo_redo.add_do_reference(node) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": String(node.name), + "type": type_str, + "class": _VALID_TYPES[type_str], + "process_material_created": process_material_created, + "draw_pass_mesh_created": draw_pass_mesh_created, + "draw_material_created": draw_material_created, + "undoable": true, + } + } + + +# ============================================================================ +# particle_set_main +# ============================================================================ + +func set_main(params: Dictionary) -> Dictionary: + var resolved := _resolve_particle(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var properties: Dictionary = params.get("properties", {}) + if properties.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "properties dict is empty") + + var coerced: Dictionary = {} + var old_values: Dictionary = {} + for property in properties: + var prop_name: String = String(property) + if not (prop_name in _MAIN_KEYS): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Unknown main property '%s'. Valid: %s" % [prop_name, ", ".join(_MAIN_KEYS)] + ) + var prop_type := _node_property_type(node, prop_name) + if prop_type == TYPE_NIL: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' not present on %s" % [prop_name, node.get_class()] + ) + var coerce_result := ParticleValues.coerce(prop_name, properties[prop_name], prop_type) + if not coerce_result.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + coerced[prop_name] = coerce_result.value + old_values[prop_name] = node.get(prop_name) + + _undo_redo.create_action("MCP: Set particle main on %s" % node.name) + for prop_name in coerced: + _undo_redo.add_do_property(node, prop_name, coerced[prop_name]) + _undo_redo.add_undo_property(node, prop_name, old_values[prop_name]) + _undo_redo.commit_action() + + var applied: Array[String] = [] + var serialized_values: Dictionary = {} + for prop_name in coerced: + applied.append(prop_name) + serialized_values[prop_name] = ParticleValues.serialize(coerced[prop_name]) + + return { + "data": { + "path": node_path, + "applied": applied, + "values": serialized_values, + "undoable": true, + } + } + + +# ============================================================================ +# particle_set_process +# ============================================================================ + +func set_process(params: Dictionary) -> Dictionary: + var resolved := _resolve_particle(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var properties: Dictionary = params.get("properties", {}) + if properties.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "properties dict is empty") + + # GPU: work through process_material; CPU: properties live on node directly. + if node is GPUParticles3D or node is GPUParticles2D: + return _set_process_gpu(node, node_path, properties) + return _set_process_cpu(node, node_path, properties) + + +func _set_process_gpu(node: Node, node_path: String, properties: Dictionary) -> Dictionary: + var existing_mat: ParticleProcessMaterial = node.process_material as ParticleProcessMaterial + var process_material_created := false + var mat: ParticleProcessMaterial = existing_mat + if mat == null: + mat = ParticleProcessMaterial.new() + process_material_created = true + + var coerced: Dictionary = {} + for property in properties: + var prop_name: String = String(property) + var prop_type := _object_property_type(mat, prop_name) + if prop_type == TYPE_NIL: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' not present on ParticleProcessMaterial" % prop_name + ) + var coerce_result := ParticleValues.coerce(prop_name, properties[prop_name], prop_type) + if not coerce_result.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + coerced[prop_name] = coerce_result.value + + _undo_redo.create_action("MCP: Set particle process on %s" % node.name) + if process_material_created: + _undo_redo.add_do_property(node, "process_material", mat) + _undo_redo.add_undo_property(node, "process_material", null) + _undo_redo.add_do_reference(mat) + # Apply new values directly on the (newly created) material. No old values to restore. + for prop_name in coerced: + mat.set(prop_name, coerced[prop_name]) + else: + # Use the reusable apply/restore pattern for existing material. + var old_values: Dictionary = {} + for prop_name in coerced: + old_values[prop_name] = mat.get(prop_name) + for prop_name in coerced: + _undo_redo.add_do_property(mat, prop_name, coerced[prop_name]) + _undo_redo.add_undo_property(mat, prop_name, old_values[prop_name]) + _undo_redo.commit_action() + + var applied: Array[String] = [] + var serialized: Dictionary = {} + for prop_name in coerced: + applied.append(prop_name) + serialized[prop_name] = ParticleValues.serialize(mat.get(prop_name)) + + return { + "data": { + "path": node_path, + "applied": applied, + "values": serialized, + "process_material_created": process_material_created, + "undoable": true, + } + } + + +func _set_process_cpu(node: Node, node_path: String, properties: Dictionary) -> Dictionary: + # CPU particles expose the same property vocabulary directly on the node, + # so property names pass through unchanged. + var coerced: Dictionary = {} + var old_values: Dictionary = {} + + for property in properties: + var prop_name: String = String(property) + var prop_type := _node_property_type(node, prop_name) + if prop_type == TYPE_NIL: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' not present on %s" % [prop_name, node.get_class()] + ) + var coerce_result := ParticleValues.coerce(prop_name, properties[property], prop_type) + if not coerce_result.ok: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + coerced[prop_name] = coerce_result.value + old_values[prop_name] = node.get(prop_name) + + _undo_redo.create_action("MCP: Set particle process on %s" % node.name) + for prop_name in coerced: + _undo_redo.add_do_property(node, prop_name, coerced[prop_name]) + _undo_redo.add_undo_property(node, prop_name, old_values[prop_name]) + _undo_redo.commit_action() + + var applied: Array[String] = [] + var serialized: Dictionary = {} + for prop_name in coerced: + applied.append(prop_name) + serialized[prop_name] = ParticleValues.serialize(coerced[prop_name]) + + return { + "data": { + "path": node_path, + "applied": applied, + "values": serialized, + "process_material_created": false, + "undoable": true, + } + } + + +# ============================================================================ +# particle_set_draw_pass +# ============================================================================ + +func set_draw_pass(params: Dictionary) -> Dictionary: + var resolved := _resolve_particle(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var pass_idx: int = int(params.get("pass", 1)) + var mesh_path: String = params.get("mesh", "") + var texture_path: String = params.get("texture", "") + var material_path: String = params.get("material", "") + + if node is GPUParticles3D: + return _set_draw_pass_gpu_3d(node, node_path, pass_idx, mesh_path, material_path) + if node is CPUParticles3D: + return _set_draw_pass_cpu_3d(node, node_path, mesh_path, material_path) + if node is GPUParticles2D or node is CPUParticles2D: + return _set_draw_pass_2d(node, node_path, texture_path) + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Node %s is not a particle node" % node.get_class()) + + +func _set_draw_pass_gpu_3d(node: GPUParticles3D, node_path: String, pass_idx: int, mesh_path: String, material_path: String) -> Dictionary: + if pass_idx < 1 or pass_idx > 4: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "pass must be 1..4 (got %d)" % pass_idx) + + var mesh: Mesh = null + var mesh_created := false + var property_name := "draw_pass_%d" % pass_idx + # draw_pass_N is only a live property when draw_passes >= N. Probe via + # get_property_list so we don't read a ghost value. + var existing_mesh: Mesh = null + if int(node.draw_passes) >= pass_idx: + existing_mesh = node.get(property_name) as Mesh + if not mesh_path.is_empty(): + var mesh_path_err = McpPathValidator.loadable_error(mesh_path, "mesh_path") + if mesh_path_err != null: + return mesh_path_err + if not ResourceLoader.exists(mesh_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Mesh not found: %s" % mesh_path) + var loaded := ResourceLoader.load(mesh_path) + if not (loaded is Mesh): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Mesh" % mesh_path) + mesh = loaded + else: + if existing_mesh == null: + mesh = QuadMesh.new() + (mesh as QuadMesh).size = Vector2(0.25, 0.25) + mesh_created = true + else: + mesh = existing_mesh + + var material: Material = null + if not material_path.is_empty(): + var material_path_err = McpPathValidator.loadable_error(material_path, "material_path") + if material_path_err != null: + return material_path_err + if not ResourceLoader.exists(material_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Material not found: %s" % material_path) + var loaded_mat := ResourceLoader.load(material_path) + if not (loaded_mat is Material): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Material" % material_path) + material = loaded_mat + + var old_draw_passes: int = int(node.draw_passes) + var new_draw_passes: int = max(old_draw_passes, pass_idx) + var old_value = existing_mesh # Null if draw_passes < pass_idx + var old_material: Material = null + if material != null: + old_material = node.material_override + + _undo_redo.create_action("MCP: Set %s.draw_pass_%d" % [node.name, pass_idx]) + # Grow draw_passes first so draw_pass_N property exists before we set it. + if new_draw_passes != old_draw_passes: + _undo_redo.add_do_property(node, "draw_passes", new_draw_passes) + _undo_redo.add_undo_property(node, "draw_passes", old_draw_passes) + if not mesh_path.is_empty() or mesh_created: + _undo_redo.add_do_property(node, property_name, mesh) + _undo_redo.add_undo_property(node, property_name, old_value) + if mesh_created: + _undo_redo.add_do_reference(mesh) + if material != null: + _undo_redo.add_do_property(node, "material_override", material) + _undo_redo.add_undo_property(node, "material_override", old_material) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "pass": pass_idx, + "mesh_path": mesh_path, + "mesh_class": mesh.get_class() if mesh else "", + "material_path": material_path, + "draw_pass_mesh_created": mesh_created, + "draw_passes_grown": new_draw_passes != old_draw_passes, + "undoable": true, + } + } + + +func _set_draw_pass_cpu_3d(node: CPUParticles3D, node_path: String, mesh_path: String, material_path: String) -> Dictionary: + if mesh_path.is_empty() and material_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "CPUParticles3D requires mesh or material param") + + var mesh: Mesh = node.mesh + var old_mesh: Mesh = mesh + if not mesh_path.is_empty(): + var mesh_path_err = McpPathValidator.loadable_error(mesh_path, "mesh_path") + if mesh_path_err != null: + return mesh_path_err + if not ResourceLoader.exists(mesh_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Mesh not found: %s" % mesh_path) + var loaded := ResourceLoader.load(mesh_path) + if not (loaded is Mesh): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Mesh" % mesh_path) + mesh = loaded + + var material: Material = null + var old_material: Material = node.material_override + if not material_path.is_empty(): + var material_path_err = McpPathValidator.loadable_error(material_path, "material_path") + if material_path_err != null: + return material_path_err + if not ResourceLoader.exists(material_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Material not found: %s" % material_path) + var loaded_mat := ResourceLoader.load(material_path) + if not (loaded_mat is Material): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Material" % material_path) + material = loaded_mat + + _undo_redo.create_action("MCP: Set CPU particle draw on %s" % node.name) + if not mesh_path.is_empty(): + _undo_redo.add_do_property(node, "mesh", mesh) + _undo_redo.add_undo_property(node, "mesh", old_mesh) + if material != null: + _undo_redo.add_do_property(node, "material_override", material) + _undo_redo.add_undo_property(node, "material_override", old_material) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "mesh_path": mesh_path, + "material_path": material_path, + "draw_pass_mesh_created": false, + "undoable": true, + } + } + + +func _set_draw_pass_2d(node: Node, node_path: String, texture_path: String) -> Dictionary: + if texture_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "2D particles require texture param") + var texture_path_err = McpPathValidator.loadable_error(texture_path, "texture_path") + if texture_path_err != null: + return texture_path_err + if not ResourceLoader.exists(texture_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Texture not found: %s" % texture_path) + var tex := ResourceLoader.load(texture_path) + if not (tex is Texture2D): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Texture2D" % texture_path) + + var old_texture: Texture2D = node.get("texture") + + _undo_redo.create_action("MCP: Set 2D particle texture on %s" % node.name) + _undo_redo.add_do_property(node, "texture", tex) + _undo_redo.add_undo_property(node, "texture", old_texture) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "texture_path": texture_path, + "undoable": true, + } + } + + +# ============================================================================ +# particle_restart +# ============================================================================ + +func restart_particle(params: Dictionary) -> Dictionary: + var resolved := _resolve_particle(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + if node.has_method("restart"): + node.restart() + return { + "data": { + "path": node_path, + "undoable": false, + "reason": "Restart is a runtime operation, not tracked in undo history", + } + } + + +# ============================================================================ +# particle_get +# ============================================================================ + +func get_particle(params: Dictionary) -> Dictionary: + var resolved := _resolve_particle(params) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + + var type_str := "" + for key in _VALID_TYPES: + if node.get_class() == _VALID_TYPES[key]: + type_str = key + break + + var main_values: Dictionary = {} + var node_prop_names := _property_names(node) + for key in _MAIN_KEYS: + if node_prop_names.has(key): + main_values[key] = ParticleValues.serialize(node.get(key)) + + var process_data: Dictionary = {} + if node is GPUParticles3D or node is GPUParticles2D: + var mat: ParticleProcessMaterial = node.process_material as ParticleProcessMaterial + if mat != null: + var process_props: Dictionary = {} + for prop in mat.get_property_list(): + var usage: int = prop.get("usage", 0) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + var v = mat.get(prop.name) + if v == null: + continue + process_props[prop.name] = ParticleValues.serialize(v) + process_data = { + "class": "ParticleProcessMaterial", + "properties": process_props, + } + + var draw_passes: Array[Dictionary] = [] + if node is GPUParticles3D: + var active_draw_pass_count: int = min(int(node.draw_passes), 4) + for i in range(1, active_draw_pass_count + 1): + var prop_name := "draw_pass_%d" % i + var m: Mesh = node.get(prop_name) as Mesh + draw_passes.append({ + "pass": i, + "mesh_class": m.get_class() if m != null else "", + }) + + var texture_path := "" + if node is GPUParticles2D or node is CPUParticles2D: + var t: Texture2D = node.get("texture") + if t != null: + texture_path = t.resource_path + + return { + "data": { + "path": node_path, + "type": type_str, + "class": node.get_class(), + "main": main_values, + "process": process_data, + "draw_passes": draw_passes, + "texture_path": texture_path, + } + } + + +# ============================================================================ +# particle_apply_preset +# ============================================================================ + +func apply_preset(params: Dictionary) -> Dictionary: + var preset_name: String = params.get("preset", "") + if preset_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: preset") + + var overrides: Dictionary = params.get("overrides", {}) + var blueprint = ParticlePresets.build(preset_name, overrides) + if blueprint == null: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown preset '%s'. Valid: %s" % [preset_name, ", ".join(ParticlePresets.list())] + ) + + var parent_path: String = params.get("parent_path", "") + var node_name: String = params.get("name", "") + var type_str: String = params.get("type", "gpu_3d") + if node_name.is_empty(): + node_name = preset_name.capitalize() + if not _VALID_TYPES.has(type_str): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid particle type '%s'. Valid: %s" % [type_str, ", ".join(_VALID_TYPES.keys())] + ) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent: Node = scene_root + if not parent_path.is_empty(): + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + var node := _instantiate_particle(type_str) + node.name = node_name + + var is_gpu := type_str == "gpu_3d" or type_str == "gpu_2d" + var is_3d := type_str == "gpu_3d" or type_str == "cpu_3d" + + var process_mat: ParticleProcessMaterial = null + var process_material_created := false + if is_gpu: + process_mat = ParticleProcessMaterial.new() + process_material_created = true + + # User-supplied override keys per group. Preset-blueprint keys may skip + # silently on types they don't apply to (presets are cross-type by + # design); user-requested overrides must apply or error (#770). + var user_keys: Dictionary = blueprint.get("user_keys", {}) + var user_main: Dictionary = user_keys.get("main", {}) + var user_process: Dictionary = user_keys.get("process", {}) + var user_draw: Dictionary = user_keys.get("draw", {}) + + var draw_mesh: Mesh = null + var draw_material: StandardMaterial3D = null + var draw_pass_mesh_created := false + var draw_material_created := false + var applied_draw: Array[String] = [] + var draw_config: Dictionary = blueprint.get("draw", {}) + if type_str == "gpu_3d": + var draw_result := ParticleValues.build_draw_material(draw_config) + if not draw_result.ok: + node.free() + var msg := String(draw_result.error) + if draw_result.get("unknown_key", false): + msg = _draw_key_unsupported_message(String(draw_result.key), type_str) + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, msg) + draw_mesh = QuadMesh.new() + (draw_mesh as QuadMesh).size = Vector2(0.25, 0.25) + draw_material = draw_result.material + (draw_mesh as QuadMesh).material = draw_material + draw_pass_mesh_created = true + draw_material_created = true + for applied_key in draw_result.applied: + applied_draw.append(String(applied_key)) + elif type_str == "gpu_2d": + # GPUParticles2D has no draw-pass material; the one draw override it + # supports is draw.texture → the node's texture property. + for key in user_draw: + if String(key) != "texture": + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + _draw_key_unsupported_message(String(key), type_str) + ) + if user_draw.has("texture"): + var tex_result := _load_draw_texture(draw_config.get("texture")) + if tex_result.has("error"): + node.free() + return tex_result + node.set("texture", tex_result.texture) + applied_draw.append("texture") + else: + # cpu_3d / cpu_2d: no draw support — reject user draw overrides + # instead of dropping them. + for key in user_draw: + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + _draw_key_unsupported_message(String(key), type_str) + ) + + # Pre-apply preset values to in-memory targets (no undo needed; nodes not in tree yet). + var main_values: Dictionary = blueprint.get("main", {}) + var process_values: Dictionary = blueprint.get("process", {}) + var applied_main: Array[String] = [] + var applied_process: Array[String] = [] + + for prop in main_values: + var prop_name := String(prop) + var prop_type := _object_property_type(node, prop_name) + if prop_type == TYPE_NIL: + if user_main.has(prop_name): + var node_class := node.get_class() + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Override main.%s does not apply to type '%s' (no such property on %s)" % [ + prop_name, type_str, node_class + ] + ) + continue # Blueprint key: not all main keys apply to all types. + var coerce_result := ParticleValues.coerce(prop_name, main_values[prop_name], prop_type) + if not coerce_result.ok: + node.free() + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + node.set(prop_name, coerce_result.value) + applied_main.append(prop_name) + + # Apply process: GPU targets the ParticleProcessMaterial; CPU targets the node. + var process_target: Object = process_mat if is_gpu else node + for prop in process_values: + var prop_name := String(prop) + var prop_type := _object_property_type(process_target, prop_name) + if prop_type == TYPE_NIL: + if user_process.has(prop_name): + var target_class := process_target.get_class() + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Override process.%s does not apply to type '%s' (no such property on %s)" % [ + prop_name, type_str, target_class + ] + ) + continue # Blueprint key: preset property doesn't apply to this variant. + var coerce_result := ParticleValues.coerce(prop_name, process_values[prop_name], prop_type) + if not coerce_result.ok: + node.free() + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, String(coerce_result.error)) + process_target.set(prop_name, coerce_result.value) + applied_process.append(prop_name) + + _undo_redo.create_action("MCP: Apply preset %s" % preset_name) + _undo_redo.add_do_method(parent, "add_child", node, true) + _undo_redo.add_do_method(node, "set_owner", scene_root) + _undo_redo.add_do_reference(node) + if process_mat != null: + _undo_redo.add_do_property(node, "process_material", process_mat) + _undo_redo.add_do_reference(process_mat) + if draw_mesh != null: + _undo_redo.add_do_property(node, "draw_pass_1", draw_mesh) + _undo_redo.add_do_reference(draw_mesh) + if draw_material != null: + _undo_redo.add_do_reference(draw_material) + _undo_redo.add_undo_method(parent, "remove_child", node) + _undo_redo.commit_action() + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "parent_path": McpScenePath.from_node(parent, scene_root), + "name": node_name, + "preset": preset_name, + "type": type_str, + "class": _VALID_TYPES[type_str], + "applied_main": applied_main, + "applied_process": applied_process, + "applied_draw": applied_draw, + "process_material_created": process_material_created, + "draw_pass_mesh_created": draw_pass_mesh_created, + "draw_material_created": draw_material_created, + "is_3d": is_3d, + "undoable": true, + } + } + + +# ============================================================================ +# Helpers +# ============================================================================ + +## Actionable rejection for a user draw override that can't apply to the +## selected particle type: name the key and where it IS supported. +static func _draw_key_unsupported_message(key: String, type_str: String) -> String: + if key == "texture": + return "draw.texture is only supported for gpu_2d (got type '%s')" % type_str + var probe := StandardMaterial3D.new() + if _object_property_type(probe, key) != TYPE_NIL: + return "draw.%s is only supported for gpu_3d (got type '%s')" % [key, type_str] + return ( + "Unknown draw key '%s' (draw overrides configure the gpu_3d " + + "draw-pass StandardMaterial3D; gpu_2d supports only draw.texture)" + ) % key + + +## Load a Texture2D for the gpu_2d draw.texture override. Returns +## {texture: Texture2D} or an error dict (same validation as set_draw_pass). +static func _load_draw_texture(value: Variant) -> Dictionary: + if not (value is String) or String(value).is_empty(): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "draw.texture must be a non-empty res:// path string (got %s)" % type_string(typeof(value)) + ) + var texture_path := String(value) + var texture_path_err = McpPathValidator.loadable_error(texture_path, "draw.texture") + if texture_path_err != null: + return texture_path_err + if not ResourceLoader.exists(texture_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Texture not found: %s" % texture_path) + var tex := ResourceLoader.load(texture_path) + if not (tex is Texture2D): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Texture2D" % texture_path) + return {"texture": tex} + + +static func _instantiate_particle(type_str: String) -> Node: + match type_str: + "gpu_3d": + return GPUParticles3D.new() + "gpu_2d": + return GPUParticles2D.new() + "cpu_3d": + return CPUParticles3D.new() + "cpu_2d": + return CPUParticles2D.new() + return null + + +func _resolve_particle(params: Dictionary) -> Dictionary: + var resolved := McpNodeValidator.resolve_or_error( + params.get("node_path", ""), "node_path", + ) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + var node_path: String = resolved.path + var is_particle := node is GPUParticles3D or node is GPUParticles2D \ + or node is CPUParticles3D or node is CPUParticles2D + if not is_particle: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a particle node (got %s)" % [node_path, node.get_class()] + ) + return {"node": node, "path": node_path} + + +static func _node_property_type(node: Object, name: String) -> int: + return _object_property_type(node, name) + + +static func _object_property_type(obj: Object, name: String) -> int: + if obj == null: + return TYPE_NIL + for prop in obj.get_property_list(): + if prop.name == name: + return int(prop.get("type", TYPE_NIL)) + return TYPE_NIL + + +static func _property_names(obj: Object) -> Dictionary: + var out: Dictionary = {} + if obj == null: + return out + for prop in obj.get_property_list(): + out[prop.name] = true + return out diff --git a/addons/godot_ai/handlers/particle_handler.gd.uid b/addons/godot_ai/handlers/particle_handler.gd.uid new file mode 100644 index 0000000..ead3722 --- /dev/null +++ b/addons/godot_ai/handlers/particle_handler.gd.uid @@ -0,0 +1 @@ +uid://byfc0pnyb5qww diff --git a/addons/godot_ai/handlers/particle_presets.gd b/addons/godot_ai/handlers/particle_presets.gd new file mode 100644 index 0000000..3bbf1f4 --- /dev/null +++ b/addons/godot_ai/handlers/particle_presets.gd @@ -0,0 +1,293 @@ +@tool +extends RefCounted + +## Curated particle effect blueprints. +## +## Each preset returns {main, process, draw}. The handler applies them +## through the normal write path (one undo action wraps all spawns). + + +## Each preset has {main, process, draw}. `draw` configures the StandardMaterial3D +## attached to the auto-created QuadMesh in draw_pass_1 (GPU 3D only); if +## omitted, the handler falls back to a sensible billboard-particles default. +## `blend_mode: "add"` is what makes fire/magic/explosion glow — without +## additive blending, additively-layered particles just stack to gray. +const _PRESETS := { + "fire": { + "main": { + "amount": 80, + "lifetime": 1.2, + "one_shot": false, + "explosiveness": 0.0, + "preprocess": 0.5, + "local_coords": false, + }, + "process": { + "emission_shape": "sphere", + "emission_sphere_radius": 0.3, + "direction": {"x": 0.0, "y": 1.0, "z": 0.0}, + "spread": 15.0, + "initial_velocity_min": 2.0, + "initial_velocity_max": 4.0, + "gravity": {"x": 0.0, "y": 1.0, "z": 0.0}, # buoyancy + "scale_min": 0.4, + "scale_max": 0.8, + "color_ramp": { + "stops": [ + {"time": 0.0, "color": [1.0, 1.0, 0.9, 1.0]}, + {"time": 0.3, "color": [1.0, 0.6, 0.1, 1.0]}, + {"time": 0.7, "color": [0.8, 0.1, 0.05, 0.7]}, + {"time": 1.0, "color": [0.2, 0.05, 0.05, 0.0]}, + ] + }, + }, + "draw": {"blend_mode": "add"}, + }, + "smoke": { + "main": { + "amount": 40, + "lifetime": 3.0, + "one_shot": false, + "explosiveness": 0.0, + "local_coords": false, + }, + "process": { + "emission_shape": "sphere", + "emission_sphere_radius": 0.4, + "direction": {"x": 0.0, "y": 1.0, "z": 0.0}, + "spread": 20.0, + "initial_velocity_min": 0.5, + "initial_velocity_max": 1.5, + "gravity": {"x": 0.0, "y": 0.2, "z": 0.0}, + "scale_min": 0.6, + "scale_max": 1.4, + "color_ramp": { + "stops": [ + {"time": 0.0, "color": [0.3, 0.3, 0.3, 0.0]}, + {"time": 0.25, "color": [0.35, 0.35, 0.35, 0.7]}, + {"time": 0.75, "color": [0.2, 0.2, 0.2, 0.5]}, + {"time": 1.0, "color": [0.1, 0.1, 0.1, 0.0]}, + ] + }, + }, + # Smoke uses regular alpha blending so it darkens the background. + "draw": {"blend_mode": "mix"}, + }, + "spark_burst": { + "main": { + "amount": 60, + "lifetime": 0.8, + "one_shot": true, + "explosiveness": 1.0, + "local_coords": false, + }, + "process": { + "emission_shape": "point", + "direction": {"x": 0.0, "y": 1.0, "z": 0.0}, + "spread": 180.0, + "initial_velocity_min": 5.0, + "initial_velocity_max": 12.0, + "gravity": {"x": 0.0, "y": -9.8, "z": 0.0}, + "scale_min": 0.05, + "scale_max": 0.12, + "color": {"r": 1.0, "g": 0.9, "b": 0.2, "a": 1.0}, + }, + "draw": { + "blend_mode": "add", + "emission_enabled": true, + "emission": {"r": 1.0, "g": 0.8, "b": 0.2, "a": 1.0}, + "emission_energy_multiplier": 2.0, + }, + }, + "magic_swirl": { + "main": { + "amount": 120, + "lifetime": 2.0, + "one_shot": false, + "explosiveness": 0.0, + "local_coords": false, + }, + "process": { + "emission_shape": "ring", + "emission_ring_radius": 0.8, + "emission_ring_inner_radius": 0.6, + "emission_ring_height": 0.0, + "direction": {"x": 0.0, "y": 1.0, "z": 0.0}, + "spread": 30.0, + "initial_velocity_min": 1.0, + "initial_velocity_max": 2.0, + "gravity": {"x": 0.0, "y": 0.0, "z": 0.0}, + "angular_velocity_min": 90.0, + "angular_velocity_max": 180.0, + "scale_min": 0.1, + "scale_max": 0.2, + "color_ramp": { + "stops": [ + {"time": 0.0, "color": [0.4, 0.9, 1.0, 0.0]}, + {"time": 0.3, "color": [0.5, 0.7, 1.0, 1.0]}, + {"time": 0.7, "color": [1.0, 0.4, 0.9, 1.0]}, + {"time": 1.0, "color": [0.8, 0.2, 0.7, 0.0]}, + ] + }, + }, + "draw": {"blend_mode": "add"}, + }, + "rain": { + "main": { + "amount": 500, + "lifetime": 1.5, + "one_shot": false, + "explosiveness": 0.0, + "local_coords": false, + }, + "process": { + "emission_shape": "box", + "emission_box_extents": {"x": 10.0, "y": 0.1, "z": 10.0}, + "direction": {"x": 0.0, "y": -1.0, "z": 0.0}, + "spread": 2.0, + "initial_velocity_min": 15.0, + "initial_velocity_max": 18.0, + "gravity": {"x": 0.0, "y": -2.0, "z": 0.0}, + "scale_min": 0.02, + "scale_max": 0.04, + "color": {"r": 0.7, "g": 0.85, "b": 1.0, "a": 0.5}, + }, + # Rain drops render as streaks; fixed_y aligns them vertically. + "draw": {"billboard_mode": "fixed_y", "blend_mode": "mix"}, + }, + "explosion": { + "main": { + "amount": 200, + "lifetime": 1.5, + "one_shot": true, + "explosiveness": 1.0, + "local_coords": false, + }, + "process": { + "emission_shape": "sphere", + "emission_sphere_radius": 0.1, + "direction": {"x": 0.0, "y": 1.0, "z": 0.0}, + "spread": 180.0, + "initial_velocity_min": 6.0, + "initial_velocity_max": 10.0, + "gravity": {"x": 0.0, "y": -4.0, "z": 0.0}, + "scale_min": 0.3, + "scale_max": 0.7, + "color_ramp": { + "stops": [ + {"time": 0.0, "color": [1.0, 0.95, 0.5, 1.0]}, + {"time": 0.2, "color": [1.0, 0.4, 0.1, 1.0]}, + {"time": 0.7, "color": [0.3, 0.15, 0.1, 0.7]}, + {"time": 1.0, "color": [0.1, 0.1, 0.1, 0.0]}, + ] + }, + }, + "draw": { + "blend_mode": "add", + "emission_enabled": true, + "emission": {"r": 1.0, "g": 0.5, "b": 0.1, "a": 1.0}, + "emission_energy_multiplier": 1.5, + }, + }, + "lightning": { + # Short, bright, electric-blue spark burst. One-shot — call + # particle_restart to re-trigger. Pairs well with a scene-wide flash. + "main": { + "amount": 40, + "lifetime": 0.35, + "one_shot": true, + "explosiveness": 1.0, + "local_coords": false, + }, + "process": { + "emission_shape": "box", + "emission_box_extents": {"x": 0.1, "y": 1.5, "z": 0.1}, + "direction": {"x": 0.0, "y": -1.0, "z": 0.0}, + "spread": 8.0, + "initial_velocity_min": 18.0, + "initial_velocity_max": 28.0, + "gravity": {"x": 0.0, "y": 0.0, "z": 0.0}, + "scale_min": 0.08, + "scale_max": 0.18, + "color_ramp": { + "stops": [ + {"time": 0.0, "color": [1.0, 1.0, 1.0, 1.0]}, + {"time": 0.2, "color": [0.6, 0.85, 1.0, 1.0]}, + {"time": 0.6, "color": [0.3, 0.5, 1.0, 0.9]}, + {"time": 1.0, "color": [0.1, 0.2, 0.7, 0.0]}, + ] + }, + }, + "draw": { + "blend_mode": "add", + "emission_enabled": true, + "emission": {"r": 0.5, "g": 0.8, "b": 1.0, "a": 1.0}, + "emission_energy_multiplier": 4.0, + }, + }, +} + + +static func list() -> Array: + return _PRESETS.keys() + + +static func has(preset_name: String) -> bool: + return _PRESETS.has(preset_name) + + +## Return deep-copied {main, process, draw} blueprint with overrides merged in, +## plus "user_keys" ({main/process/draw: {key: true}}) recording which keys the +## caller supplied. The handler needs that distinction: preset-blueprint keys +## may skip silently on types they don't apply to (presets are cross-type by +## design), but user-requested overrides must apply or error (#770). +## Overrides may include top-level "main" / "process" / "draw" dicts, or bare +## keys routed to main (_MAIN_KEYS) or process — draw keys must be nested. +static func build(preset_name: String, overrides: Dictionary) -> Variant: + if not _PRESETS.has(preset_name): + return null + var entry: Dictionary = _PRESETS[preset_name].duplicate(true) + var main: Dictionary = entry.get("main", {}) + var process: Dictionary = entry.get("process", {}) + var draw: Dictionary = entry.get("draw", {}) + var user_keys := {"main": {}, "process": {}, "draw": {}} + for key in overrides: + var val = overrides[key] + if key == "main" and val is Dictionary: + for k in val: + main[k] = val[k] + user_keys.main[String(k)] = true + elif key == "process" and val is Dictionary: + for k in val: + process[k] = val[k] + user_keys.process[String(k)] = true + elif key == "draw" and val is Dictionary: + for k in val: + draw[k] = val[k] + user_keys.draw[String(k)] = true + elif _MAIN_KEYS.has(key): + main[key] = val + user_keys.main[String(key)] = true + else: + process[key] = val + user_keys.process[String(key)] = true + entry["main"] = main + entry["process"] = process + entry["draw"] = draw + entry["user_keys"] = user_keys + return entry + + +const _MAIN_KEYS := { + "amount": true, + "lifetime": true, + "one_shot": true, + "explosiveness": true, + "preprocess": true, + "speed_scale": true, + "randomness": true, + "fixed_fps": true, + "emitting": true, + "local_coords": true, + "interp_to_end": true, +} diff --git a/addons/godot_ai/handlers/particle_presets.gd.uid b/addons/godot_ai/handlers/particle_presets.gd.uid new file mode 100644 index 0000000..7c1aac9 --- /dev/null +++ b/addons/godot_ai/handlers/particle_presets.gd.uid @@ -0,0 +1 @@ +uid://bss2ccpmsxo4p diff --git a/addons/godot_ai/handlers/particle_values.gd b/addons/godot_ai/handlers/particle_values.gd new file mode 100644 index 0000000..66782f6 --- /dev/null +++ b/addons/godot_ai/handlers/particle_values.gd @@ -0,0 +1,246 @@ +@tool +extends RefCounted + +## Value coercion + gradient/curve builders for particle properties. + +const MaterialValues := preload("res://addons/godot_ai/handlers/material_values.gd") + +const _EMISSION_SHAPES := { + "point": ParticleProcessMaterial.EMISSION_SHAPE_POINT, + "sphere": ParticleProcessMaterial.EMISSION_SHAPE_SPHERE, + "sphere_surface": ParticleProcessMaterial.EMISSION_SHAPE_SPHERE_SURFACE, + "box": ParticleProcessMaterial.EMISSION_SHAPE_BOX, + "points": ParticleProcessMaterial.EMISSION_SHAPE_POINTS, + "directed_points": ParticleProcessMaterial.EMISSION_SHAPE_DIRECTED_POINTS, + "ring": ParticleProcessMaterial.EMISSION_SHAPE_RING, +} + + +## Resolve a shape name to the int enum, or return null. +static func resolve_emission_shape(value: Variant) -> Variant: + if value is int: + return value + if value is float: + return int(value) + if value is String: + var key := String(value).to_lower() + if _EMISSION_SHAPES.has(key): + return _EMISSION_SHAPES[key] + return null + + +static func emission_shape_names() -> Array: + return _EMISSION_SHAPES.keys() + + +## Build a Gradient from {stops: [{time, color}]} dict. +static func build_gradient(value: Variant) -> Variant: + if value is Gradient: + return value + if value is GradientTexture1D: + return (value as GradientTexture1D).gradient + if not (value is Dictionary): + return null + var d: Dictionary = value + if not d.has("stops"): + return null + var stops_array = d.get("stops") + if not (stops_array is Array): + return null + var offsets := PackedFloat32Array() + var colors := PackedColorArray() + for stop in stops_array: + if not (stop is Dictionary): + return null + offsets.append(float(stop.get("time", 0.0))) + var c = MaterialValues.parse_color(stop.get("color")) + if c == null: + return null + colors.append(c) + var grad := Gradient.new() + grad.offsets = offsets + grad.colors = colors + return grad + + +## Build a GradientTexture1D wrapping a Gradient (what ParticleProcessMaterial.color_ramp wants). +static func build_gradient_texture(value: Variant) -> Variant: + if value is GradientTexture1D: + return value + var grad = build_gradient(value) + if grad == null: + return null + var tex := GradientTexture1D.new() + tex.gradient = grad + return tex + + +## Build a Curve from [{time, value}] or {points: [...]} (float-over-time). +static func build_curve(value: Variant) -> Variant: + if value is Curve: + return value + if value is CurveTexture: + return (value as CurveTexture).curve + var points_array: Variant = null + if value is Array: + points_array = value + elif value is Dictionary and value.has("points"): + points_array = value["points"] + if not (points_array is Array): + return null + var curve := Curve.new() + for pt in points_array: + if not (pt is Dictionary): + return null + var t := float(pt.get("time", 0.0)) + var v := float(pt.get("value", 0.0)) + curve.add_point(Vector2(t, v)) + return curve + + +static func build_curve_texture(value: Variant) -> Variant: + if value is CurveTexture: + return value + var curve = build_curve(value) + if curve == null: + return null + var tex := CurveTexture.new() + tex.curve = curve + return tex + + +## Coerce a particle property value to the appropriate type. +## Handles: Vector3/gravity/direction, Color, float, int, bool, enum strings. +## For color_ramp returns a GradientTexture1D; for *_curve returns CurveTexture. +static func coerce(property: String, value: Variant, target_type: int) -> Dictionary: + # Special-cased properties. + if property == "emission_shape": + var shape = resolve_emission_shape(value) + if shape == null: + return { + "ok": false, + "error": "Invalid emission_shape '%s'. Valid: %s" % [ + value, ", ".join(emission_shape_names()) + ], + } + return {"ok": true, "value": int(shape)} + + if property == "color_ramp" or property == "color_initial_ramp": + var tex = build_gradient_texture(value) + if tex == null: + return {"ok": false, "error": "Invalid gradient for %s (expected {stops: [{time, color}]})" % property} + return {"ok": true, "value": tex} + + if property == "color" and value is Dictionary and not (value as Dictionary).has("stops"): + # color is a single Color, not a ramp. + var c = MaterialValues.parse_color(value) + if c == null: + return {"ok": false, "error": "Invalid color"} + return {"ok": true, "value": c} + + if property.ends_with("_curve"): + var tex = build_curve_texture(value) + if tex == null: + return {"ok": false, "error": "Invalid curve for %s (expected [{time, value}])" % property} + return {"ok": true, "value": tex} + + # Fall through to the material coercer (handles Color/Vec3/Vec2/float/int/bool/enum). + return MaterialValues.coerce_material_value(property, value, target_type) + + +## Build a StandardMaterial3D suitable for GPUParticles3D draw-pass rendering. +## +## Godot's default Mesh has no material, which means ParticleProcessMaterial's +## color_ramp (which drives the COLOR varying) gets ignored and particles +## render as flat white squares that don't face the camera. A correct default +## must have vertex_color_use_as_albedo=true, billboard=particles, unshaded, +## and alpha transparency so the gradient actually modulates the pixels. +## +## Config is an optional dict that overrides individual properties. Supported +## keys match BaseMaterial3D properties (plus enum-by-name via MaterialValues): +## blend_mode: "mix" | "add" | "sub" | "mul" +## transparency: "disabled" | "alpha" | "alpha_scissor" | "alpha_hash" | "alpha_depth_pre_pass" +## shading_mode: "unshaded" | "per_pixel" | "per_vertex" +## billboard_mode: "disabled" | "enabled" | "fixed_y" | "particles" +## vertex_color_use_as_albedo: bool +## emission_enabled: bool +## emission: Color +## emission_energy_multiplier: float +## albedo_color: Color +## albedo_texture: res:// path +## (anything else accepted by BaseMaterial3D.set()) +## +## Returns {ok: true, material: StandardMaterial3D, applied: Array[String]}, +## or {ok: false, key, error, unknown_key} when a config key is not a +## StandardMaterial3D property or its value fails coercion — draw config must +## not disappear silently (#770). +static func build_draw_material(config: Dictionary) -> Dictionary: + var mat := StandardMaterial3D.new() + # Sensible defaults for particle draw-pass rendering. + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.vertex_color_use_as_albedo = true + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + mat.billboard_mode = BaseMaterial3D.BILLBOARD_PARTICLES + mat.billboard_keep_scale = true + # Configure from dict overrides. + var applied: Array[String] = [] + for key in config: + var prop_name := String(key) + var prop_type := _object_property_type(mat, prop_name) + if prop_type == TYPE_NIL: + return { + "ok": false, + "key": prop_name, + "unknown_key": true, + "error": "Unknown draw key '%s' (not a StandardMaterial3D property)" % prop_name, + } + var coerce_result := MaterialValues.coerce_material_value( + prop_name, config[prop_name], prop_type + ) + if not coerce_result.ok: + return { + "ok": false, + "key": prop_name, + "unknown_key": false, + "error": "draw.%s: %s" % [prop_name, coerce_result.error], + } + mat.set(prop_name, coerce_result.value) + applied.append(prop_name) + return {"ok": true, "material": mat, "applied": applied} + + +static func _object_property_type(obj: Object, name: String) -> int: + if obj == null: + return TYPE_NIL + for prop in obj.get_property_list(): + if prop.name == name: + return int(prop.get("type", TYPE_NIL)) + return TYPE_NIL + + +## Serialize for response. +static func serialize(value: Variant) -> Variant: + if value == null: + return null + if value is GradientTexture1D: + var grad := (value as GradientTexture1D).gradient + if grad == null: + return {"type": "GradientTexture1D", "stops": []} + var stops: Array = [] + for i in grad.offsets.size(): + var c: Color = grad.colors[i] + stops.append({ + "time": grad.offsets[i], + "color": {"r": c.r, "g": c.g, "b": c.b, "a": c.a}, + }) + return {"type": "GradientTexture1D", "stops": stops} + if value is CurveTexture: + var curve := (value as CurveTexture).curve + if curve == null: + return {"type": "CurveTexture", "points": []} + var points: Array = [] + for i in curve.get_point_count(): + var p := curve.get_point_position(i) + points.append({"time": p.x, "value": p.y}) + return {"type": "CurveTexture", "points": points} + return MaterialValues.serialize_value(value) diff --git a/addons/godot_ai/handlers/particle_values.gd.uid b/addons/godot_ai/handlers/particle_values.gd.uid new file mode 100644 index 0000000..71f6adc --- /dev/null +++ b/addons/godot_ai/handlers/particle_values.gd.uid @@ -0,0 +1 @@ +uid://bnnnjq06dmclc diff --git a/addons/godot_ai/handlers/physics_shape_handler.gd b/addons/godot_ai/handlers/physics_shape_handler.gd new file mode 100644 index 0000000..dc5156c --- /dev/null +++ b/addons/godot_ai/handlers/physics_shape_handler.gd @@ -0,0 +1,338 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Sizes a CollisionShape2D/CollisionShape3D to match a visual sibling's +## bounds. Auto-creates the concrete Shape subclass when the slot is empty +## or the requested type differs — bundling creation and sizing in a single +## undo action. +## +## Shape type defaults: Box for 3D, Rectangle for 2D. + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +const _SHAPE_3D_CLASSES := { + "box": "BoxShape3D", + "sphere": "SphereShape3D", + "capsule": "CapsuleShape3D", + "cylinder": "CylinderShape3D", +} + +const _SHAPE_2D_CLASSES := { + "rectangle": "RectangleShape2D", + "circle": "CircleShape2D", + "capsule": "CapsuleShape2D", +} + + +func autofit(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var scene_root: Node = _resolved.scene_root + + var is_3d := node is CollisionShape3D + var is_2d := node is CollisionShape2D + if not (is_3d or is_2d): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node at %s is %s — must be CollisionShape3D or CollisionShape2D" % [node_path, node.get_class()] + ) + + var source_path: String = params.get("source_path", "") + var source: Node = null + if source_path.is_empty(): + var search := _find_bounds_visual(node, is_3d, scene_root) + if search.has("error"): + return search.error + source = search.source + else: + source = McpScenePath.resolve(source_path, scene_root) + if source == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, + "source_path: %s" % McpScenePath.format_node_error(source_path, scene_root)) + + var shape_type: String = params.get("shape_type", "box" if is_3d else "rectangle") + var type_map := _SHAPE_3D_CLASSES if is_3d else _SHAPE_2D_CLASSES + # Accept either the short form ("box") or the matching Godot class name + # ("BoxShape3D") — every other tool in the server takes class names, and + # resource_get_info(type="Shape3D") surfaces concrete_subclasses by class. + if not type_map.has(shape_type): + for short_form in type_map: + if type_map[short_form] == shape_type: + shape_type = short_form + break + if not type_map.has(shape_type): + var valid_pairs: Array[String] = [] + for short_form in type_map: + valid_pairs.append("%s (%s)" % [short_form, type_map[short_form]]) + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid shape_type '%s' for %s. Valid: %s" % [shape_type, node.get_class(), ", ".join(valid_pairs)] + ) + var shape_class: String = type_map[shape_type] + + # Measure the visual. + var bounds := _measure_bounds(source, is_3d) + if bounds.has("error"): + return bounds.error + + # Reuse the existing shape if it already matches the requested class; + # otherwise create a fresh one of the right type in the same undo action. + var existing_shape: Shape3D = null + var existing_shape_2d: Shape2D = null + if is_3d: + existing_shape = node.shape + else: + existing_shape_2d = node.shape + + var needs_new_shape := false + if is_3d: + needs_new_shape = existing_shape == null or existing_shape.get_class() != shape_class + else: + needs_new_shape = existing_shape_2d == null or existing_shape_2d.get_class() != shape_class + + var target_shape: Resource + if needs_new_shape: + var instance := ClassDB.instantiate(shape_class) + if instance == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % shape_class) + target_shape = instance + else: + target_shape = existing_shape if is_3d else existing_shape_2d + + # Compute and apply size. + var size_info := _apply_shape_size(target_shape, shape_type, bounds, is_3d) + var old_shape = existing_shape if is_3d else existing_shape_2d + + _undo_redo.create_action("MCP: Autofit %s on %s" % [shape_class, node.name]) + if needs_new_shape: + _undo_redo.add_do_property(node, "shape", target_shape) + _undo_redo.add_undo_property(node, "shape", old_shape) + _undo_redo.add_do_reference(target_shape) + else: + # Existing shape stays, but its size changes — snapshot size for undo. + for key in size_info.applied: + var new_val = target_shape.get(key) + var old_val = size_info.previous.get(key) + _undo_redo.add_do_property(target_shape, key, new_val) + _undo_redo.add_undo_property(target_shape, key, old_val) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "source_path": McpScenePath.from_node(source, scene_root) if source_path.is_empty() else source_path, + "shape_type": shape_type, + "shape_class": shape_class, + "shape_created": needs_new_shape, + "size": size_info.size_response, + "undoable": true, + } + } + + +## Returns `{source: Node}` on success, `{error: }` on failure. +## Ambiguous tier-2 matches put candidate scene paths in +## `error.data.candidates` so callers can pick one explicitly. +static func _find_bounds_visual(collision_node: Node, is_3d: bool, scene_root: Node) -> Dictionary: + var parent := collision_node.get_parent() + if parent == null: + return {"error": _no_visual_error(is_3d)} + + # Tier 1: direct siblings of the collision shape. Uses the broad + # VisualInstance3D filter for backwards compatibility — callers who put + # the visual directly next to the collision picked it on purpose. + var siblings := _measurable_visuals(parent.get_children(), collision_node, is_3d, false) + if not siblings.is_empty(): + return {"source": siblings[0]} + + # Tier 2: parent siblings (uncles). Tighten the filter to + # GeometryInstance3D so we don't auto-pick a Light3D / DirectionalLight3D + # as a collision source. Auto-pick only when unambiguous; surface + # multiple candidates so the agent chooses. + var grandparent := parent.get_parent() + if grandparent == null: + return {"error": _no_visual_error(is_3d)} + var uncles := _measurable_visuals(grandparent.get_children(), parent, is_3d, true) + if uncles.size() == 1: + return {"source": uncles[0]} + if uncles.size() > 1: + var paths: Array[String] = [] + for n in uncles: + paths.append(McpScenePath.from_node(n, scene_root)) + var msg := "Multiple visual candidates near %s — pass source_path explicitly. Candidates: %s" % [ + McpScenePath.from_node(collision_node, scene_root), + ", ".join(paths), + ] + var err := ErrorCodes.make(ErrorCodes.INVALID_PARAMS, msg) + err["error"]["data"] = {"candidates": paths} + return {"error": err} + return {"error": _no_visual_error(is_3d)} + + +## Filter `nodes` for ones we can measure as a collision source. When +## `strict` is true (tier 2 / uncles) only GeometryInstance3D counts in 3D — +## avoids picking up lights as accidental sources. 2D filter is already +## narrow enough that strictness doesn't change behavior. +static func _measurable_visuals(nodes: Array, exclude: Node, is_3d: bool, strict: bool) -> Array[Node]: + var out: Array[Node] = [] + for n in nodes: + if n == exclude: + continue + if is_3d: + if strict: + if n is GeometryInstance3D: + out.append(n) + elif n is VisualInstance3D: + out.append(n) + elif n is Sprite2D or n is TextureRect: + out.append(n) + return out + + +static func _no_visual_error(is_3d: bool) -> Dictionary: + var hint := "MeshInstance3D" if is_3d else "Sprite2D" + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "No visual found near collision shape — searched siblings and parent-siblings. Pass source_path explicitly (e.g. a %s)" % hint, + ) + + +## Measure the visual bounds of `source`. Returns {aabb: AABB} for 3D or +## {rect: Rect2} for 2D on success, or {error: ...} on failure. +## Bounds are returned in world-ish size (local extents scaled by the source +## node's own transform scale) so a MeshInstance3D at scale=(2,2,2) gives an +## 8× volume collider, not a unit collider. +static func _measure_bounds(source: Node, is_3d: bool) -> Dictionary: + if is_3d: + if source is VisualInstance3D: + var aabb: AABB = (source as VisualInstance3D).get_aabb() + # get_aabb() is local-space; pre-multiply by the source's scale + # so the collider tracks what you actually see in the viewport. + var scale_3d: Vector3 = (source as Node3D).transform.basis.get_scale() + aabb.position = aabb.position * scale_3d + aabb.size = aabb.size * scale_3d + return {"aabb": aabb} + return {"error": ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Source %s has no measurable 3D bounds (must be VisualInstance3D subclass)" % source.get_class() + )} + # 2D + if source is Sprite2D: + var s: Sprite2D = source + var srect: Rect2 = s.get_rect() + # get_rect() reports the local texture rect and ignores scale. + srect.position = srect.position * s.scale + srect.size = srect.size * s.scale + return {"rect": srect} + if source is TextureRect: + var tr: TextureRect = source + # tr.size is the Control's laid-out size, which is Vector2.ZERO + # before the first layout pass (e.g. just after the node was created + # via MCP). Fall back to the texture's own size when that happens, + # so autofit doesn't silently produce a zero-sized shape. + var tr_size: Vector2 = tr.size + if tr_size.is_zero_approx(): + if tr.texture != null: + tr_size = tr.texture.get_size() * tr.scale + else: + return {"error": ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "TextureRect at %s has zero layout size and no texture to fall back to — autofit would produce a zero-sized shape" % source.name + )} + return {"rect": Rect2(Vector2.ZERO, tr_size)} + return {"error": ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Source %s has no measurable 2D bounds (must be Sprite2D or TextureRect)" % source.get_class() + )} + + +## Apply size to `shape` based on `bounds` and the requested shape_type. +## Returns {applied: [property_names], previous: {name: old_value}, size_response: dict}. +static func _apply_shape_size(shape: Resource, shape_type: String, bounds: Dictionary, is_3d: bool) -> Dictionary: + var applied: Array[String] = [] + var previous := {} + var size_response := {} + + if is_3d: + var aabb: AABB = bounds.aabb + var size_v: Vector3 = aabb.size + match shape_type: + "box": + previous["size"] = shape.get("size") + (shape as BoxShape3D).size = size_v + applied.append("size") + size_response = {"x": size_v.x, "y": size_v.y, "z": size_v.z} + "sphere": + var r := maxf(maxf(size_v.x, size_v.y), size_v.z) * 0.5 + previous["radius"] = shape.get("radius") + (shape as SphereShape3D).radius = r + applied.append("radius") + size_response = {"radius": r} + "capsule": + var cap := shape as CapsuleShape3D + var r2 := maxf(size_v.x, size_v.z) * 0.5 + var h := size_v.y + previous["radius"] = cap.radius + previous["height"] = cap.height + # CapsuleShape3D enforces height >= 2*radius and silently + # clamps setters that would violate it. Read back the + # stored values so the response reflects reality. + cap.radius = r2 + cap.height = h + applied.append("radius") + applied.append("height") + size_response = {"radius": cap.radius, "height": cap.height} + "cylinder": + var cyl := shape as CylinderShape3D + var r3 := maxf(size_v.x, size_v.z) * 0.5 + var ch := size_v.y + previous["radius"] = cyl.radius + previous["height"] = cyl.height + cyl.radius = r3 + cyl.height = ch + applied.append("radius") + applied.append("height") + size_response = {"radius": cyl.radius, "height": cyl.height} + else: + var rect: Rect2 = bounds.rect + var sz: Vector2 = rect.size + match shape_type: + "rectangle": + previous["size"] = shape.get("size") + (shape as RectangleShape2D).size = sz + applied.append("size") + size_response = {"x": sz.x, "y": sz.y} + "circle": + var cr := maxf(sz.x, sz.y) * 0.5 + previous["radius"] = shape.get("radius") + (shape as CircleShape2D).radius = cr + applied.append("radius") + size_response = {"radius": cr} + "capsule": + var cap2 := shape as CapsuleShape2D + var cr2 := sz.x * 0.5 + var ch2 := sz.y + previous["radius"] = cap2.radius + previous["height"] = cap2.height + # CapsuleShape2D has the same height >= 2*radius invariant + # as its 3D counterpart; read back what Godot actually kept. + cap2.radius = cr2 + cap2.height = ch2 + applied.append("radius") + applied.append("height") + size_response = {"radius": cap2.radius, "height": cap2.height} + + return {"applied": applied, "previous": previous, "size_response": size_response} diff --git a/addons/godot_ai/handlers/physics_shape_handler.gd.uid b/addons/godot_ai/handlers/physics_shape_handler.gd.uid new file mode 100644 index 0000000..09acb4a --- /dev/null +++ b/addons/godot_ai/handlers/physics_shape_handler.gd.uid @@ -0,0 +1 @@ +uid://cdg8kthqla1cj diff --git a/addons/godot_ai/handlers/project_handler.gd b/addons/godot_ai/handlers/project_handler.gd new file mode 100644 index 0000000..eb7d36f --- /dev/null +++ b/addons/godot_ai/handlers/project_handler.gd @@ -0,0 +1,572 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles project settings and filesystem search commands. + +const NodeHandler := preload("res://addons/godot_ai/handlers/node_handler.gd") +const RUN_READY_WAIT_SEC := 3.0 + +## ProjectSettings keys that decide what the engine EXECUTES at project +## startup. `McpPathValidator._reject_sensitive_write` already refuses direct +## writes to `res://project.godot`, `res://override.cfg` and `res://.godot/` +## for exactly this reason — but `set_project_setting` writes that same +## manifest through the settings API, so without this list the guard is +## trivially side-steppable: +## +## settings_set key="autoload/Boot" value="*res://../../evil.gd" +## +## would land arbitrary code on the next project open, and a `project.godot` +## diff is easy to miss in review. Autoloads have a validated route of their +## own (`autoload_handler.add_autoload`, which runs the path through +## `McpPathValidator`); the rest are refused outright because there is no +## legitimate agent workflow for repointing the engine's startup execution. +## +## Deliberately NARROW. A denylist that over-blocks turns settings_set into a +## tool agents can't use, so only keys that actually carry code (or a command +## line) are listed — not their whole section. `application/run/` is an exact +## entry for `main_scene` precisely because its siblings (`max_fps`, +## `low_processor_mode`, …) are inert and must stay writable; likewise +## `application/boot_splash/image` is data, not code, and is NOT blocked. +## +## Prefix entries match the key and anything beneath it, and are used only +## where every key under the prefix is code-bearing. Exact entries match only +## themselves. Comparison is case-folded — ProjectSettings keys are +## case-sensitive, but a case variant that Godot would reject is still a +## clearer error coming from here than from a half-applied save. +const STARTUP_EXECUTION_KEY_PREFIXES: Array[String] = [ + "autoload/", ## every key under it is a script path + "editor_plugins/", ## enabled-plugin list; each entry is loaded as code +] +const STARTUP_EXECUTION_KEYS_EXACT: Array[String] = [ + "application/run/main_scene", ## the scene the game boots into + "editor/script/templates_search_path", ## where the editor loads templates from + "editor/run/main_run_args", ## command line for the run +] + + +## Returns "" when `key` may be written via set_project_setting, or a +## human-readable refusal reason otherwise. Static so it is unit-testable +## without instancing the handler. +static func startup_execution_key_refusal(key: String) -> String: + var lowered := key.strip_edges().to_lower() + for prefix in STARTUP_EXECUTION_KEY_PREFIXES: + if lowered.begins_with(prefix): + if prefix == "autoload/": + return ( + "Refusing to set '%s' — autoloads run code at project startup. " % key + + "Use autoload_manage(op='add'), which validates the script path." + ) + return ( + "Refusing to set '%s' — keys under '%s' are loaded as code " % [key, prefix] + + "at project startup." + ) + for exact in STARTUP_EXECUTION_KEYS_EXACT: + if lowered == exact: + return ( + "Refusing to set '%s' — this key controls what the engine loads " % key + + "or executes at project startup." + ) + return "" + +var _connection: McpConnection +var _debugger_plugin +var _editor_log_buffer + + +func _init(connection: McpConnection = null, debugger_plugin = null, editor_log_buffer = null) -> void: + _connection = connection + _debugger_plugin = debugger_plugin + _editor_log_buffer = editor_log_buffer + + +func get_project_setting(params: Dictionary) -> Dictionary: + var key: String = params.get("key", "") + if key.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: key") + + if not ProjectSettings.has_setting(key): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Setting not found: %s" % key) + + var value = ProjectSettings.get_setting(key) + return { + "data": { + "key": key, + "value": NodeHandler._serialize_value(value), + "type": type_string(typeof(value)), + } + } + + +func set_project_setting(params: Dictionary) -> Dictionary: + var key: String = params.get("key", "") + if key.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: key") + + if not params.has("value"): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: value") + + ## Refuse the startup-execution surface before touching ProjectSettings — + ## see STARTUP_EXECUTION_KEY_PREFIXES for why this guard exists here and + ## not only in McpPathValidator. + var refusal := startup_execution_key_refusal(key) + if not refusal.is_empty(): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, refusal) + + var value = params.get("value") + var had_setting := ProjectSettings.has_setting(key) + var old_value = ProjectSettings.get_setting(key) if had_setting else null + # JSON has no distinct int type: Godot parses `1920` as float. If the + # existing setting is TYPE_INT, coerce whole-number floats back to int so + # we don't silently flip typed-int settings (viewport_width, etc.) to + # floats on disk. See issue #31. + if had_setting and typeof(old_value) == TYPE_INT and typeof(value) == TYPE_FLOAT and float(int(value)) == value: + value = int(value) + ProjectSettings.set_setting(key, value) + var err := ProjectSettings.save() + if err != OK: + if had_setting: + ProjectSettings.set_setting(key, old_value) + else: + ProjectSettings.clear(key) + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to save project settings (error %d)" % err) + + return { + "data": { + "key": key, + "value": NodeHandler._serialize_value(value), + "old_value": NodeHandler._serialize_value(old_value), + "type": type_string(typeof(value)), + "undoable": false, + "reason": "ProjectSettings changes are saved to disk", + } + } + + +func run_project(params: Dictionary) -> Dictionary: + var mode: String = params.get("mode", "main") + var autosave: bool = params.get("autosave", true) + # Idempotent: a project that's already running satisfies the caller's intent. + # Returning INVALID_PARAMS here punished agents that legitimately called run + # to ensure the project is playing (87+ installs/day hit the matching + # stop-not-running case in telemetry). Surface state via was_already_running + # so a caller wanting a *different* scene can detect and stop+restart. + if EditorInterface.is_playing_scene(): + return _run_project_current_liveness_response( + _run_project_base_data( + mode, + str(params.get("scene", "")), + autosave, + true, + "Project was already running; no action taken" + ) + ) + + var validation_error: Variant = null + if mode == "custom": + var custom_scene: String = params.get("scene", "") + if custom_scene.is_empty(): + validation_error = ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: scene (required when mode='custom')") + else: + ## play_custom_scene() was the last path-taking op in the plugin + ## with no containment check; every sibling that accepts a scene + ## path validates it (scene_handler.open_scene, + ## node_handler.create_node's scene_path). + validation_error = McpPathValidator.loadable_error(custom_scene, "scene") + elif mode != "main" and mode != "current": + validation_error = ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid mode '%s' — use 'main', 'current', or 'custom'" % mode) + if validation_error != null: + return validation_error + + # play_*_scene internally triggers try_autosave() → _save_scene_with_preview() + # which renders a preview thumbnail and calls frame processing. If our + # WebSocket connection's _process() re-enters during that render, the + # engine crashes (SIGABRT in _save_scene_with_preview). Pause processing + # around the play call — same pattern as SceneHandler.save_scene. + if _connection: + _connection.pause_processing = true + + # try_autosave() reads run/auto_save/save_before_running every call, so + # toggling it off around the play call suppresses the save without + # touching the user's persisted preference. Issue #81. + var autosave_key := "run/auto_save/save_before_running" + var editor_settings: EditorSettings = null + if not autosave: + editor_settings = EditorInterface.get_editor_settings() + var prior_autosave: bool = true + var restore_setting := false + if editor_settings != null and editor_settings.has_setting(autosave_key): + prior_autosave = bool(editor_settings.get_setting(autosave_key)) + editor_settings.set_setting(autosave_key, false) + restore_setting = true + + if _debugger_plugin != null: + _debugger_plugin.begin_game_run(_editor_log_cursor(), _game_helper_autoload_expected()) + + match mode: + "main": + EditorInterface.play_main_scene() + "current": + EditorInterface.play_current_scene() + "custom": + var scene_path: String = params.get("scene", "") + EditorInterface.play_custom_scene(scene_path) + + if restore_setting: + editor_settings.set_setting(autosave_key, prior_autosave) + + if _connection: + _connection.pause_processing = false + + var base_data := _run_project_base_data( + mode, + str(params.get("scene", "")), + autosave, + false, + "Play/stop is a runtime action" + ) + var request_id: String = params.get("_request_id", "") + if _connection != null and _debugger_plugin != null and not request_id.is_empty(): + _finish_run_project_deferred(request_id, base_data, _connection, _debugger_plugin) + return McpDispatcher.DEFERRED_RESPONSE + + return _run_project_current_liveness_response(base_data) + + +func _editor_log_cursor() -> int: + return _editor_log_buffer.appended_total() if _editor_log_buffer != null else 0 + + +func _game_helper_autoload_expected() -> bool: + return ProjectSettings.has_setting("autoload/_mcp_game_helper") + + +static func _run_project_base_data( + mode: String, + scene: String, + autosave: bool, + was_already_running: bool, + reason: String +) -> Dictionary: + return { + "mode": mode, + "scene": scene, + "autosave": autosave, + "was_already_running": was_already_running, + "undoable": false, + "reason": reason, + } + + +func _run_project_current_liveness_response(base_data: Dictionary) -> Dictionary: + if _debugger_plugin == null: + return {"data": base_data} + var status: Dictionary = _debugger_plugin.get_game_status(-1, RUN_READY_WAIT_SEC) + ## One-shot read — force a Debugger-tab scan so boot errors that landed + ## after the last gated scan are in this response (#641). + var errors_info: Dictionary = _debugger_plugin.recent_editor_errors_since(int(status.get("editor_log_cursor", 0)), true) + return _run_project_response(base_data, _run_project_liveness_decision(status, errors_info)) + + +## `static` is load-bearing (#712, same rationale as the script/filesystem +## handlers and editor_handler._do_reload_plugin): this coroutine awaits +## across frames, and a plugin reload frees this RefCounted handler +## mid-await — resuming an instance coroutine on a freed object errors. +## `connection` and `debugger_plugin` are parameterized explicitly and +## re-validated after every await; the response is dropped silently when +## either died (the server's command timeout surfaces the failure). +static func _finish_run_project_deferred( + request_id: String, base_data: Dictionary, connection, debugger_plugin +) -> void: + var tree: SceneTree = connection.get_tree() + while true: + await tree.process_frame + if not is_instance_valid(connection) or not is_instance_valid(debugger_plugin): + return + var pre_status: Dictionary = debugger_plugin.get_game_status(-1, RUN_READY_WAIT_SEC) + if ( + not EditorInterface.is_playing_scene() + and int(pre_status.get("elapsed_msec", 0)) > 100 + and str(pre_status.get("status", "stopped")) == "launching" + ): + debugger_plugin.end_game_run() + var status: Dictionary = debugger_plugin.get_game_status(-1, RUN_READY_WAIT_SEC) + var errors_info: Dictionary = debugger_plugin.recent_editor_errors_since(int(status.get("editor_log_cursor", 0))) + var decision := _run_project_liveness_decision(status, errors_info) + if not bool(decision.get("resolve", false)): + continue + ## #641: the loop above polls with gated (cheap) scans; boot parse + ## errors can land in the Errors tab in the same frames the run goes + ## live. Re-gather once with a forced scan before replying so the + ## response reports them instead of leaving them to a later + ## logs_read. Rebuilding the decision with strictly-more errors can + ## only keep it resolved (errors never un-resolve a decision). + errors_info = debugger_plugin.recent_editor_errors_since(int(status.get("editor_log_cursor", 0)), true) + decision = _run_project_liveness_decision(status, errors_info) + connection.send_deferred_response(request_id, _run_project_response(base_data, decision)) + return + + +static func _run_project_response(base_data: Dictionary, decision: Dictionary) -> Dictionary: + var data := base_data.duplicate(true) + var game_status: Dictionary = decision.get("game_status", {}) + data["game_status"] = game_status + data["helper_live"] = bool(game_status.get("helper_live", false)) + data["session_active"] = bool(game_status.get("session_active", false)) + if bool(data.get("was_already_running", false)): + data["reason"] = _run_project_already_running_message(decision) + else: + data["reason"] = decision.get("message", data.get("reason", "Play/stop is a runtime action")) + data["recent_errors"] = decision.get("recent_errors", []) + data["recent_errors_scope"] = decision.get("recent_errors_scope", "none") + data["recent_errors_may_predate_run"] = decision.get("recent_errors_may_predate_run", false) + data["recent_errors_truncated"] = decision.get("recent_errors_truncated", false) + data.merge(McpDebuggerPlugin.split_errors_by_scope(data["recent_errors"], data["recent_errors_scope"]), true) + return {"data": data} + + +static func _run_project_already_running_message(decision: Dictionary) -> String: + var state := str(decision.get("liveness_status", "unknown")) + match state: + "live": + var live_errors: Array = decision.get("recent_errors", []) + if not live_errors.is_empty() and str(decision.get("recent_errors_scope", "none")) == "run": + return ( + "Project was already running; the Godot AI game helper is live, but %d editor error%s surfaced during this run (first: %s). Check logs_read(source='editor', include_details=true)." + % [live_errors.size(), "s" if live_errors.size() != 1 else "", _format_editor_error_summary(live_errors[0])] + ) + return "Project was already running; the Godot AI game helper is live." + "not_live": + var errors: Array = decision.get("recent_errors", []) + var scope := str(decision.get("recent_errors_scope", "none")) + if not errors.is_empty() and scope == "run": + return "Project was already running but failed to load before the Godot AI game helper registered: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(errors[0]) + if not errors.is_empty(): + return "Project was already running but is not responding. A recent editor error may be related, but may predate this run: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(errors[0]) + return "Project was already running but did not become live before the helper-ready window elapsed. Check logs_read(source='editor', include_details=true) and poll editor_state." + "break": + var break_errors: Array = decision.get("recent_errors", []) + if not break_errors.is_empty() and str(decision.get("recent_errors_scope", "none")) == "run": + return "Project was already running but the game is parked at a debugger break: %s. Call project_manage(op='stop') to end the run, fix the error, and relaunch." % _format_editor_error_summary(break_errors[0]) + if not break_errors.is_empty(): + return "Project was already running but the game is parked at a debugger break. A recent editor error may be related, but may predate this run: %s. Call project_manage(op='stop') to end the run." % _format_editor_error_summary(break_errors[0]) + return "Project was already running but the game is parked at a debugger break. Call project_manage(op='stop') to end the run; the break reason is in the editor's Debugger panel." + "no_helper": + return "Project was already running, but no _mcp_game_helper autoload is expected. Headless or custom-main-loop projects cannot confirm helper liveness." + "launching": + return "Project was already running and is still waiting for the Godot AI game helper to register. Poll editor_state shortly." + "stopped": + return "Project was already marked playing by the editor, but no active game liveness run exists." + _: + return "Project was already running; current liveness status is %s." % state + + +## Static (with the rest of the deferred-finisher chain) so the #712 +## load-bearing-static coroutines above can call it after their owner +## handler was freed. Uses no instance state. +static func _run_project_liveness_decision(status: Dictionary, errors_info: Dictionary = {}) -> Dictionary: + var enriched_status := McpDebuggerPlugin.with_liveness_flags(status) + var state := str(status.get("status", "stopped")) + var recent_errors: Array = errors_info.get("errors", []) + var errors_scope := str(errors_info.get("scope", "none")) + var truncated := bool(errors_info.get("truncated", false)) + ## Clear errors that predate this run's window — they don't belong in + ## a successful launch response and only add noise. They remain + ## reachable via logs_read(source='editor') and the retained buffer so + ## failed-run debugging is unaffected. + ## #635 tradeoff: a genuine in-run error whose Errors-tab row carries + ## an empty or byte-identical time text can be misclassified as + ## retained_recent and will be dropped here. Still reachable via + ## logs_read. + if state == "live" and errors_scope == "retained_recent": + recent_errors = [] + errors_scope = "none" + var correlated_error := not recent_errors.is_empty() and errors_scope == "run" + var elapsed_msec := int(status.get("elapsed_msec", 0)) + var ready_wait_msec := int(status.get("ready_wait_msec", int(RUN_READY_WAIT_SEC * 1000.0))) + var decision := { + "resolve": false, + "game_status": enriched_status, + "liveness_status": state, + "recent_errors": recent_errors, + "recent_errors_scope": errors_scope, + "recent_errors_may_predate_run": errors_scope == "retained_recent", + "recent_errors_truncated": truncated, + "message": "", + } + if state == "live": + decision["resolve"] = true + if correlated_error: + ## #641: "live" only means the helper autoload registered — scripts + ## can still have failed to parse or load during boot (a broken + ## node script does not stop the game from running). Surface those + ## errors in the success message so agents don't read a clean + ## launch into a run that silently lost scripts. + decision["message"] = ( + "Game launched and the Godot AI game helper is live, but %d editor error%s surfaced during startup (first: %s) — likely a script that failed to parse or load. Check logs_read(source='editor', include_details=true)." + % [recent_errors.size(), "s" if recent_errors.size() != 1 else "", _format_editor_error_summary(recent_errors[0])] + ) + if truncated: + decision["message"] += " Editor logs since this run may be truncated; showing retained errors." + else: + decision["message"] = "Game launched and the Godot AI game helper is live." + elif state == "break": + ## #645: the game process is parked in a remote-debugger break. A + ## boot-time parse error (GDScriptLanguage::debug_break_parse) produces + ## no Errors-tab row, no Logger entry, and no game-log line — the + ## synthesized break record is the only evidence, and it lands a + ## moment after the break signal (stack frames arrive async). Wait for + ## it (correlated_error) before resolving; the ready window is the + ## fallback if synthesis never lands. + var break_info: Dictionary = status.get("break", {}) + var break_reason := str(break_info.get("reason", "")) + if bool(break_info.get("pre_live", true)): + decision["resolve"] = correlated_error or elapsed_msec >= ready_wait_msec + var summary := break_reason + if correlated_error: + summary = _format_editor_error_summary(recent_errors[0]) + if summary.is_empty(): + summary = "script parse/load error (reason not captured)" + decision["message"] = "Game hit a script error during startup and is frozen at a debugger break before the Godot AI game helper registered: %s. The run cannot continue; call project_manage(op='stop'), fix the error, and relaunch. Check logs_read(source='editor', include_details=true)." % summary + else: + var reason_suffix := (": %s" % break_reason) if not break_reason.is_empty() else "" + decision["resolve"] = true + decision["message"] = "Game is paused at a debugger break%s. Resume it from the editor's Debugger panel or call project_manage(op='stop')." % reason_suffix + elif correlated_error: + decision["resolve"] = true + decision["liveness_status"] = "not_live" + decision["message"] = "Game launched but failed to load before the Godot AI game helper registered: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(recent_errors[0]) + if truncated: + decision["message"] += " Editor logs since this run may be truncated; showing retained errors." + elif state == "not_live": + decision["resolve"] = true + if not recent_errors.is_empty(): + decision["message"] = "Game launched but is not responding. A recent editor error may be related, but may predate this run: %s. Check logs_read(source='editor', include_details=true)." % _format_editor_error_summary(recent_errors[0]) + else: + decision["message"] = "Game launched but did not become live before the helper-ready window elapsed. It may still be booting or may have failed silently; check logs_read(source='editor', include_details=true) and poll editor_state." + elif state == "no_helper": + decision["resolve"] = true + decision["message"] = "Game launched, but no _mcp_game_helper autoload is expected. Headless or custom-main-loop projects cannot confirm helper liveness; use editor_state and viewport/editor tools where applicable." + elif state == "stopped": + decision["resolve"] = true + decision["message"] = "The play session stopped, or no active game liveness run exists, before the Godot AI game helper became live." + elif state == "launching" and elapsed_msec >= ready_wait_msec: + decision["resolve"] = true + decision["message"] = "Game launched but is not yet live after %.1fs; it may still be booting. Poll editor_state and check logs_read(source='editor', include_details=true)." % (float(elapsed_msec) / 1000.0) + return decision + + +static func _format_editor_error_summary(entry: Dictionary) -> String: + return McpSurfacedErrorTracker.format_editor_error_summary(entry) + + +func stop_project(params: Dictionary) -> Dictionary: + # Idempotent: a project that's already stopped satisfies the caller's intent. + # Returning INVALID_PARAMS here was the largest single source of fleet-wide + # project_manage failures (87 installs/24h). was_running=false lets callers + # distinguish a no-op stop from one that actually halted a running session. + if not EditorInterface.is_playing_scene(): + return { + "data": { + "stopped": true, + "was_running": false, + "undoable": false, + "reason": "Project was not running; no action taken", + } + } + + if _debugger_plugin != null: + _debugger_plugin.end_game_run() + EditorInterface.stop_playing_scene() + + # stop_playing_scene() is async — is_playing_scene() only flips to false on + # the next frame, and readiness_changed follows in _process. Defer the + # response so we can reply with authoritative readiness instead of letting + # the server poll for the event. Issue #29. + var request_id: String = params.get("_request_id", "") + if _connection != null and not request_id.is_empty(): + _finish_stop_project_deferred(request_id, _connection) + return McpDispatcher.DEFERRED_RESPONSE + + # Fallback for contexts without a connection (e.g. batch_execute via + # dispatch_direct, or unit tests that instantiate the handler with null). + return { + "data": { + "stopped": true, + "was_running": true, + "undoable": false, + "reason": "Play/stop is a runtime action", + } + } + + +# Wait two frames so Godot can tick the stop-play state change. After this +# is_playing_scene() reflects truth and get_readiness() is authoritative. +# If the plugin tears down (_exit_tree frees _connection) during the await, +# is_instance_valid() goes false and we drop the response silently — the +# server's 5s request timeout will surface the failure to the caller. +# `static` is load-bearing (#712): see _finish_run_project_deferred. +static func _finish_stop_project_deferred(request_id: String, connection) -> void: + var tree: SceneTree = connection.get_tree() + await tree.process_frame + await tree.process_frame + if not is_instance_valid(connection): + return + connection.send_deferred_response(request_id, { + "data": { + "stopped": true, + "was_running": true, + "undoable": false, + "reason": "Play/stop is a runtime action", + "readiness_after": McpConnection.get_readiness(), + } + }) + + +func search_filesystem(params: Dictionary) -> Dictionary: + var name_filter: String = params.get("name", "") + var type_filter: String = params.get("type", "") + var path_filter: String = params.get("path", "") + + if name_filter.is_empty() and type_filter.is_empty() and path_filter.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "At least one filter (name, type, path) is required") + + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var results: Array[Dictionary] = [] + _scan_directory(efs.get_filesystem(), name_filter, type_filter, path_filter, results) + return {"data": {"files": results, "count": results.size()}} + + +func _scan_directory(dir: EditorFileSystemDirectory, name_filter: String, type_filter: String, path_filter: String, out: Array[Dictionary]) -> void: + for i in dir.get_file_count(): + var file_path := dir.get_file_path(i) + var file_type := dir.get_file_type(i) + + var matches := true + + if not name_filter.is_empty(): + if file_path.get_file().to_lower().find(name_filter.to_lower()) == -1: + matches = false + + if matches and not type_filter.is_empty(): + if file_type != type_filter: + matches = false + + if matches and not path_filter.is_empty(): + if file_path.to_lower().find(path_filter.to_lower()) == -1: + matches = false + + if matches: + out.append({ + "path": file_path, + "type": file_type, + }) + + for i in dir.get_subdir_count(): + _scan_directory(dir.get_subdir(i), name_filter, type_filter, path_filter, out) diff --git a/addons/godot_ai/handlers/project_handler.gd.uid b/addons/godot_ai/handlers/project_handler.gd.uid new file mode 100644 index 0000000..ec2b5d7 --- /dev/null +++ b/addons/godot_ai/handlers/project_handler.gd.uid @@ -0,0 +1 @@ +uid://brf8u32hvha68 diff --git a/addons/godot_ai/handlers/resource_handler.gd b/addons/godot_ai/handlers/resource_handler.gd new file mode 100644 index 0000000..553ed9b --- /dev/null +++ b/addons/godot_ai/handlers/resource_handler.gd @@ -0,0 +1,591 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const ClassIntrospection := preload("res://addons/godot_ai/utils/class_introspection.gd") + +## Handles resource search, inspection, and assignment to nodes. + +const NodeHandler := preload("res://addons/godot_ai/handlers/node_handler.gd") + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +func search_resources(params: Dictionary) -> Dictionary: + var type_filter: String = params.get("type", "") + var path_filter: String = params.get("path", "") + + if type_filter.is_empty() and path_filter.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "At least one filter (type, path) is required") + + var efs := EditorInterface.get_resource_filesystem() + if efs == null: + return ErrorCodes.make_not_ready( + ErrorCodes.SUB_EDITOR_UNAVAILABLE, + "EditorFileSystem not available", false) + + var results: Array[Dictionary] = [] + _scan_resources(efs.get_filesystem(), type_filter, path_filter, results) + return {"data": {"resources": results, "count": results.size()}} + + +func _scan_resources(dir: EditorFileSystemDirectory, type_filter: String, path_filter: String, out: Array[Dictionary]) -> void: + for i in dir.get_file_count(): + var file_path := dir.get_file_path(i) + var file_type := dir.get_file_type(i) + + var matches := true + + if not type_filter.is_empty(): + # Check if the file type matches or is a subclass of the requested type + if file_type != type_filter and not ClassDB.is_parent_class(file_type, type_filter): + matches = false + + if matches and not path_filter.is_empty(): + if file_path.to_lower().find(path_filter.to_lower()) == -1: + matches = false + + if matches: + out.append({ + "path": file_path, + "type": file_type, + }) + + for i in dir.get_subdir_count(): + _scan_resources(dir.get_subdir(i), type_filter, path_filter, out) + + +func load_resource(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var path_err = McpPathValidator.loadable_error(path, "path") + if path_err != null: + return path_err + + if not ResourceLoader.exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % path) + + var res: Resource = load(path) + if res == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to load resource: %s" % path) + + var properties: Array[Dictionary] = [] + for prop in res.get_property_list(): + var usage: int = prop.get("usage", 0) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + var value = res.get(prop.name) + if value == null and prop.type != TYPE_NIL: + continue + properties.append({ + "name": prop.name, + "type": type_string(prop.type), + "value": NodeHandler._serialize_value(value), + }) + + return { + "data": { + "path": path, + "type": res.get_class(), + "properties": properties, + "property_count": properties.size(), + } + } + + +func assign_resource(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + var property: String = params.get("property", "") + var resource_path: String = params.get("resource_path", "") + + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + if property.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: property") + + if resource_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: resource_path") + + var rpath_err = McpPathValidator.loadable_error(resource_path, "resource_path") + if rpath_err != null: + return rpath_err + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + # Verify property exists + var found := false + for prop in node.get_property_list(): + if prop.name == property: + found = true + break + if not found: + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, McpPropertyErrors.build_message(node, property)) + + if not ResourceLoader.exists(resource_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Resource not found: %s" % resource_path) + + var res: Resource = load(resource_path) + if res == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to load resource: %s" % resource_path) + + var old_value = node.get(property) + + _undo_redo.create_action("MCP: Assign %s to %s.%s" % [resource_path.get_file(), node.name, property]) + _undo_redo.add_do_property(node, property, res) + _undo_redo.add_undo_property(node, property, old_value) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "property": property, + "resource_path": resource_path, + "resource_type": res.get_class(), + "undoable": true, + } + } + + +## Instantiate a built-in Resource subclass, optionally apply `properties`, +## and either assign it to a node slot (undoable) or save it to a .tres file +## (not undoable — mirrors material_create). Exactly one home is required; +## a resource with no home would be GC'd after the handler returns. +func create_resource(params: Dictionary) -> Dictionary: + var type_str: String = params.get("type", "") + if type_str.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: type") + + var properties: Dictionary = params.get("properties", {}) + var node_path: String = params.get("path", "") + var property: String = params.get("property", "") + var resource_path: String = params.get("resource_path", "") + var overwrite: bool = params.get("overwrite", false) + + var home_err := McpResourceIO.validate_home(params) + if home_err != null: + return home_err + var has_file_target := not resource_path.is_empty() + + var made := _instantiate_resource(type_str) + if made is Dictionary: + return made + var res: Resource = made + + if not properties.is_empty(): + var apply_err := _apply_resource_properties(res, properties) + if apply_err != null: + return apply_err + + if has_file_target: + return _save_created_resource(res, type_str, resource_path, overwrite, properties.size()) + return _assign_created_resource(res, type_str, node_path, property, properties.size()) + + +## Validate that `type_str` names a concrete Resource subclass that we can +## instantiate. Returns an error dict on failure, or null on success. +static func _validate_resource_class(type_str: String) -> Variant: + if not ClassDB.class_exists(type_str): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown resource type: %s" % type_str) + if ClassDB.is_parent_class(type_str, "Node"): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s is a Node type, not a Resource — use node_create instead" % type_str + ) + if not ClassDB.is_parent_class(type_str, "Resource"): + var parent := ClassDB.get_parent_class(type_str) + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s is not a Resource type (extends %s)" % [type_str, parent] + ) + if not ClassDB.can_instantiate(type_str): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s is abstract and cannot be instantiated — use a concrete subclass (e.g. BoxMesh, BoxShape3D, StyleBoxFlat)" % type_str + ) + return null + + +## Build the "Unknown resource type" error with a steer toward op="scan". A type +## that reaches here is neither an engine built-in (ClassDB) nor a registered +## project class (the global script-class registry). In an agent-driven workflow +## the most common cause is a `class_name` script just made via script_create +## that isn't registered yet — the global class table only rebuilds on a +## filesystem scan (normally an editor-focus event). Point the caller at the one +## cheap call that fixes that, so it doesn't fall back to a full plugin reload. +## See #614 for the headless scan op. +static func _unknown_resource_type_error(type_str: String) -> Dictionary: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + ( + "Unknown resource type: %s — not an engine built-in or a registered project class. " + + "If you just created it with script_create, the global class table is stale until a " + + "scan: call filesystem_manage(op=\"scan\"), then retry. Otherwise check the spelling." + ) % type_str + ) + + +## Resolve a resource type name to a fresh instance. Handles engine built-ins +## (ClassDB) and project `class_name` Resources (the global script-class +## registry). Returns a Resource on success, or an error dict on failure. +static func _instantiate_resource(type_str: String) -> Variant: + if ClassDB.class_exists(type_str): + var class_err: Variant = _validate_resource_class(type_str) + if class_err != null: + return class_err + var built_in := ClassDB.instantiate(type_str) + if built_in == null or not (built_in is Resource): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s as a Resource" % type_str) + return built_in + for entry in ProjectSettings.get_global_class_list(): + if entry.get("class", "") == type_str: + var script_path: String = entry.get("path", "") + var scr: Variant = load(script_path) + # Reject non-Resource script classes BEFORE constructing them: + # scr.new() runs _init(), and an @tool class_name extending a + # non-RefCounted type (e.g. Node) would otherwise build — and leak — + # an orphan instance this path never frees. get_instance_base_type() + # resolves to the native base, so multi-level custom Resource + # hierarchies (B extends A extends Resource) still pass. + var base_or_err: Variant = _script_base_type_or_error(scr, type_str, script_path) + if base_or_err is Dictionary: + return base_or_err + var base_type: StringName = base_or_err + if not ClassDB.is_parent_class(base_type, "Resource"): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s is not a Resource type (extends %s)" % [type_str, base_type]) + if not scr.can_instantiate(): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s cannot be instantiated in the editor (abstract, or a non-@tool script — add @tool to instantiate it here)" % type_str) + # Reject scripts whose _init() requires arguments BEFORE scr.new(): + # scr.new() passes no args, so a required-arg _init raises and aborts + # this handler mid-call, null-cascading into a generic "malformed + # result" error instead of a clean rejection. get_script_method_list() + # reports the effective (incl. inherited) _init; required args = + # args - default_args. Statically detectable only — a _init that runs + # but throws still falls through to scr.new() and the dispatcher catch. + for method in scr.get_script_method_list(): + if method.get("name", "") == "_init": + var required_args: int = (method.get("args", []) as Array).size() - (method.get("default_args", []) as Array).size() + if required_args > 0: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s cannot be instantiated: its _init() requires arguments" % type_str) + break + var made: Variant = scr.new() + if made == null or not (made is Resource): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s as a Resource" % type_str) + return made + return _unknown_resource_type_error(type_str) + + +## Maximum nesting depth for the {"__class__": ...} sub-resource shortcut. +## Caller-supplied dicts recurse through _apply_resource_properties; without a +## cap a deeply nested payload overflows the GDScript call stack and crashes +## the editor (#536). 32 is far beyond any legitimate sub-resource chain. +const MAX_NESTED_RESOURCE_DEPTH := 32 + + +## Apply a dict of property values to a freshly-instantiated Resource, +## reusing NodeHandler's coercion so Vector3/Color/etc. dicts land typed. +## Returns null on success or an error dict on failure. +## `depth` is internal recursion bookkeeping for the nested {"__class__": ...} +## shortcut — external callers use the default of 0. +static func _apply_resource_properties(res: Resource, properties: Dictionary, depth: int = 0) -> Variant: + if depth > MAX_NESTED_RESOURCE_DEPTH: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Nested resource properties exceed the maximum depth of %d — flatten the {\"__class__\": ...} nesting or create the deep sub-resources in separate calls" % MAX_NESTED_RESOURCE_DEPTH + ) + var prop_types := {} + for prop in res.get_property_list(): + prop_types[prop.name] = prop.get("type", TYPE_NIL) + for key in properties.keys(): + if not prop_types.has(key): + var valid: Array[String] = [] + for prop in res.get_property_list(): + if prop.get("usage", 0) & PROPERTY_USAGE_EDITOR: + valid.append(prop.name) + valid.sort() + # Name the script's class_name (e.g. MyTestResource) rather than the + # native base (Resource) so the hint names the type the agent created, + # and point at the real MCP verb — resource_manage(op="get_info") now + # answers for project class_name Resources too. + var type_label := res.get_class() + var res_script: Variant = res.get_script() + if res_script is Script and not String(res_script.get_global_name()).is_empty(): + type_label = String(res_script.get_global_name()) + var err := ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' not found on %s. Call resource_manage(op=\"get_info\", params={\"type\": \"%s\"}) to list available properties." % [key, type_label, type_label] + ) + err["error"]["data"] = {"valid_properties": valid} + return err + var target_type: int = prop_types[key] + if target_type == TYPE_NIL: + target_type = typeof(res.get(key)) + var v = properties[key] + if target_type == TYPE_OBJECT and v is String: + if v == "": + v = null + else: + var vpath_err = McpPathValidator.loadable_error(v, "property '%s'" % key) + if vpath_err != null: + return vpath_err + var loaded := ResourceLoader.load(v) + if loaded == null: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Resource not found at path '%s' for property '%s'" % [v, key] + ) + v = loaded + elif target_type == TYPE_OBJECT and v is Dictionary and v.has("__class__"): + # Nested shortcut: the same {"__class__": "X", ...} form that + # node_handler.set_property accepts, now also supported here so + # resource_create/environment_create callers can populate + # sub-resource slots (ShaderMaterial.shader, etc.) in one shot. + var sub_type: String = v.get("__class__", "") + # Resolve via the shared helper so the nested shortcut accepts both + # engine built-ins (ClassDB) and project `class_name` Resources, + # exactly like the top-level resource_create path. + var sub_made := _instantiate_resource(sub_type) + if sub_made is Dictionary: + # Preserve the property-slot context the inline path used to add. + sub_made["error"]["message"] = "%s (for property '%s')" % [sub_made["error"]["message"], key] + return sub_made + var sub_res: Resource = sub_made + var remaining: Dictionary = (v as Dictionary).duplicate() + remaining.erase("__class__") + if not remaining.is_empty(): + var nested_err := _apply_resource_properties(sub_res, remaining, depth + 1) + if nested_err != null: + return nested_err + v = sub_res + else: + var slot_value: Variant = res.get(key) + if target_type == TYPE_ARRAY and slot_value is Array and (slot_value as Array).is_typed(): + ## Typed Array[T] slot (#612): mirror set_property's dispatch — + ## the generic passthrough would hand an untyped Array to the + ## typed setter, which drops it silently while we report success. + var typed_out: Variant = NodeHandler._coerce_typed_array( + v, slot_value, "Property '%s'" % key + ) + if typed_out is Dictionary: + return typed_out + v = typed_out + elif ( + target_type == TYPE_DICTIONARY + and slot_value is Dictionary + and (slot_value as Dictionary).is_typed() + ): + ## Typed Dictionary[K, V] slot (#612 stage 3): success is a + ## typed duplicate of the slot; the error envelope is untyped. + var typed_dict_out: Dictionary = NodeHandler._coerce_typed_dictionary( + v, slot_value, "Property '%s'" % key + ) + if not typed_dict_out.is_typed(): + return typed_dict_out + v = typed_dict_out + else: + v = NodeHandler._coerce_value(v, target_type) + ## Mirror set_property's coerce check: wrong-shape dicts (#123) and + ## non-dict inputs that don't land as the target compound Variant + ## (#191) both error here instead of writing zero-filled Variants. + var coerce_err := NodeHandler._check_coerced(v, target_type, "Property '%s'" % key) + if coerce_err != null: + return coerce_err + res.set(key, v) + return null + + +func _assign_created_resource(res: Resource, type_str: String, node_path: String, property: String, applied_count: int) -> Dictionary: + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + var found := false + var prop_type: int = TYPE_NIL + for prop in node.get_property_list(): + if prop.name == property: + found = true + prop_type = prop.get("type", TYPE_NIL) + break + if not found: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(node, property) + ) + if prop_type != TYPE_NIL and prop_type != TYPE_OBJECT: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' on %s is not an Object slot (type %s)" % [property, node.get_class(), type_string(prop_type)] + ) + + var old_value = node.get(property) + + _undo_redo.create_action("MCP: Create %s for %s.%s" % [type_str, node.name, property]) + _undo_redo.add_do_property(node, property, res) + _undo_redo.add_undo_property(node, property, old_value) + _undo_redo.add_do_reference(res) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "property": property, + "type": type_str, + "resource_class": res.get_class(), + "properties_applied": applied_count, + "undoable": true, + } + } + + +func _save_created_resource(res: Resource, type_str: String, resource_path: String, overwrite: bool, applied_count: int) -> Dictionary: + return McpResourceIO.save_to_disk(res, resource_path, overwrite, "Resource", { + "type": type_str, + "resource_class": res.get_class(), + "properties_applied": applied_count, + }, _connection) + + +## Introspect a Resource class — return its editor-visible properties, parent, +## whether it's abstract, and (for abstract bases) the list of concrete +## subclasses that resource_create can instantiate. Read-only. +func get_resource_info(params: Dictionary) -> Dictionary: + var type_str: String = params.get("type", "") + if type_str.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: type") + + if not ClassDB.class_exists(type_str): + # Project class_name Resources aren't in ClassDB; resolve them through the + # global script-class registry so get_info answers for the same custom + # types resource_create can make. Read-only — never instantiates. + var custom_info: Variant = _custom_resource_info(type_str) + if custom_info != null: + return custom_info + return _unknown_resource_type_error(type_str) + if ClassDB.is_parent_class(type_str, "Node"): + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s is a Node type, not a Resource — use node_* tools for node introspection" % type_str + ) + if not ClassDB.is_parent_class(type_str, "Resource") and type_str != "Resource": + var parent := ClassDB.get_parent_class(type_str) + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "%s is not a Resource type (extends %s)" % [type_str, parent] + ) + + var can_instantiate: bool = ClassDB.can_instantiate(type_str) + var class_info := ClassIntrospection.build(type_str, { + "sections": ["properties"], + "include_inherited": true, + "include_inheritors": not can_instantiate, + "limit": 0, + }) + var data: Dictionary = { + "type": type_str, + "parent_class": class_info.parent_class, + "can_instantiate": can_instantiate, + "is_abstract": not can_instantiate, + "properties": class_info.properties, + "property_count": class_info.property_count, + } + + # For abstract bases (Shape3D, Material, Texture, StyleBox, ...) surface + # the concrete Resource subclasses an agent could try next. + if not can_instantiate: + data["concrete_subclasses"] = class_info.concrete_inheritors + + return {"data": data} + + +## Resolve a loaded global-class script to its native base type, or an error if +## the script failed to load (not a Script) or to compile (empty base type). +## Shared by the create and get_info custom-Resource paths so both report a +## compile failure rather than a misleading "is not a Resource type (extends )". +static func _script_base_type_or_error(scr: Variant, type_str: String, script_path: String) -> Variant: + if not (scr is Script): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to load script class %s from %s" % [type_str, script_path]) + var base_type: StringName = scr.get_instance_base_type() + if String(base_type).is_empty(): + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "%s failed to compile or parse (script %s)" % [type_str, script_path]) + return base_type + + +## get_info for a project `class_name` Resource (not in ClassDB). Returns an info +## dict, an error dict (for a class_name whose native base is not a Resource), or +## null if `type_str` is not a registered global class. Read-only: resolves +## properties from the script + its native base WITHOUT instantiating (no _init()). +static func _custom_resource_info(type_str: String) -> Variant: + for entry in ProjectSettings.get_global_class_list(): + if entry.get("class", "") != type_str: + continue + var script_path: String = entry.get("path", "") + var scr: Variant = load(script_path) + var base_or_err: Variant = _script_base_type_or_error(scr, type_str, script_path) + if base_or_err is Dictionary: + return base_or_err + var base_type: StringName = base_or_err + if not ClassDB.is_parent_class(base_type, "Resource"): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s is not a Resource type (extends %s)" % [type_str, base_type]) + var can_instantiate: bool = scr.can_instantiate() + # Inherited (native) properties come from the engine base via ClassDB... + var class_info := ClassIntrospection.build(String(base_type), { + "sections": ["properties"], + "include_inherited": true, + "limit": 0, + }) + var props: Array = [] + for native_prop in class_info.properties: + props.append(native_prop) + # ...and the script's own (and inherited script) exported properties come + # from the Script itself, so we never construct the resource. A real + # default isn't available without instantiating, so script props carry an + # explicit null — keeping one uniform key set across the array (native + # props carry their real default). + for raw_prop in scr.get_script_property_list(): + var prop: Dictionary = raw_prop + var usage := int(prop.get("usage", 0)) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + props.append({ + "name": str(prop.get("name", "")), + "type": type_string(int(prop.get("type", TYPE_NIL))), + "class_name": str(prop.get("class_name", "")), + "hint": int(prop.get("hint", PROPERTY_HINT_NONE)), + "hint_string": str(prop.get("hint_string", "")), + "usage": usage, + "default": null, + }) + props.sort_custom(func(a, b): return a.name < b.name) + # parent_class is the immediate script parent when there is one (so a + # multi-level chain B -> A -> Resource reports A), else the native base. + var parent_name := String(base_type) + var base_script: Variant = scr.get_base_script() + if base_script is Script and not String(base_script.get_global_name()).is_empty(): + parent_name = String(base_script.get_global_name()) + return {"data": { + "type": type_str, + "parent_class": parent_name, + "can_instantiate": can_instantiate, + # is_abstract reflects real abstractness (the @abstract annotation), + # NOT editor-instantiability — a non-@tool concrete Resource has + # can_instantiate()==false in-editor but is not abstract. + "is_abstract": scr.is_abstract(), + "properties": props, + "property_count": props.size(), + }} + return null diff --git a/addons/godot_ai/handlers/resource_handler.gd.uid b/addons/godot_ai/handlers/resource_handler.gd.uid new file mode 100644 index 0000000..d79d3cf --- /dev/null +++ b/addons/godot_ai/handlers/resource_handler.gd.uid @@ -0,0 +1 @@ +uid://dwwd0n3c56ir diff --git a/addons/godot_ai/handlers/scene_handler.gd b/addons/godot_ai/handlers/scene_handler.gd new file mode 100644 index 0000000..1c1f2b4 --- /dev/null +++ b/addons/godot_ai/handlers/scene_handler.gd @@ -0,0 +1,420 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles scene tree reading and node search. + +var _connection: McpConnection +var _save_scene_callable: Callable = Callable() +var _save_scene_as_callable: Callable = Callable() + + +func _init(connection: McpConnection = null) -> void: + _connection = connection + + +func get_scene_tree(params: Dictionary) -> Dictionary: + var max_depth: int = params.get("depth", 10) + var offset: int = maxi(0, int(params.get("offset", 0))) + # limit <= 0 means "no limit" (the hierarchy resource reads the whole tree); + # the scene_get_hierarchy tool passes an explicit positive limit. Paginating + # here — rather than walking + serializing the full tree and slicing on the + # Python side — means only the requested window builds node dicts and clean + # scene paths, and only the window crosses the WebSocket. + var limit: int = int(params.get("limit", 0)) + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + return {"data": { + "nodes": [], + "total_count": 0, + "offset": offset, + "limit": limit, + "has_more": false, + "message": "No scene open", + }} + + var nodes: Array[Dictionary] = [] + # index_ref[0] is the running DFS index shared across the recursion (Arrays + # pass by reference in GDScript). The walk still visits every node to get an + # accurate total_count, but only materializes those inside the window. + var index_ref: Array[int] = [0] + # _walk_tree self-seeds the root's path for full reads; pass "" explicitly. + _walk_tree(scene_root, nodes, 0, max_depth, scene_root, offset, limit, index_ref, "") + var total: int = index_ref[0] + return {"data": { + "nodes": nodes, + "total_count": total, + "offset": offset, + "limit": limit, + "has_more": limit > 0 and offset + limit < total, + }} + + +func get_open_scenes(_params: Dictionary) -> Dictionary: + var scene_paths := EditorInterface.get_open_scenes() + var scene_root := EditorInterface.get_edited_scene_root() + var current := scene_root.scene_file_path if scene_root else "" + return { + "data": { + "scenes": scene_paths, + "current_scene": current, + "count": scene_paths.size(), + } + } + + +func find_nodes(params: Dictionary) -> Dictionary: + var name_filter: String = params.get("name", "") + var type_filter: String = params.get("type", "") + var group_filter: String = params.get("group", "") + + if name_filter.is_empty() and type_filter.is_empty() and group_filter.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "At least one filter (name, type, group) is required") + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var results: Array[Dictionary] = [] + _find_recursive(scene_root, scene_root, name_filter, type_filter, group_filter, results) + return {"data": {"nodes": results, "count": results.size()}} + + +func _find_recursive(node: Node, scene_root: Node, name_filter: String, type_filter: String, group_filter: String, out: Array[Dictionary]) -> void: + var matches := true + + if not name_filter.is_empty(): + if node.name.to_lower().find(name_filter.to_lower()) == -1: + matches = false + + if matches and not type_filter.is_empty(): + if node.get_class() != type_filter: + matches = false + + if matches and not group_filter.is_empty(): + if not node.is_in_group(group_filter): + matches = false + + if matches: + out.append({ + "name": node.name, + "type": node.get_class(), + "path": McpScenePath.from_node(node, scene_root), + }) + + for child in node.get_children(): + _find_recursive(child, scene_root, name_filter, type_filter, group_filter, out) + + +## Create a new scene with the given root node type, save to disk, and open it. +func create_scene(params: Dictionary) -> Dictionary: + var root_type: String = params.get("root_type", "Node3D") + var path: String = params.get("path", "") + + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var path_err = McpPathValidator.path_error(path, "path", true) + if path_err != null: + return path_err + + if not path.ends_with(".tscn") and not path.ends_with(".scn"): + path += ".tscn" + + if not ClassDB.class_exists(root_type): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown node type: %s" % root_type) + if not ClassDB.is_parent_class(root_type, "Node"): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s is not a Node type" % root_type) + + # Ensure parent directory exists + var dir_path := path.get_base_dir() + if not DirAccess.dir_exists_absolute(dir_path): + var err := DirAccess.make_dir_recursive_absolute(dir_path) + if err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to create directory: %s" % dir_path) + + var root: Node = ClassDB.instantiate(root_type) + if root == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % root_type) + + var root_name: String = params.get("root_name", "") + if root_name.is_empty(): + root_name = path.get_file().get_basename() + root.name = root_name + + if _connection: + _connection.pause_processing = true + var err := _pack_and_save_with_uid(root, path) + if err == OK: + EditorInterface.open_scene_from_path(path) + if _connection: + _connection.pause_processing = false + + if err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to save scene: %s" % error_string(err)) + + return { + "data": { + "path": path, + "root_type": root_type, + "root_name": root_name, + "undoable": false, + "reason": "Scene creation involves file system operations", + } + } + + +## Pack `root` and save it to `path`, embedding a fresh uid or preserving the +## one `path` already had — the exact save sequence `create_scene` runs, +## minus the `pause_processing` guard (the caller owns that, since it also +## needs to bracket `open_scene_from_path`) and minus opening the scene +## (switching the editor's active scene isn't safe inside the shared test +## runner, so tests call this directly instead of going through +## `create_scene` end-to-end). Frees `root`. Returns `OK`, or the first +## `Error` encountered. +func _pack_and_save_with_uid(root: Node, path: String) -> Error: + var packed := PackedScene.new() + packed.pack(root) + root.free() + + # Captured BEFORE the save below overwrites the file — see + # McpResourceIO.ensure_uid's doc comment. + var prior_uid := ResourceLoader.get_resource_uid(path) if FileAccess.file_exists(path) else ResourceUID.INVALID_ID + + var err := ResourceSaver.save(packed, path) + if err == OK: + err = McpResourceIO.ensure_uid(path, prior_uid) + return err + + +## How long open_scene waits for the editor to actually switch to the +## requested scene before replying switched=false. Tab switches normally land +## within a few frames; keep this under the dispatcher's 4500 ms deferred +## default so the coroutine always answers before DEFERRED_TIMEOUT fires. +const _OPEN_SETTLE_MAX_MSEC := 3000 + + +## Open an existing scene by file path. +func open_scene(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var force_reload: bool = params.get("force_reload", false) + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var path_err = McpPathValidator.loadable_error(path, "path") + if path_err != null: + return path_err + + if not ResourceLoader.exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Scene not found: %s" % path) + + var scene_root := EditorInterface.get_edited_scene_root() + var current_path := scene_root.scene_file_path if scene_root else "" + ## Instance id of the root at call time. A completed open OR reload always + ## replaces the edited-scene root with a NEW instance, so this is the + ## reliable completion signal — unlike scene_file_path, which is unchanged + ## across a force_reload of the already-open scene (#633 review). + var prev_root_id := scene_root.get_instance_id() if scene_root else 0 + var payload := { + "path": path, + "force_reload": force_reload, + "reloaded_from_disk": false, + "previous_scene_path": current_path, + "undoable": false, + "reason": "Scene navigation cannot be undone via editor undo", + } + + if current_path == path and not force_reload: + ## Already the edited scene — nothing switches, reply immediately. + payload["switched"] = true + payload["settle"] = "already_current" + return {"data": payload} + + if force_reload and current_path == path: + EditorInterface.reload_scene_from_path(path) + payload["reloaded_from_disk"] = true + else: + EditorInterface.open_scene_from_path(path) + + ## The tab switch completes asynchronously; replying now lets an immediate + ## follow-up write land on the PREVIOUS scene (#633 — a scene_save issued + ## right after open_scene saved the old scene). Defer the reply until the + ## edited scene actually is `path` AND its root is a fresh instance, so + ## success means "the editor is now editing the (re)loaded scene". + var request_id: String = params.get("_request_id", "") + if _connection != null and not request_id.is_empty(): + _finish_open_scene_deferred(_connection, request_id, path, prev_root_id, payload) + return McpDispatcher.DEFERRED_RESPONSE + + ## Synchronous fallback (batch_execute and unit-test contexts can't await): + ## preserve the old reply-immediately behavior, flagged as not waited on. + payload["switched"] = false + payload["settle"] = "not_waited" + return {"data": payload} + + +## `static` is load-bearing (same reason as FilesystemHandler's deferred scan +## finish): the coroutine must outlive this RefCounted handler, which can be +## freed mid-await by an editor_reload_plugin. Parameterise everything; +## reference no instance state. +static func _finish_open_scene_deferred( + connection: McpConnection, + request_id: String, + path: String, + prev_root_id: int, + payload: Dictionary, +) -> void: + if not is_instance_valid(connection): + return + var tree := connection.get_tree() + if tree == null: + return + # Hand back a frame so _dispatch() registers this request as deferred + # before the coroutine can push a reply. + await tree.process_frame + var deadline_ms := Time.get_ticks_msec() + _OPEN_SETTLE_MAX_MSEC + while Time.get_ticks_msec() < deadline_ms: + var root := EditorInterface.get_edited_scene_root() + # Require BOTH the target path AND a fresh root instance: a + # force_reload keeps scene_file_path == path across the reload, so the + # instance swap is what proves the (re)load actually completed rather + # than the coroutine settling on the stale pre-reload root. + if root != null and root.scene_file_path == path and root.get_instance_id() != prev_root_id: + if not is_instance_valid(connection): + return + payload["switched"] = true + payload["settle"] = "settled" + connection.send_deferred_response(request_id, {"data": payload}) + return + await tree.process_frame + if not is_instance_valid(connection): + return + payload["switched"] = false + payload["settle"] = "timeout" + connection.send_deferred_response(request_id, {"data": payload}) + + +## Save the currently edited scene. +## Pauses WebSocket processing during save to prevent re-entrant _process() +## calls during EditorNode::_save_scene_with_preview's thumbnail render. +func save_scene(_params: Dictionary) -> Dictionary: + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var path := scene_root.scene_file_path + if path.is_empty(): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Current scene has never been saved; call scene_manage(op='save_as') with a res://... path ending in .tscn or .scn." + ) + + if _connection: + _connection.pause_processing = true + var err := _save_current_scene() + if _connection: + _connection.pause_processing = false + + if err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to save scene: %s" % error_string(err)) + + return { + "data": { + "path": path, + "undoable": false, + "reason": "File save cannot be undone via editor undo", + } + } + + +## Save the currently edited scene to a new file path. +func save_scene_as(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var path_err = McpPathValidator.path_error(path, "path", true) + if path_err != null: + return path_err + + if not path.ends_with(".tscn") and not path.ends_with(".scn"): + path += ".tscn" + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + # Ensure parent directory exists + var dir_path := path.get_base_dir() + if not DirAccess.dir_exists_absolute(dir_path): + var err := DirAccess.make_dir_recursive_absolute(dir_path) + if err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to create directory: %s" % dir_path) + + if _connection: + _connection.pause_processing = true + _save_current_scene_as(path) + if _connection: + _connection.pause_processing = false + + return { + "data": { + "path": path, + "undoable": false, + "reason": "File save cannot be undone via editor undo", + } + } + + +func _save_current_scene() -> int: + if _save_scene_callable.is_valid(): + return int(_save_scene_callable.call()) + return EditorInterface.save_scene() + + +func _save_current_scene_as(path: String) -> void: + if _save_scene_as_callable.is_valid(): + _save_scene_as_callable.call(path) + return + EditorInterface.save_scene_as(path) + + +func _walk_tree(node: Node, out: Array[Dictionary], depth: int, max_depth: int, scene_root: Node, offset: int, limit: int, index_ref: Array[int], node_path: String) -> void: + if depth > max_depth: + return + var idx: int = index_ref[0] + index_ref[0] = idx + 1 + # Materialize only nodes inside the [offset, offset+limit) window. Outside + # it we still recurse (to count total_count) but skip the per-node dict. + # + # Path build strategy depends on the read shape (identical output either way): + # * A whole-tree read (offset == 0 and limit <= 0 — the resource-style read + # backing godot://scene/hierarchy) threads the parent's clean path down the + # DFS: each node's path is one O(1) concat reusing the descent, instead of + # McpScenePath.from_node's two native walks back up (is_ancestor_of + + # get_path_to). Benchmarked ~1.8x faster on a ~1.5k-node tree, up to ~5x on + # deep chains. + # * Any windowed read (limit > 0, or an offset > 0 skip) keeps from_node for + # just the emitted nodes: threading would concatenate a path for every node + # visited for total_count, which benchmarks ~20% slower for a small window. + # + # `node_path` is self-seeded at the scene root below, so a caller cannot leave + # a full read unseeded (it has no default — pass "" for windowed reads). + var incremental := limit <= 0 and offset == 0 + if incremental and node == scene_root: + node_path = "/" + String(scene_root.name) + var in_window := idx >= offset and (limit <= 0 or idx < offset + limit) + if in_window: + out.append({ + "name": node.name, + "type": node.get_class(), + "path": node_path if incremental else McpScenePath.from_node(node, scene_root), + "children_count": node.get_child_count(), + }) + for child in node.get_children(): + var child_path := (node_path + "/" + String(child.name)) if incremental else "" + _walk_tree(child, out, depth + 1, max_depth, scene_root, offset, limit, index_ref, child_path) diff --git a/addons/godot_ai/handlers/scene_handler.gd.uid b/addons/godot_ai/handlers/scene_handler.gd.uid new file mode 100644 index 0000000..af3711f --- /dev/null +++ b/addons/godot_ai/handlers/scene_handler.gd.uid @@ -0,0 +1 @@ +uid://7ms40gm6t2r4 diff --git a/addons/godot_ai/handlers/script_handler.gd b/addons/godot_ai/handlers/script_handler.gd new file mode 100644 index 0000000..698b462 --- /dev/null +++ b/addons/godot_ai/handlers/script_handler.gd @@ -0,0 +1,501 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const DiagnosticsCapture := preload("res://addons/godot_ai/utils/diagnostics_capture.gd") +const ValidationLogger := preload("res://addons/godot_ai/runtime/validation_logger.gd") + +## Handles script creation, reading, attaching, detaching, and symbol inspection. + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + +# The bounded import-settle window and the deferred completion coroutine +# live on McpResourceIO since #714 — write_file's fresh-`.gd` path shares +# them, so create_script and write_file can't drift apart again (#261). + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +func create_script(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var content: String = params.get("content", "") + + var path_err = McpPathValidator.path_error(path, "path", true) + if path_err != null: + return path_err + + if not path.ends_with(".gd"): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Path must end with .gd") + + var existed_before := FileAccess.file_exists(path) + + # Shared write path (#714): parent mkdir + write/flush + explicit error + # check live on McpResourceIO so write_file can't drift from this again. + var write_failure: Variant = McpResourceIO.write_text_to_disk(path, content) + if write_failure != null: + return write_failure + + var data := { + "path": path, + "size": content.length(), + "committed": true, + "import_settled": existed_before, + "import_settle": "already_known" if existed_before else "not_waited", + "undoable": false, + "reason": "File system operations cannot be undone via editor undo", + } + _attach_gdscript_diagnostics(data, path, content) + + # A freshly-declared `class_name` is NOT in the global class table until a + # filesystem scan runs — update_file() below registers the file with the + # resource pipeline but not the class registry (see the scan() comment). + # Surface that precisely (only when the class isn't already registered) so a + # headless caller knows to follow up with filesystem_manage(op="scan") + # instead of hitting a confusing "Unknown type" / "Unknown resource type" on + # the very next call. We don't scan here — a scan() per create is the exact + # SIGABRT race documented below; the explicit op is single-flight. + # Skip the hint when the script failed to parse: a scan won't register a + # class from a broken script, so pointing at op="scan" would steer the caller + # away from the real fix (the parse error already attached above). + var declared_class := _extract_class_name(content) + if ( + not declared_class.is_empty() + and not _script_has_error_diagnostics(data) + and not _class_name_registered(declared_class) + ): + data["class_name"] = declared_class + data["class_registration"] = "scan_required" + data["class_registration_hint"] = ( + "New class_name '%s' isn't in the global class table yet. " % declared_class + + "Call filesystem_manage(op=\"scan\") if it won't resolve on the next " + + "call (e.g. resource_manage op=\"create\", or used as a type in another " + + "script). The editor also registers it on its next filesystem scan or " + + "when its window regains focus." + ) + + # Register just this file with the editor instead of a full recursive + # scan(). A scan() per write stacks `update_scripts_classes` / + # `update_script_paths_documentation` WorkerThreadPool tasks under concurrent + # script creation ("Task ... already exists" / "!tasks.has(p_task)"), which + # races the global-class registry and can SIGABRT in + # ScriptServer::remove_global_class_by_path (see dsarno/godot#6). + # update_file() is the single-file path the rest of the plugin already uses. + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + # `.gd.uid` is the sidecar Godot generates on scan; list both so the caller + # can rm the full set in one go. + McpResourceIO.attach_cleanup_hint(data, existed_before, [path, path + ".uid"]) + + # scan() is async — ResourceLoader.exists(path) returns false until Godot's + # filesystem pipeline finishes. If we reply now, an immediate attach_script + # races and 404s (#261). Defer the response until the resource is visible + # (or a bounded timeout elapses). For freshly-created files we wait; on + # overwrite the resource was already known to ResourceLoader, so reply now. + var request_id: String = params.get("_request_id", "") + if not existed_before and _connection != null and not request_id.is_empty(): + McpResourceIO.finish_text_write_deferred(_connection, request_id, path, data) + return McpDispatcher.DEFERRED_RESPONSE + + # Synchronous fallback: batch_execute (no request_id) and unit-test contexts + # (no connection) get the immediate reply that the previous behaviour gave. + return {"data": data} + + +## Extract the `class_name` a script declares, or "" if none. A cheap line scan +## (no full parse) for create_script's "scan_required" hint. Stops at the first +## space/tab or comma so all three valid forms yield just the name: +## `class_name Foo`, `class_name Foo extends Bar`, and the icon form +## `class_name Foo, "res://icon.svg"`. +static func _extract_class_name(content: String) -> String: + for raw_line in content.split("\n"): + var line := raw_line.strip_edges() + if line.begins_with("class_name "): + var rest := line.substr(11).strip_edges() + var cut := rest.length() + for i in rest.length(): + var ch := rest[i] + if ch == " " or ch == "\t" or ch == ",": + cut = i + break + return rest.substr(0, cut) + return "" + + +## True if create_script's diagnostics captured a parse error for this script. +## Used to suppress the "scan_required" hint when the class can't register +## anyway — see create_script. +static func _script_has_error_diagnostics(data: Dictionary) -> bool: + for diag in data.get("diagnostics", []): + if diag is Dictionary and diag.get("level", "") == "error": + return true + return false + + +## True if `cn` is already usable as a type — an engine built-in (ClassDB) or an +## already-registered project global class. A brand-new class_name returns false +## until a filesystem scan registers it. +static func _class_name_registered(cn: String) -> bool: + if ClassDB.class_exists(cn): + return true + for entry in ProjectSettings.get_global_class_list(): + if entry.get("class", "") == cn: + return true + return false + + +func read_script(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + + var path_err = McpPathValidator.path_error(path, "path") + if path_err != null: + return path_err + + if not FileAccess.file_exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "File not found: %s" % path) + + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to open file: %s" % path) + + var content := file.get_as_text() + file.close() + + return { + "data": { + "path": path, + "content": content, + "size": content.length(), + "line_count": content.count("\n") + (1 if not content.is_empty() else 0), + } + } + + +## Instance (not static) despite using no instance state: tests stub +## `_capture_gdscript_load_diagnostics` via subclass override, and static +## calls bind lexically — see test_script.gd. filesystem_handler shares +## this by instantiating a bare ScriptHandler (#714). +func _attach_gdscript_diagnostics(data: Dictionary, path: String, content: String) -> void: + var validation := _validate_gdscript_source(content) + var diagnostics: Array = [] + var diagnostics_detail := "none" + var diagnostics_status := "checked" + + if not validation.get("ok", true): + var capture := _capture_gdscript_load_diagnostics(path) + diagnostics = capture.get("diagnostics", []) + diagnostics_detail = capture.get("diagnostics_detail", "none") + diagnostics_status = capture.get("diagnostics_status", "checked") + if not validation.get("ok", true) and diagnostics.is_empty(): + diagnostics.append(_fallback_gdscript_diagnostic(path, validation.get("error_code", FAILED), content)) + diagnostics_detail = "fallback" + data["diagnostics"] = diagnostics + data["diagnostics_detail"] = diagnostics_detail + data["diagnostics_scope"] = "this_file" + data["diagnostics_status"] = diagnostics_status + + +static func _validate_gdscript_source(content: String) -> Dictionary: + var script := GDScript.new() + script.source_code = content + ## Keep validation off the live cached resource: assigning resource_path to + ## this ephemeral Script can collide with loaded instances. reload() still + ## performs normal GDScript analysis, including static initializer work, so + ## this check is intentionally scoped to `.gd` writes where the editor would + ## compile the file on scan anyway. + var err := script.reload() + return { + "ok": err == OK, + "error_code": err, + } + + +func _capture_gdscript_load_diagnostics(path: String) -> Dictionary: + var buffer := McpEditorLogBuffer.new() + var logger := ValidationLogger.new(buffer) + var capture := DiagnosticsCapture.capture_this_file(buffer, path, func() -> Dictionary: + OS.add_logger(logger) + # ResourceLoader.load() reports parse failure instead of throwing, and + # a failed GDScript parse does not execute user code; remove immediately + # after the synchronous load to keep the private capture window tiny. + ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_IGNORE) + OS.remove_logger(logger) + return {} + ) + return capture + + +static func _fallback_gdscript_diagnostic(path: String, error_code: int, content: String) -> Dictionary: + var line := _fallback_gdscript_error_line(content) + return { + "source": "editor", + "level": "error", + "text": "GDScript reload failed with error code %d." % error_code, + "path": path, + "line": line, + "function": "GDScript::reload", + "details": { + "code": "gdscript_reload_failed", + "error_code": error_code, + "fallback_line": true, + "source": { + "path": path, + "line": line, + }, + }, + } + + +static func _fallback_gdscript_error_line(content: String) -> int: + var lines := content.split("\n") + for i in range(lines.size() - 1, -1, -1): + if not str(lines[i]).strip_edges().is_empty(): + return i + 1 + return 1 + + +func patch_script(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var old_text: String = params.get("old_text", "") + var new_text: String = params.get("new_text", "") + var replace_all: bool = params.get("replace_all", false) + + var path_err = McpPathValidator.path_error(path, "path", true) + if path_err != null: + return path_err + if not "old_text" in params: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: old_text") + if not "new_text" in params: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: new_text") + if not path.ends_with(".gd"): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Path must end with .gd (use filesystem_write_text for other text files)") + if old_text.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "old_text must not be empty") + + var read := FileAccess.open(path, FileAccess.READ) + if read == null: + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "File not found or unreadable: %s" % path) + var content := read.get_as_text() + read.close() + + var match_count := content.count(old_text) + if match_count == 0: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "old_text not found in %s" % path) + if match_count > 1 and not replace_all: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "old_text matches %d times; pass replace_all=true or provide a more specific snippet" % match_count, + ) + + var new_content: String + var replacements: int + if replace_all: + new_content = content.replace(old_text, new_text) + replacements = match_count + else: + var idx := content.find(old_text) + new_content = content.substr(0, idx) + new_text + content.substr(idx + old_text.length()) + replacements = 1 + + # Shared write path (#714). No import-settle deferral here: the file + # already exists, so ResourceLoader knows it and there is no scan to wait + # for — same rationale as create_script's overwrite arm. + var write_failure: Variant = McpResourceIO.write_text_to_disk(path, new_content) + if write_failure != null: + return write_failure + + var data := { + "path": path, + "replacements": replacements, + "size": new_content.length(), + "old_size": content.length(), + "undoable": false, + "reason": "File system operations cannot be undone via editor undo", + } + _attach_gdscript_diagnostics(data, path, new_content) + + # Single-file register, not a full scan() — see create_script (dsarno/godot#6). + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + return {"data": data} + + +func attach_script(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + var script_path: String = params.get("script_path", "") + + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + if script_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: script_path") + + var spath_err = McpPathValidator.loadable_error(script_path, "script_path") + if spath_err != null: + return spath_err + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + if not ResourceLoader.exists(script_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Script not found: %s" % script_path) + + var script: Script = load(script_path) + if script == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to load script: %s" % script_path) + + var old_script: Script = node.get_script() + + _undo_redo.create_action("MCP: Attach script to %s" % node.name) + _undo_redo.add_do_method(node, "set_script", script) + _undo_redo.add_undo_method(node, "set_script", old_script) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "script_path": script_path, + "had_previous_script": old_script != null, + "undoable": true, + } + } + + +func detach_script(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + var old_script: Script = node.get_script() + if old_script == null: + return {"data": {"path": node_path, "had_script": false, "undoable": false, "reason": "No script attached"}} + + _undo_redo.create_action("MCP: Detach script from %s" % node.name) + _undo_redo.add_do_method(node, "set_script", null) + _undo_redo.add_undo_method(node, "set_script", old_script) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "removed_script": old_script.resource_path if old_script.resource_path else "(inline)", + "undoable": true, + } + } + + +func find_symbols(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + + var path_err = McpPathValidator.path_error(path, "path") + if path_err != null: + return path_err + + if not FileAccess.file_exists(path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "File not found: %s" % path) + + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to open file: %s" % path) + + var content := file.get_as_text() + file.close() + + var functions: Array[Dictionary] = [] + var signals_list: Array[String] = [] + var exports: Array[Dictionary] = [] + var class_name_str := "" + var extends_str := "" + + var lines := content.split("\n") + for i in lines.size(): + var line := lines[i].strip_edges() + + # class_name — same cut logic as _extract_class_name so the + # `extends Bar` / icon-form tails don't leak into the symbol name. + if line.begins_with("class_name "): + var cn_rest := line.substr(11).strip_edges() + var cn_cut := cn_rest.length() + for ci in cn_rest.length(): + var cn_ch := cn_rest[ci] + if cn_ch == " " or cn_ch == "\t" or cn_ch == ",": + cn_cut = ci + break + class_name_str = cn_rest.substr(0, cn_cut) + + # extends + if line.begins_with("extends "): + extends_str = line.substr(8).strip_edges() + + # signal + if line.begins_with("signal "): + var sig_text := line.substr(7).strip_edges() + # Strip any parameters for the name + var paren_idx := sig_text.find("(") + if paren_idx >= 0: + signals_list.append(sig_text.substr(0, paren_idx).strip_edges()) + else: + signals_list.append(sig_text) + + # func (including `static func` — strip the leading `static ` first) + var func_line := line.substr(7).strip_edges() if line.begins_with("static func ") else line + if func_line.begins_with("func "): + var func_text := func_line.substr(5).strip_edges() + var paren_idx := func_text.find("(") + if paren_idx >= 0: + functions.append({ + "name": func_text.substr(0, paren_idx).strip_edges(), + "line": i + 1, + }) + + # @export + if line.begins_with("@export"): + # Next non-empty line should have the var declaration + # But often export and var are on the same logical flow + # Try to find "var" on the same line or the next line + var var_line := line + if var_line.find("var ") == -1 and i + 1 < lines.size(): + var_line = lines[i + 1].strip_edges() + var var_idx := var_line.find("var ") + if var_idx >= 0: + var rest := var_line.substr(var_idx + 4).strip_edges() + # Extract variable name (up to : or = or end) + var end_idx := rest.length() + for ch_idx in rest.length(): + if rest[ch_idx] == ":" or rest[ch_idx] == "=" or rest[ch_idx] == " ": + end_idx = ch_idx + break + exports.append({ + "name": rest.substr(0, end_idx), + "line": i + 1, + }) + + return { + "data": { + "path": path, + "class_name": class_name_str, + "extends": extends_str, + "functions": functions, + "signals": signals_list, + "exports": exports, + "function_count": functions.size(), + "signal_count": signals_list.size(), + "export_count": exports.size(), + } + } diff --git a/addons/godot_ai/handlers/script_handler.gd.uid b/addons/godot_ai/handlers/script_handler.gd.uid new file mode 100644 index 0000000..6be1ac4 --- /dev/null +++ b/addons/godot_ai/handlers/script_handler.gd.uid @@ -0,0 +1 @@ +uid://dhub87454jxb3 diff --git a/addons/godot_ai/handlers/signal_handler.gd b/addons/godot_ai/handlers/signal_handler.gd new file mode 100644 index 0000000..ad85c7d --- /dev/null +++ b/addons/godot_ai/handlers/signal_handler.gd @@ -0,0 +1,274 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles signal listing, connecting, and disconnecting on scene nodes. + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +func list_signals(params: Dictionary) -> Dictionary: + var path_value: Variant = params.get("path", "") + var path_type_err = McpParamValidators.require_string("path", path_value) + if path_type_err != null: + return path_type_err + ## String(...) conversion: require_string accepts StringName too, and + ## a bare typed assignment from StringName would defeat the guard. + var path: String = String(path_value) + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var _resolved := McpNodeValidator.resolve_or_error(path, "path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var scene_root: Node = _resolved.scene_root + + ## Default: hide editor-internal connections (SceneTreeEditor observers + ## live on every scene node and would otherwise dominate the response). + ## Pass include_editor=true to see them. See #213. + var include_editor: bool = params.get("include_editor", false) + + var signals: Array[Dictionary] = [] + for sig in node.get_signal_list(): + var args: Array[Dictionary] = [] + for arg in sig.get("args", []): + args.append({"name": arg.get("name", ""), "type": type_string(arg.get("type", 0))}) + signals.append({ + "name": sig.get("name", ""), + "args": args, + }) + + var connections: Array[Dictionary] = [] + var editor_connection_count := 0 + for sig in signals: + for conn in node.get_signal_connection_list(sig.name): + var callable: Callable = conn.get("callable", Callable()) + var target := callable.get_object() + if target == null: + continue # skip connections to freed objects + if not include_editor and _is_editor_internal_target(target, scene_root): + editor_connection_count += 1 + continue + connections.append({ + "signal": sig.name, + "target": _format_target_path(target, scene_root), + "method": callable.get_method(), + }) + + return { + "data": { + "path": McpScenePath.from_node(node, scene_root), + "signals": signals, + "signal_count": signals.size(), + "connections": connections, + "connection_count": connections.size(), + "editor_connection_count": editor_connection_count, + } + } + + +## A target is "editor-internal" when it's a Node sitting outside the edited +## scene tree AND not anywhere under a declared autoload — typical case is +## the SceneTreeEditor dock listening for visibility/script/state changes on +## every scene node. Connections to autoloads (declared under ``autoload/*`` +## in ProjectSettings) are user-authored even though they live under +## ``/root/`` rather than under the edited scene root, so the autoload +## root *and* any descendant of it stay visible. Non-Node targets +## (anonymous Callables, RefCounted listeners etc.) also stay visible — we +## can't reliably classify them. +func _is_editor_internal_target(target: Object, scene_root: Node) -> bool: + if not (target is Node): + return false + var node_target: Node = target + if node_target == scene_root: + return false + if scene_root.is_ancestor_of(node_target): + return false + if _is_under_autoload(node_target): + return false + return true + + +## True if `node` is a declared autoload root or sits anywhere under one. +## When the node is in the SceneTree we read its absolute path +## (``/root//...``) and check the first segment after ``/root/``; +## this covers connections to deep descendants of editor-instanced +## autoloads (e.g. ``/root/MyAutoload/Foo/Bar``). When the node isn't in +## the tree (test fixtures often construct nodes in isolation), we walk +## the parent chain and match each ancestor's ``name`` against the +## autoload key as a best-effort fallback. +static func _is_under_autoload(node: Node) -> bool: + if node.is_inside_tree(): + var path := str(node.get_path()) + if not path.begins_with("/root/"): + return false + var first_segment := path.substr(6).split("/", true, 1)[0] + return ProjectSettings.has_setting("autoload/" + first_segment) + var cursor: Node = node + while cursor != null: + if ProjectSettings.has_setting("autoload/" + str(cursor.name)): + return true + cursor = cursor.get_parent() + return false + + +## Serialize a connection's target path. Descendants of (or equal to) the +## edited scene root render as the usual scene-relative form +## (``/Main/Camera3D``). Non-descendants — autoload subtrees in particular +## — render as their canonical absolute SceneTree path +## (``/root/MyAutoload/Child``) instead of a scene-relative path full of +## ``..`` segments, which agents can't navigate back to. Non-Node targets +## (anonymous Callables, etc.) fall back to their string representation. +static func _format_target_path(target: Object, scene_root: Node) -> String: + if not (target is Node): + return str(target) + var node_target: Node = target + if node_target == scene_root or scene_root.is_ancestor_of(node_target): + return McpScenePath.from_node(node_target, scene_root) + if node_target.is_inside_tree(): + return str(node_target.get_path()) + return McpScenePath.from_node(node_target, scene_root) + + +func connect_signal(params: Dictionary) -> Dictionary: + var resolved := _resolve_signal_params(params) + if resolved.has("error"): + return resolved + + var source: Node = resolved.source + var target: Node = resolved.target + var signal_name: String = resolved.signal_name + var method: String = resolved.method + var scene_root: Node = resolved.scene_root + + if not source.has_signal(signal_name): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, "Signal '%s' not found on %s" % [signal_name, params.path]) + + if not target.has_method(method): + return ErrorCodes.make(ErrorCodes.PROPERTY_NOT_ON_CLASS, "Method '%s' not found on %s" % [method, params.target]) + + var callable := Callable(target, method) + if source.is_connected(signal_name, callable): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Signal '%s' already connected to %s.%s" % [signal_name, params.target, method]) + + _undo_redo.create_action("MCP: Connect signal %s" % signal_name) + _undo_redo.add_do_method(source, "connect", signal_name, callable, Object.CONNECT_PERSIST) + _undo_redo.add_undo_method(source, "disconnect", signal_name, callable) + _undo_redo.commit_action() + + return {"data": _signal_response(source, signal_name, target, method, scene_root)} + + +func disconnect_signal(params: Dictionary) -> Dictionary: + var resolved := _resolve_signal_params(params) + if resolved.has("error"): + return resolved + + var source: Node = resolved.source + var target: Node = resolved.target + var signal_name: String = resolved.signal_name + var method: String = resolved.method + var scene_root: Node = resolved.scene_root + + var callable := Callable(target, method) + if not source.is_connected(signal_name, callable): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Signal '%s' is not connected to %s.%s" % [signal_name, params.target, method]) + + # Capture the connection's current flags so undo restores it exactly as it + # was, not unconditionally as CONNECT_PERSIST. Hardcoding PERSIST here would + # silently promote a runtime-only connection into one that serializes on the + # next save. (The connection still exists at this point — checked above.) + var reconnect_flags := 0 + for conn in source.get_signal_connection_list(signal_name): + if conn.get("callable", Callable()) == callable: + reconnect_flags = int(conn.get("flags", 0)) + break + + _undo_redo.create_action("MCP: Disconnect signal %s" % signal_name) + _undo_redo.add_do_method(source, "disconnect", signal_name, callable) + _undo_redo.add_undo_method(source, "connect", signal_name, callable, reconnect_flags) + _undo_redo.commit_action() + + return {"data": _signal_response(source, signal_name, target, method, scene_root)} + + +func _resolve_signal_params(params: Dictionary) -> Dictionary: + for key in ["path", "signal", "target", "method"]: + ## Type-check before calling .is_empty(): a non-string value (e.g. an + ## int or dict) has no is_empty() and would crash the handler, which + ## the dispatcher only reports as an opaque "malformed result" (#210). + var value = params.get(key, "") + var type_err = McpParamValidators.require_string(key, value) + if type_err != null: + return type_err + if value.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: %s" % key) + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var source_result := _resolve_node_or_autoload(params.path, scene_root, "Source") + if source_result.has("error"): + return source_result + var source: Node = source_result.node + + var target_result := _resolve_node_or_autoload(params.target, scene_root, "Target") + if target_result.has("error"): + return target_result + var target: Node = target_result.node + + return { + "source": source, + "target": target, + "signal_name": params.signal, + "method": params.method, + "scene_root": scene_root, + } + + +## Resolve a path to a Node, with three distinct outcomes: +## 1. Found in the edited scene tree → returns {node} +## 2. Declared as an autoload AND instantiated at edit time → returns {node} +## 3. Declared as an autoload but NOT instantiated at edit time → returns +## INVALID_PARAMS with guidance. Most autoloads are runtime-only, so a +## silent "not found" hides the real reason the connection can't be made. +## 4. Not in scene and not a declared autoload → returns INVALID_PARAMS. +func _resolve_node_or_autoload(path: String, scene_root: Node, role: String) -> Dictionary: + var node := McpScenePath.resolve(path, scene_root) + if node != null: + return {"node": node} + + var name := path.trim_prefix("/") + if ProjectSettings.has_setting("autoload/" + name): + # Autoload is declared — see if the editor has it instanced. + var tree := Engine.get_main_loop() + if tree is SceneTree: + var live := (tree as SceneTree).root.get_node_or_null(name) + if live != null: + return {"node": live} + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "%s '%s' is a declared autoload but isn't instantiated in the editor. " % [role, name] + + "Most autoloads are runtime-only; edit-time signal connection isn't supported for them. " + + "Connect it from a script attached to the scene using @onready + connect(), " + + "or enable editor-instancing for this autoload in Project Settings > Autoload.") + + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, + "%s node not found: %s (not in scene tree or autoloads)" % [role, path]) + + +func _signal_response(source: Node, signal_name: String, target: Node, method: String, scene_root: Node) -> Dictionary: + return { + "source": McpScenePath.from_node(source, scene_root), + "signal": signal_name, + "target": McpScenePath.from_node(target, scene_root), + "method": method, + "undoable": true, + } diff --git a/addons/godot_ai/handlers/signal_handler.gd.uid b/addons/godot_ai/handlers/signal_handler.gd.uid new file mode 100644 index 0000000..d95e1d3 --- /dev/null +++ b/addons/godot_ai/handlers/signal_handler.gd.uid @@ -0,0 +1 @@ +uid://b4n8byjeqeddm diff --git a/addons/godot_ai/handlers/test_handler.gd b/addons/godot_ai/handlers/test_handler.gd new file mode 100644 index 0000000..2c0f4ea --- /dev/null +++ b/addons/godot_ai/handlers/test_handler.gd @@ -0,0 +1,349 @@ +@tool +extends RefCounted + +## Discovers and runs McpTestSuite scripts from res://tests/. +## Exposes run_tests and get_test_results as MCP commands. +## +## Live MCP runs service the WebSocket transport between tests +## (McpConnection.service_transport_during_exclusive_run) so a long suite +## can no longer starve the server's keepalive, and abort at a per-call +## ceiling derived from the server-provided time budget. Direct callers, +## unit-test fixtures, and batch contexts (no request id / no connection) +## keep the legacy fully-synchronous behavior with no ceiling. +## See docs/test-run-transport-starvation-plan.md. + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Clamp bounds for the server-provided ``timeout_budget_sec`` param. The +## floor is purely defensive (a malformed or buggy server value must not +## abort every run instantly); the param is not user-facing. +const BUDGET_MIN_SEC := 30.0 +const BUDGET_MAX_SEC := 3600.0 +## Conservative default when the server sent no (or an invalid) budget: an +## old server's own test_run timeout is 120s, and the plugin must abort +## and reply before that future expires. +const BUDGET_DEFAULT_SEC := 110.0 +## Abort this long before the server would time the call out, so the +## partial-results reply beats the server-side timeout. +const CEILING_MARGIN_SEC := 10.0 + +var _runner: McpTestRunner +var _undo_redo: EditorUndoRedoManager +var _log_buffer: McpLogBuffer +## Live plugin dispatcher, exposed to suites via ctx so tests can prove the +## lazy handler registrations (#736) materialize with their real ctor args. +## Optional third arg keeps old two-arg fixtures working; untyped because +## the dispatcher constructs this handler (avoids a load-time type cycle). +var _dispatcher +## Live connection for exclusive-run transport servicing. Null in unit-test +## fixtures and batch contexts, which keep the legacy synchronous path. +var _connection: McpConnection + + +func _init( + undo_redo: EditorUndoRedoManager, + log_buffer: McpLogBuffer, + dispatcher = null, + connection: McpConnection = null, +) -> void: + _runner = McpTestRunner.new() + _undo_redo = undo_redo + _log_buffer = log_buffer + _dispatcher = dispatcher + _connection = connection + + +func run_tests(params: Dictionary) -> Dictionary: + var suite_filter: String = params.get("suite", "") + var test_filter: String = params.get("test_name", "") + var exclude_test_filter: String = params.get("exclude_test_name", "") + var verbose: bool = params.get("verbose", false) + + var request_id: String = params.get("_request_id", "") + var live := _connection != null and not request_id.is_empty() + var service_cb := Callable() + var deadline_ticks_ms := 0 + var budget_sec := 0.0 + var started_ms := Time.get_ticks_msec() + var run_state := {} + if live: + budget_sec = _validated_budget_sec(params) + service_cb = Callable(_connection, "service_transport_during_exclusive_run") + deadline_ticks_ms = started_ms + int((budget_sec - CEILING_MARGIN_SEC) * 1000.0) + + ## Clear the previous run's results BEFORE discovery so an abort at any + ## later point can never expose a stale prior run via get_test_results. + _runner.clear() + + var discovery := _discover_suites(service_cb, deadline_ticks_ms, run_state) + var discovery_outcome: String = discovery.get("outcome", "") + if not discovery_outcome.is_empty(): + ## Aborted during discovery: no suite has begun, so there is no + ## suite teardown to run. Same outcome mapping as the run itself. + var empty_results: Dictionary = _runner.get_results(verbose) + if not discovery.errors.is_empty(): + empty_results["load_errors"] = discovery.errors + return _map_outcome( + discovery_outcome, "discovery", empty_results, 0, started_ms, budget_sec + ) + + var suites: Array = discovery.suites + ## #882: an explicit `suite` filter that matches nothing must say so, not + ## return {"total": 0} — a caller cannot otherwise distinguish "suite has + ## no tests" from "suite was never registered" (truncated discovery). + ## Checked BEFORE the no-suites branch so an empty discovery still names + ## the unmatched filter (with suites_available: []). + var unknown := unknown_suite_error(suite_filter, suites) + if not unknown.is_empty(): + if not discovery.errors.is_empty(): + unknown["error"]["data"]["load_errors"] = discovery.errors + return unknown + + if suites.is_empty(): + var msg := "No test suites found in res://tests/" + if not discovery.errors.is_empty(): + msg += " (%d script(s) failed to load: %s)" % [ + discovery.errors.size(), + ", ".join(discovery.errors), + ] + var no_suites := {"error": msg, "total": 0, "load_errors": discovery.errors} + ## Keep the edited_scene annotation on the no-suites error payload too, + ## so the response contract is consistent across every return path. + _annotate_edited_scene(no_suites) + return {"data": no_suites} + + var ctx := { + "undo_redo": _undo_redo, + "log_buffer": _log_buffer, + "dispatcher": _dispatcher, + } + + var run: Dictionary = _runner.run_suites_serviced( + suites, suite_filter, test_filter, ctx, verbose, exclude_test_filter, + service_cb, deadline_ticks_ms, run_state + ) + var results: Dictionary = run["results"] + if not discovery.errors.is_empty(): + results["load_errors"] = discovery.errors + return _map_outcome( + run["outcome"], "run", results, run["tests_not_run"], started_ms, budget_sec + ) + + +## Empty when `suite_filter` is empty or names a discovered suite; otherwise +## the INVALID_PARAMS protocol error run_tests returns (same ErrorCodes.make +## shape as the paused/timeout aborts — never an error inside a success +## envelope). Static + pure so the suite can pin it without calling +## run_tests() end-to-end (which would recursively re-run the whole corpus +## from inside itself — see test_serviced_test_run.gd). +static func unknown_suite_error(suite_filter: String, suites: Array) -> Dictionary: + if suite_filter.is_empty(): + return {} + var names := PackedStringArray() + for suite: McpTestSuite in suites: + names.append(suite.suite_name()) + if names.has(suite_filter): + return {} + var err := ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + ( + "No suite named '%s' is registered (%d discovered)." + + " If it should exist, discovery may be truncated —" + + " re-import and restart the editor (#882)." + ) % [suite_filter, names.size()], + ) + err["error"]["data"] = { + "suite": suite_filter, + "suites_available": Array(names), + } + return err + + +## Map a runner/discovery outcome onto the response envelope. Ownership is +## deliberately here, not in the runner: the runner reports WHAT happened, +## the handler decides how it goes over the wire (plan D2). +func _map_outcome( + outcome: String, + phase: String, + results: Dictionary, + tests_not_run: int, + started_ms: int, + budget_sec: float, +) -> Dictionary: + var elapsed_ms := Time.get_ticks_msec() - started_ms + match outcome: + "completed": + _annotate_edited_scene(results) + return {"data": results} + "transport_lost": + ## The peer is gone (or flood-closed); the send will fail against + ## the dead socket regardless, but a sync handler must return an + ## envelope. Partials stay retrievable via get_test_results after + ## the plugin reconnects. + results["aborted"] = "transport_lost" + results["tests_not_run"] = tests_not_run + _annotate_edited_scene(results) + return {"data": results} + "paused": + var depth := _connection.pause_depth() if _connection != null else 0 + if _log_buffer != null: + _log_buffer.log( + "[error] test run aborted in %s: transport paused at checkpoint (depth %d)" + % [phase, depth] + ) + var paused_err := ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + ( + "Test run aborted: the MCP transport was paused at a between-test " + + "checkpoint (pause depth %d) — a paused transport cannot service " + + "the WebSocket heartbeat, so continuing would starve the session. " + + "Partial results: test_manage(op=\"results_get\")." + ) % depth + ) + paused_err["error"]["data"] = _abort_data( + phase, results, tests_not_run, elapsed_ms, budget_sec, {"pause_depth": depth} + ) + return paused_err + "timeout": + var timeout_err := ErrorCodes.make( + ErrorCodes.TEST_RUN_TIMEOUT, + ( + "Test run hit its abort ceiling after %.1fs (budget %.0fs, ceiling = " + + "budget - %.0fs): %d passed, %d failed, %d of the selected tests " + + "never ran. Narrow the run with suite=/test_name= filters, or fetch " + + "the partial results with test_manage(op=\"results_get\")." + ) % [ + elapsed_ms / 1000.0, budget_sec, CEILING_MARGIN_SEC, + int(results.get("passed", 0)), int(results.get("failed", 0)), + tests_not_run, + ] + ) + timeout_err["error"]["data"] = _abort_data( + phase, results, tests_not_run, elapsed_ms, budget_sec, {} + ) + return timeout_err + ## Unknown outcome is a runner bug — surface it loudly. + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, "Unknown test run outcome '%s'" % outcome + ) + + +func _abort_data( + phase: String, + results: Dictionary, + tests_not_run: int, + elapsed_ms: int, + budget_sec: float, + extra: Dictionary, +) -> Dictionary: + var data := { + "phase": phase, + "elapsed_ms": elapsed_ms, + "budget_sec": budget_sec, + "passed": int(results.get("passed", 0)), + "failed": int(results.get("failed", 0)), + "skipped": int(results.get("skipped", 0)), + "total": int(results.get("total", 0)), + "tests_not_run": tests_not_run, + } + data.merge(extra) + return data + + +## Strict validation of the server-provided per-call budget: numeric, +## finite, positive, then clamped to [BUDGET_MIN_SEC, BUDGET_MAX_SEC]. +## Everything else (missing, wrong type, NaN/inf, non-positive) falls back +## to BUDGET_DEFAULT_SEC. typeof() so bool never sneaks through as int. +func _validated_budget_sec(params: Dictionary) -> float: + var raw: Variant = params.get("timeout_budget_sec", null) + var t := typeof(raw) + if t == TYPE_FLOAT or t == TYPE_INT: + var v := float(raw) + if is_finite(v) and v > 0.0: + return clampf(v, BUDGET_MIN_SEC, BUDGET_MAX_SEC) + return BUDGET_DEFAULT_SEC + + +## Many suites assume the project's main scene is the edited scene (they read +## /Main/... nodes directly). Running with another scene open produces a flood +## of phantom failures that look like real regressions. Surface the edited +## scene and a warning when it differs from run/main_scene so the failures are +## attributable at a glance instead of costing a debugging round (#635). +func _annotate_edited_scene(results: Dictionary) -> void: + var scene_root := EditorInterface.get_edited_scene_root() + var edited := scene_root.scene_file_path if scene_root else "" + results["edited_scene"] = edited + var main_scene := str(ProjectSettings.get_setting("application/run/main_scene", "")) + if main_scene.is_empty() or edited == main_scene: + return + if int(results.get("failed", 0)) <= 0: + return + results["scene_warning"] = ( + "Edited scene is '%s' but the project main scene is '%s'. Many suites " + % [edited if not edited.is_empty() else "", main_scene] + + "assume the main scene is open and will report phantom failures " + + "otherwise. If these failures are unexpected, scene_open('%s') and re-run." % main_scene + ) + + +func get_test_results(params: Dictionary) -> Dictionary: + var verbose: bool = params.get("verbose", false) + return {"data": _runner.get_results(verbose)} + + +## Returns {"suites": Array, "errors": Array[String], "outcome": String}. +## Resilient: a broken script doesn't kill discovery of the rest. A +## non-empty outcome ("timeout" / "transport_lost" / "paused") means a +## between-load checkpoint aborted discovery — script loading is itself an +## atomic phase, and a directory of heavy scripts must neither starve the +## heartbeat nor escape the run budget. +func _discover_suites( + service_cb: Callable = Callable(), + deadline_ticks_ms: int = 0, + run_state: Dictionary = {}, +) -> Dictionary: + var suites := [] + var errors: Array[String] = [] + var dir := DirAccess.open("res://tests") + if dir == null: + return { + "suites": suites, + "errors": ["DirAccess.open('res://tests') returned null — directory may not exist"], + "outcome": "", + } + + dir.list_dir_begin() + var file_name := dir.get_next() + while not file_name.is_empty(): + if file_name.begins_with("test_") and file_name.ends_with(".gd"): + var stop := _discovery_checkpoint(service_cb, deadline_ticks_ms, run_state) + if not stop.is_empty(): + return {"suites": suites, "errors": errors, "outcome": stop} + var path := "res://tests/" + file_name + var script = ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_IGNORE) + if script == null: + errors.append("%s (load failed — check for parse errors or duplicate methods)" % file_name) + elif script.can_instantiate(): + var instance = script.new() + if instance is McpTestSuite: + suites.append(instance) + else: + errors.append("%s (not a McpTestSuite subclass)" % file_name) + else: + errors.append("%s (cannot instantiate — abstract or broken)" % file_name) + file_name = dir.get_next() + + ## Sort by suite name for deterministic order. + suites.sort_custom(func(a, b) -> bool: + return a.suite_name() < b.suite_name() + ) + return {"suites": suites, "errors": errors, "outcome": ""} + + +## Discovery-phase twin of McpTestRunner._checkpoint. Both delegate to the +## shared McpConnection.exclusive_run_checkpoint so the outcome mapping +## cannot drift between the discovery and between-test paths. +func _discovery_checkpoint( + service_cb: Callable, deadline_ticks_ms: int, run_state: Dictionary +) -> String: + return McpConnection.exclusive_run_checkpoint(service_cb, deadline_ticks_ms, run_state) diff --git a/addons/godot_ai/handlers/test_handler.gd.uid b/addons/godot_ai/handlers/test_handler.gd.uid new file mode 100644 index 0000000..e56fce1 --- /dev/null +++ b/addons/godot_ai/handlers/test_handler.gd.uid @@ -0,0 +1 @@ +uid://bfg3c6iinhwmx diff --git a/addons/godot_ai/handlers/texture_handler.gd b/addons/godot_ai/handlers/texture_handler.gd new file mode 100644 index 0000000..4e90d18 --- /dev/null +++ b/addons/godot_ai/handlers/texture_handler.gd @@ -0,0 +1,199 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Creates procedural textures — GradientTexture2D (wrapping a Gradient) +## and NoiseTexture2D (wrapping a FastNoiseLite). Assigns to a node slot +## (undoable, bundles sub-resources) or saves to a .tres file. + +const NodeHandler := preload("res://addons/godot_ai/handlers/node_handler.gd") + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +const _FILL_MODES := { + "linear": GradientTexture2D.FILL_LINEAR, + "radial": GradientTexture2D.FILL_RADIAL, + "square": GradientTexture2D.FILL_SQUARE, +} + +const _NOISE_TYPES := { + "simplex": FastNoiseLite.TYPE_SIMPLEX, + "simplex_smooth": FastNoiseLite.TYPE_SIMPLEX_SMOOTH, + "perlin": FastNoiseLite.TYPE_PERLIN, + "cellular": FastNoiseLite.TYPE_CELLULAR, + "value": FastNoiseLite.TYPE_VALUE, + "value_cubic": FastNoiseLite.TYPE_VALUE_CUBIC, +} + + +# ============================================================================ +# gradient_texture_create +# ============================================================================ + +func create_gradient_texture(params: Dictionary) -> Dictionary: + var stops: Array = params.get("stops", []) + var width: int = params.get("width", 256) + var height: int = params.get("height", 1) + var fill: String = params.get("fill", "linear") + + if stops.size() < 2: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "gradient_texture_create requires at least 2 stops, got %d" % stops.size() + ) + if not _FILL_MODES.has(fill): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid fill '%s'. Valid: %s" % [fill, ", ".join(_FILL_MODES.keys())] + ) + + var home_err := McpResourceIO.validate_home(params) + if home_err != null: + return home_err + + var gradient := Gradient.new() + var offsets := PackedFloat32Array() + var colors := PackedColorArray() + for i in range(stops.size()): + var stop = stops[i] + if not stop is Dictionary: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "stops[%d] must be a dict with 'offset' and 'color' keys" % i + ) + if not stop.has("offset") or not stop.has("color"): + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "stops[%d] missing 'offset' or 'color' key" % i + ) + offsets.append(float(stop["offset"])) + var color_value = NodeHandler._coerce_value(stop["color"], TYPE_COLOR) + var color_err := NodeHandler._check_coerced(color_value, TYPE_COLOR, "stops[%d].color" % i) + if color_err != null: + return color_err + colors.append(color_value) + gradient.offsets = offsets + gradient.colors = colors + + var tex := GradientTexture2D.new() + tex.gradient = gradient + tex.width = width + tex.height = height + tex.fill = _FILL_MODES[fill] + + return _finalize(tex, [gradient], params, "Gradient texture", { + "texture_class": "GradientTexture2D", + "gradient_class": "Gradient", + "stop_count": stops.size(), + "fill": fill, + }) + + +# ============================================================================ +# noise_texture_create +# ============================================================================ + +func create_noise_texture(params: Dictionary) -> Dictionary: + var noise_type: String = params.get("noise_type", "simplex_smooth") + var width: int = params.get("width", 512) + var height: int = params.get("height", 512) + var frequency: float = params.get("frequency", 0.01) + var seed_value: int = params.get("seed", 0) + var fractal_octaves: int = params.get("fractal_octaves", 0) # 0 = leave default + + if not _NOISE_TYPES.has(noise_type): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid noise_type '%s'. Valid: %s" % [noise_type, ", ".join(_NOISE_TYPES.keys())] + ) + + var home_err := McpResourceIO.validate_home(params) + if home_err != null: + return home_err + + var noise := FastNoiseLite.new() + noise.noise_type = _NOISE_TYPES[noise_type] + noise.frequency = frequency + noise.seed = seed_value + if fractal_octaves > 0: + noise.fractal_octaves = fractal_octaves + + var tex := NoiseTexture2D.new() + tex.noise = noise + tex.width = width + tex.height = height + + return _finalize(tex, [noise], params, "Noise texture", { + "texture_class": "NoiseTexture2D", + "noise_class": "FastNoiseLite", + "noise_type": noise_type, + }) + + +# ============================================================================ +# shared helpers +# ============================================================================ + +func _finalize(tex: Resource, sub_resources: Array, params: Dictionary, label: String, extra: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + var property: String = params.get("property", "") + var resource_path: String = params.get("resource_path", "") + var overwrite: bool = params.get("overwrite", false) + + if not resource_path.is_empty(): + return McpResourceIO.save_to_disk(tex, resource_path, overwrite, label, extra, _connection) + return _assign_texture(tex, sub_resources, node_path, property, label, extra) + + +func _assign_texture(tex: Resource, sub_resources: Array, node_path: String, property: String, label: String, extra: Dictionary) -> Dictionary: + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + + var found := false + var prop_type: int = TYPE_NIL + for prop in node.get_property_list(): + if prop.name == property: + found = true + prop_type = prop.get("type", TYPE_NIL) + break + if not found: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(node, property) + ) + if prop_type != TYPE_NIL and prop_type != TYPE_OBJECT: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Property '%s' on %s is not an Object slot" % [property, node.get_class()] + ) + + var old_value = node.get(property) + + _undo_redo.create_action("MCP: Create %s for %s.%s" % [label, node.name, property]) + _undo_redo.add_do_property(node, property, tex) + _undo_redo.add_undo_property(node, property, old_value) + _undo_redo.add_do_reference(tex) + for sub in sub_resources: + _undo_redo.add_do_reference(sub) + _undo_redo.commit_action() + + var data := { + "path": node_path, + "property": property, + "undoable": true, + } + data.merge(extra) + return {"data": data} + + diff --git a/addons/godot_ai/handlers/texture_handler.gd.uid b/addons/godot_ai/handlers/texture_handler.gd.uid new file mode 100644 index 0000000..a0a0f73 --- /dev/null +++ b/addons/godot_ai/handlers/texture_handler.gd.uid @@ -0,0 +1 @@ +uid://cmloikhre8lhe diff --git a/addons/godot_ai/handlers/theme_handler.gd b/addons/godot_ai/handlers/theme_handler.gd new file mode 100644 index 0000000..a71c745 --- /dev/null +++ b/addons/godot_ai/handlers/theme_handler.gd @@ -0,0 +1,476 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles Theme resource authoring: creating, modifying color/constant/font-size/ +## stylebox slots, and applying a theme to a Control subtree. +## +## Themes are Godot's equivalent of USS: a Theme holds (class, name) -> value +## entries (colors, constants, fonts, font_sizes, styleboxes, icons) which +## cascade down a Control subtree when the theme is assigned at any ancestor. +## One well-authored theme replaces hundreds of per-node property sets. + +const _COLOR_HINT := "expected hex #rrggbb, named color, or {r,g,b,a} dict" + +var _undo_redo: EditorUndoRedoManager +var _connection: McpConnection + + +func _init(undo_redo: EditorUndoRedoManager, connection: McpConnection = null) -> void: + _undo_redo = undo_redo + _connection = connection + + +# ============================================================================ +# theme_create +# ============================================================================ + +func create_theme(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var overwrite: bool = params.get("overwrite", false) + + var err := _validate_res_path(path, ".tres", "path", true) + if err != null: + return err + + # Capture whether the file was already there BEFORE the save so we can + # report `overwritten` accurately (after save the file always exists). + var existed_before := FileAccess.file_exists(path) + if existed_before and not overwrite: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Theme already exists at %s (pass overwrite=true to replace)" % path + ) + + # Ensure parent directory exists. make_dir_recursive is idempotent — + # no need to check dir_exists first (avoids TOCTOU race). + var dir_path := path.get_base_dir() + var mkdir_err := DirAccess.make_dir_recursive_absolute(dir_path) + if mkdir_err != OK and mkdir_err != ERR_ALREADY_EXISTS: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to create directory: %s (error %d)" % [dir_path, mkdir_err] + ) + + var theme := Theme.new() + var save_err := McpResourceIO.guarded_save(theme, path, _connection) + if save_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to save theme to %s: %s (error %d)" % [path, error_string(save_err), save_err] + ) + + # Make sure the editor's filesystem picks up the new file. + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(path) + + return { + "data": { + "path": path, + "overwritten": existed_before, + "undoable": false, + "reason": "File creation is persistent; delete the file manually to revert", + } + } + + +# ============================================================================ +# theme_set_color / theme_set_constant / theme_set_font_size +# ============================================================================ + +func set_color(params: Dictionary) -> Dictionary: + return _set_scalar(params, "color", func(theme, name, cls): return theme.get_color(name, cls), + func(theme, name, cls, val): theme.set_color(name, cls, val), + func(theme, name, cls): theme.clear_color(name, cls), + func(theme, name, cls): return theme.has_color(name, cls), + func(v): return _parse_color(v)) + + +# constant / font_size parsers validate before coercing: int("abc")/int({})/int([]) +# all return 0 in GDScript (never null), so a bare `int(v)` would silently store +# garbage as 0 and report success. Returning null for non-numeric input lets +# _set_scalar's null guard surface a VALUE_OUT_OF_RANGE error, matching the +# color path's contract. +func set_constant(params: Dictionary) -> Dictionary: + return _set_scalar(params, "constant", func(theme, name, cls): return theme.get_constant(name, cls), + func(theme, name, cls, val): theme.set_constant(name, cls, int(val)), + func(theme, name, cls): theme.clear_constant(name, cls), + func(theme, name, cls): return theme.has_constant(name, cls), + func(v): return int(v) if (v is int or v is float or (v is String and v.is_valid_int())) else null) + + +func set_font_size(params: Dictionary) -> Dictionary: + return _set_scalar(params, "font_size", func(theme, name, cls): return theme.get_font_size(name, cls), + func(theme, name, cls, val): theme.set_font_size(name, cls, int(val)), + func(theme, name, cls): theme.clear_font_size(name, cls), + func(theme, name, cls): return theme.has_font_size(name, cls), + func(v): return int(v) if (v is int or v is float or (v is String and v.is_valid_int())) else null) + + +# Shared implementation for scalar Theme slots (color, constant, font_size). +# Captures old value, applies new value, saves to disk, registers undo that +# restores the old value and saves again. +func _set_scalar( + params: Dictionary, + kind: String, + getter: Callable, + setter: Callable, + clearer: Callable, + has_fn: Callable, + parser: Callable, +) -> Dictionary: + var load_result := _load_theme_from_params(params) + if load_result.has("error"): + return load_result + var theme: Theme = load_result.theme + var theme_path: String = load_result.path + + var class_name_param: String = params.get("class_name", "") + if class_name_param.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: class_name") + + var name: String = params.get("name", "") + if name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + + if not "value" in params: + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: value") + + var raw_value = params.get("value") + if raw_value == null: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid %s value: null (pass a concrete value; use the appropriate clear command to remove a slot)" % kind + ) + var parsed = parser.call(raw_value) + if parsed == null: + ## color slots want a color hint; constant/font_size are integer slots. + var hint := _COLOR_HINT if kind == "color" else "expected an integer" + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, + "Invalid %s value: %s (%s)" % [kind, raw_value, hint]) + + var had_before: bool = has_fn.call(theme, name, class_name_param) + var before_value = getter.call(theme, name, class_name_param) if had_before else null + + _undo_redo.create_action("MCP: Theme set %s %s/%s" % [kind, class_name_param, name]) + _undo_redo.add_do_method(self, "_apply_scalar", theme_path, setter, name, class_name_param, parsed) + if had_before: + _undo_redo.add_undo_method(self, "_apply_scalar", theme_path, setter, name, class_name_param, before_value) + else: + _undo_redo.add_undo_method(self, "_clear_scalar", theme_path, clearer, name, class_name_param) + _undo_redo.commit_action() + + return { + "data": { + "path": theme_path, + "kind": kind, + "class_name": class_name_param, + "name": name, + "value": _serialize_value(parsed), + "previous_value": _serialize_value(before_value) if had_before else null, + "undoable": true, + } + } + + +func _apply_scalar(theme_path: String, setter: Callable, name: String, class_name_param: String, value: Variant) -> void: + var theme: Theme = ResourceLoader.load(theme_path) + if theme == null: + push_warning("MCP: Failed to load theme for undo/redo: %s" % theme_path) + return + setter.call(theme, name, class_name_param, value) + McpResourceIO.guarded_save(theme, theme_path, _connection) + + +func _clear_scalar(theme_path: String, clearer: Callable, name: String, class_name_param: String) -> void: + var theme: Theme = ResourceLoader.load(theme_path) + if theme == null: + push_warning("MCP: Failed to load theme for undo/redo: %s" % theme_path) + return + clearer.call(theme, name, class_name_param) + McpResourceIO.guarded_save(theme, theme_path, _connection) + + +# ============================================================================ +# theme_set_stylebox_flat +# ============================================================================ + +## Compose a StyleBoxFlat and assign it to a theme slot. +## +## Parameters (beyond theme_path / class_name / name): +## bg_color (Color, "#rrggbb", "#rrggbbaa", or {r,g,b,a}) +## border_color (Color) +## border {all|top|bottom|left|right: int} — side keys override `all` +## corners {all|top_left|top_right|bottom_left|bottom_right: int} +## margins {all|top|bottom|left|right: float} +## shadow {color, size: int, offset_x: float, offset_y: float} +## anti_aliasing (bool) +## +## Unknown keys inside any nested dict are rejected with INVALID_PARAMS so +## typos fail loudly instead of silently being ignored. +func set_stylebox_flat(params: Dictionary) -> Dictionary: + var load_result := _load_theme_from_params(params) + if load_result.has("error"): + return load_result + var theme: Theme = load_result.theme + var theme_path: String = load_result.path + + var class_name_param: String = params.get("class_name", "") + if class_name_param.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: class_name") + + var name: String = params.get("name", "") + if name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: name") + + var sb := StyleBoxFlat.new() + if params.has("bg_color"): + var bg := _parse_color(params.bg_color) + if bg == null: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid bg_color: %s (%s)" % [str(params.bg_color), _COLOR_HINT]) + sb.bg_color = bg + if params.has("border_color"): + var bc := _parse_color(params.border_color) + if bc == null: + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Invalid border_color: %s (%s)" % [str(params.border_color), _COLOR_HINT]) + sb.border_color = bc + + # border: {all, top, bottom, left, right} — int widths + if params.has("border"): + var err := _apply_sides(sb, params.border, "border", + ["top", "bottom", "left", "right"], + "border_width_", + TYPE_INT) + if err != "": + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, err) + + # corners: {all, top_left, top_right, bottom_left, bottom_right} — int radii + if params.has("corners"): + var err2 := _apply_sides(sb, params.corners, "corners", + ["top_left", "top_right", "bottom_left", "bottom_right"], + "corner_radius_", + TYPE_INT) + if err2 != "": + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, err2) + + # margins: {all, top, bottom, left, right} — float padding + if params.has("margins"): + var err3 := _apply_sides(sb, params.margins, "margins", + ["top", "bottom", "left", "right"], + "content_margin_", + TYPE_FLOAT) + if err3 != "": + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, err3) + + # shadow: {color, size, offset_x, offset_y} + if params.has("shadow"): + if typeof(params.shadow) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "'shadow' must be a dict with color/size/offset_x/offset_y") + var shadow: Dictionary = params.shadow + var allowed_shadow_keys := {"color": true, "size": true, "offset_x": true, "offset_y": true} + for k in shadow.keys(): + if not allowed_shadow_keys.has(k): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Unknown key in 'shadow': %s (valid: color, size, offset_x, offset_y)" % k) + if shadow.has("color"): + var sc := _parse_color(shadow.color) + if sc == null: + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, + "Invalid shadow.color: %s (%s)" % [str(shadow.color), _COLOR_HINT]) + sb.shadow_color = sc + if shadow.has("size"): + sb.shadow_size = int(shadow.size) + if shadow.has("offset_x") or shadow.has("offset_y"): + sb.shadow_offset = Vector2( + float(shadow.get("offset_x", 0)), + float(shadow.get("offset_y", 0)), + ) + + if params.has("anti_aliasing"): + sb.anti_aliasing = bool(params.anti_aliasing) + + var had_before := theme.has_stylebox(name, class_name_param) + var before_sb: StyleBox = theme.get_stylebox(name, class_name_param) if had_before else null + + _undo_redo.create_action("MCP: Theme set stylebox %s/%s" % [class_name_param, name]) + _undo_redo.add_do_method(self, "_apply_stylebox", theme_path, name, class_name_param, sb) + if had_before: + _undo_redo.add_undo_method(self, "_apply_stylebox", theme_path, name, class_name_param, before_sb) + else: + _undo_redo.add_undo_method(self, "_clear_stylebox", theme_path, name, class_name_param) + _undo_redo.commit_action() + + return { + "data": { + "path": theme_path, + "class_name": class_name_param, + "name": name, + "stylebox_class": "StyleBoxFlat", + "bg_color": _serialize_value(sb.bg_color), + "border": { + "top": sb.border_width_top, + "bottom": sb.border_width_bottom, + "left": sb.border_width_left, + "right": sb.border_width_right, + }, + "corners": { + "top_left": sb.corner_radius_top_left, + "top_right": sb.corner_radius_top_right, + "bottom_left": sb.corner_radius_bottom_left, + "bottom_right": sb.corner_radius_bottom_right, + }, + "margins": { + "top": sb.content_margin_top, + "bottom": sb.content_margin_bottom, + "left": sb.content_margin_left, + "right": sb.content_margin_right, + }, + "undoable": true, + } + } + + +## Parse a {all, , , ...} dict and apply it to StyleBoxFlat via +## its set_ properties. Returns "" on success, an error +## message on failure. Validates that only known keys are present. +func _apply_sides(sb: StyleBoxFlat, sides_dict: Variant, dict_name: String, + side_names: Array, prop_prefix: String, value_type: int) -> String: + if typeof(sides_dict) != TYPE_DICTIONARY: + return "'%s' must be a dict with 'all' and/or side-specific keys" % dict_name + var valid_keys := {"all": true} + for s in side_names: + valid_keys[s] = true + for k in sides_dict.keys(): + if not valid_keys.has(k): + return "Unknown key in '%s': %s (valid: all, %s)" % [ + dict_name, k, ", ".join(side_names) + ] + # Apply `all` first, then override with side-specific keys. + if sides_dict.has("all"): + var all_val: Variant = sides_dict.all + for s in side_names: + var v: Variant = int(all_val) if value_type == TYPE_INT else float(all_val) + sb.set(prop_prefix + s, v) + for s in side_names: + if sides_dict.has(s): + var v2: Variant = int(sides_dict[s]) if value_type == TYPE_INT else float(sides_dict[s]) + sb.set(prop_prefix + s, v2) + return "" + + +func _apply_stylebox(theme_path: String, name: String, class_name_param: String, sb: StyleBox) -> void: + var theme: Theme = ResourceLoader.load(theme_path) + if theme == null: + push_warning("MCP: Failed to load theme for undo/redo: %s" % theme_path) + return + theme.set_stylebox(name, class_name_param, sb) + McpResourceIO.guarded_save(theme, theme_path, _connection) + + +func _clear_stylebox(theme_path: String, name: String, class_name_param: String) -> void: + var theme: Theme = ResourceLoader.load(theme_path) + if theme == null: + push_warning("MCP: Failed to load theme for undo/redo: %s" % theme_path) + return + theme.clear_stylebox(name, class_name_param) + McpResourceIO.guarded_save(theme, theme_path, _connection) + + +# ============================================================================ +# theme_apply — assign a theme to a Control +# ============================================================================ + +func apply_theme(params: Dictionary) -> Dictionary: + var node_path: String = params.get("node_path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: node_path") + + var theme_path: String = params.get("theme_path", "") + var theme: Theme = null + if not theme_path.is_empty(): + var path_err := _validate_res_path(theme_path, ".tres") + if path_err != null: + return path_err + if not ResourceLoader.exists(theme_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Theme not found: %s" % theme_path) + theme = ResourceLoader.load(theme_path) + if theme == null or not theme is Theme: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Theme" % theme_path) + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var _scene_root: Node = _resolved.scene_root + if not node is Control and not node is Window: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a Control or Window (got %s)" % [node_path, node.get_class()] + ) + + var before_theme: Theme = node.theme + _undo_redo.create_action("MCP: Apply theme to %s" % node.name) + _undo_redo.add_do_property(node, "theme", theme) + _undo_redo.add_undo_property(node, "theme", before_theme) + _undo_redo.commit_action() + + return { + "data": { + "node_path": node_path, + "theme_path": theme_path if theme != null else "", + "cleared": theme == null, + "undoable": true, + } + } + + +# ============================================================================ +# Helpers +# ============================================================================ + +func _load_theme_from_params(params: Dictionary) -> Dictionary: + var theme_path: String = params.get("theme_path", "") + var err := _validate_res_path(theme_path, ".tres", "theme_path", true) + if err != null: + return err + if not ResourceLoader.exists(theme_path): + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Theme not found: %s" % theme_path) + var theme: Theme = ResourceLoader.load(theme_path) + if theme == null or not theme is Theme: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "Resource at %s is not a Theme" % theme_path) + return {"theme": theme, "path": theme_path} + + +static func _validate_res_path(path: String, required_suffix: String, param_name: String = "theme_path", for_write: bool = false) -> Variant: + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: %s" % param_name) + var path_err := McpPathValidator.validate_resource_path(path, for_write) + if not path_err.is_empty(): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "%s: %s" % [param_name, path_err]) + if not path.ends_with(required_suffix): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "%s must end with %s (got %s)" % [param_name, required_suffix, path] + ) + return null + + +## Parse a color from Color, "#rrggbb", "#rrggbbaa", named (red/blue/...) or dict. +## Returns null if the input cannot be parsed. +## Delegates to the canonical parser (#714) — gains [r,g,b(,a)] array +## support and strict key/component checking, same shapes as every other +## color-accepting handler. +static func _parse_color(value: Variant) -> Variant: + return McpJsonValues.parse_color(value) + + +static func _serialize_value(value: Variant) -> Variant: + if value == null: + return null + if value is Color: + return {"r": value.r, "g": value.g, "b": value.b, "a": value.a} + if value is Vector2: + return {"x": value.x, "y": value.y} + return value diff --git a/addons/godot_ai/handlers/theme_handler.gd.uid b/addons/godot_ai/handlers/theme_handler.gd.uid new file mode 100644 index 0000000..b77af13 --- /dev/null +++ b/addons/godot_ai/handlers/theme_handler.gd.uid @@ -0,0 +1 @@ +uid://gjyldaddj7mu diff --git a/addons/godot_ai/handlers/tilemap_handler.gd b/addons/godot_ai/handlers/tilemap_handler.gd new file mode 100644 index 0000000..ac68e34 --- /dev/null +++ b/addons/godot_ai/handlers/tilemap_handler.gd @@ -0,0 +1,163 @@ +@tool +extends RefCounted + +## TileMap / TileMapLayer authoring — set, fill, clear, and read tile cells +## directly in the editor scene with full undo/redo support. +## +## All ops target TileMapLayer nodes in the currently edited scene by +## scene-relative path (e.g. "/LavaLake20x20/Ground"). + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +const MAX_RECT_FILL_CELLS := 4096 + +var _undo_redo: EditorUndoRedoManager + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +## Set a single tile cell. +## params: {path, source_id, atlas_col, atlas_row, map_x, map_y} +## Returns: {map_x, map_y, source_id, atlas_col, atlas_row} +func set_cell(params: Dictionary) -> Dictionary: + var layer := _resolve_layer(params) + if layer.has("error"): return layer + var node: TileMapLayer = layer.node + var pos := Vector2i(params.get("map_x", 0), params.get("map_y", 0)) + var src := int(params.get("source_id", 0)) + var atlas := Vector2i(params.get("atlas_col", 0), params.get("atlas_row", 0)) + var prev := _capture_cell_state(node, pos) + _undo_redo.create_action("MCP: TileMap set_cell") + _undo_redo.add_do_method(node, "set_cell", pos, src, atlas) + _undo_redo.add_undo_method(self, "_restore_cell_state", node, pos, prev) + _undo_redo.commit_action() + return {"data": {"map_x": pos.x, "map_y": pos.y, "source_id": src, + "atlas_col": atlas.x, "atlas_row": atlas.y, "undoable": true}} + + +## Fill a rectangular region with one tile type in a single undo action. +## params: {path, source_id, atlas_col, atlas_row, rect_x, rect_y, rect_w, rect_h} +## Returns: {cells_filled, rect: {x, y, w, h}} +func set_cells_rect(params: Dictionary) -> Dictionary: + var layer := _resolve_layer(params) + if layer.has("error"): return layer + var node: TileMapLayer = layer.node + var src := int(params.get("source_id", 0)) + var atlas := Vector2i(params.get("atlas_col", 0), params.get("atlas_row", 0)) + var rx := int(params.get("rect_x", 0)); var ry := int(params.get("rect_y", 0)) + var rw := int(params.get("rect_w", 1)); var rh := int(params.get("rect_h", 1)) + if rw <= 0 or rh <= 0: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "rect_w and rect_h must be > 0 (got %d x %d)" % [rw, rh] + ) + var cell_count := rw * rh + if cell_count > MAX_RECT_FILL_CELLS: + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Rect too large: %d cells exceeds max %d" % [cell_count, MAX_RECT_FILL_CELLS] + ) + var cells: Array[Vector2i] = [] + var snapshot: Array[Dictionary] = [] + for x in range(rx, rx + rw): + for y in range(ry, ry + rh): + var pos := Vector2i(x, y) + cells.append(pos) + snapshot.append({"pos": pos, "state": _capture_cell_state(node, pos)}) + _undo_redo.create_action("MCP: TileMap set_cells_rect %dx%d" % [rw, rh]) + for pos in cells: + _undo_redo.add_do_method(node, "set_cell", pos, src, atlas) + _undo_redo.add_undo_method(self, "_restore_rect_snapshot", node, snapshot) + _undo_redo.commit_action() + return {"data": {"cells_filled": cells.size(), + "rect": {"x": rx, "y": ry, "w": rw, "h": rh}, "undoable": true}} + + +## Remove all tiles from a TileMapLayer. +## params: {path} +## Returns: {cleared: true} +func clear_layer(params: Dictionary) -> Dictionary: + var layer := _resolve_layer(params) + if layer.has("error"): return layer + var node: TileMapLayer = layer.node + var snapshot := _capture_used_cells_snapshot(node) + _undo_redo.create_action("MCP: TileMap clear") + _undo_redo.add_do_method(node, "clear") + _undo_redo.add_undo_method(self, "_restore_cells_snapshot", node, snapshot) + _undo_redo.commit_action() + return {"data": {"cleared": true, "undoable": true}} + + +## Return all used cell coordinates. +## params: {path} +## Returns: {cells: [{x, y}, ...], count: int} +func get_used_cells(params: Dictionary) -> Dictionary: + var layer := _resolve_layer(params) + if layer.has("error"): return layer + var node: TileMapLayer = layer.node + var cells := node.get_used_cells() + var result: Array = [] + for c in cells: + result.append({"x": c.x, "y": c.y}) + return {"data": {"cells": result, "count": result.size()}} + + +## Resolve a TileMapLayer node from params["path"] in the currently edited +## scene. Returns {"node": TileMapLayer} on success, or an error dict. +func _resolve_layer(params: Dictionary) -> Dictionary: + var path: String = params.get("path", "") + var scene_file: String = params.get("scene_file", "") + var resolved := McpNodeValidator.resolve_or_error(path, "path", scene_file) + if resolved.has("error"): + return resolved + var node: Node = resolved.node + if not node is TileMapLayer: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, + "Node is not a TileMapLayer: %s" % path) + return {"node": node} + + +func _capture_cell_state(node: TileMapLayer, pos: Vector2i) -> Dictionary: + var source_id := node.get_cell_source_id(pos) + if source_id == -1: + return {"has_tile": false} + var atlas: Vector2i = node.get_cell_atlas_coords(pos) + var alternative := node.get_cell_alternative_tile(pos) + return { + "has_tile": true, + "source_id": source_id, + "atlas_col": atlas.x, + "atlas_row": atlas.y, + "alternative": alternative, + } + + +func _capture_used_cells_snapshot(node: TileMapLayer) -> Array[Dictionary]: + var snapshot: Array[Dictionary] = [] + for pos in node.get_used_cells(): + snapshot.append({"pos": pos, "state": _capture_cell_state(node, pos)}) + return snapshot + + +func _restore_cells_snapshot(node: TileMapLayer, snapshot: Array[Dictionary]) -> void: + node.clear() + for entry in snapshot: + _restore_cell_state(node, entry.pos, entry.state) + + +func _restore_rect_snapshot(node: TileMapLayer, snapshot: Array[Dictionary]) -> void: + for entry in snapshot: + _restore_cell_state(node, entry.pos, entry.state) + + +func _restore_cell_state(node: TileMapLayer, pos: Vector2i, state: Dictionary) -> void: + if not state.get("has_tile", false): + node.erase_cell(pos) + return + node.set_cell( + pos, + int(state.get("source_id", -1)), + Vector2i(int(state.get("atlas_col", -1)), int(state.get("atlas_row", -1))), + int(state.get("alternative", 0)) + ) diff --git a/addons/godot_ai/handlers/tilemap_handler.gd.uid b/addons/godot_ai/handlers/tilemap_handler.gd.uid new file mode 100644 index 0000000..8cbed53 --- /dev/null +++ b/addons/godot_ai/handlers/tilemap_handler.gd.uid @@ -0,0 +1 @@ +uid://cm8s7a0ey2q6k diff --git a/addons/godot_ai/handlers/tileset_handler.gd b/addons/godot_ai/handlers/tileset_handler.gd new file mode 100644 index 0000000..a443b01 --- /dev/null +++ b/addons/godot_ai/handlers/tileset_handler.gd @@ -0,0 +1,178 @@ +@tool +extends RefCounted + +## TileSet management — atlas inspection helpers. + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + + +func _init() -> void: + pass + + +## Query all occupied atlas tile positions for a single source. +## +## params: +## tileset_path — res:// path to the TileSet resource (required, non-empty) +## source_id — raw TileSet source id (required) +## +## Returns: +## {"data": {"tiles": [{"col": int, "row": int}, ...], "count": int}} +## on success (including empty sources, where tiles=[] and count=0) +## ErrorCodes.make(code, message) on any validation or load failure +## +## Error codes: +## MISSING_REQUIRED_PARAM — tileset_path absent/empty, or source_id absent +## RESOURCE_NOT_FOUND — ResourceLoader.exists(tileset_path) is false +## WRONG_TYPE — loaded resource is not a TileSet, or source is +## not a TileSetAtlasSource +## VALUE_OUT_OF_RANGE — source_id not present in TileSet +## +## This method is read-only: it never calls ResourceSaver or modifies any resource. +func get_atlas_tiles(params: Dictionary) -> Dictionary: + var resolved := _resolve_atlas_source(params) + if resolved.has("error"): + return resolved + var src: TileSetAtlasSource = resolved.src + + var tiles: Array = [] + for i in range(src.get_tiles_count()): + var v: Vector2i = src.get_tile_id(i) + tiles.append({"col": v.x, "row": v.y}) + + return {"data": {"tiles": tiles, "count": tiles.size()}} + + +## Return the atlas texture of a TileSetAtlasSource as a Base64-encoded PNG. +## +## params: +## tileset_path — res:// path to the TileSet resource (required, non-empty) +## source_id — raw TileSet source id (required) +## max_size — optional int; if > 0, the image is scaled so its longest +## edge is at most max_size pixels (default 0 = full res) +## +## Returns: +## {"data": {"image_base64": String, "width": int, "height": int, +## "original_width": int, "original_height": int, "format": "png"}} +## on success +## ErrorCodes.make(code, message) on any validation or load failure +## +## Error codes: +## MISSING_REQUIRED_PARAM — tileset_path absent/empty, or source_id absent +## RESOURCE_NOT_FOUND — ResourceLoader.exists(tileset_path) is false +## WRONG_TYPE — loaded resource is not a TileSet, or source is +## not a TileSetAtlasSource, or texture is null +## VALUE_OUT_OF_RANGE — source_id not present in TileSet +## +## This method is read-only: it never calls ResourceSaver or modifies anything. +func get_atlas_image(params: Dictionary) -> Dictionary: + var resolved := _resolve_atlas_source(params) + if resolved.has("error"): + return resolved + var source_id: int = resolved.source_id + var src: TileSetAtlasSource = resolved.src + + var tex: Texture2D = src.texture + if tex == null: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Source %d has no texture assigned" % source_id + ) + + var img: Image = tex.get_image() + if img == null: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Could not retrieve image data from texture of source %d" % source_id + ) + if img.is_compressed(): + var decompress_err := img.decompress() + if decompress_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Could not decompress texture of source %d: %s" % [source_id, error_string(decompress_err)] + ) + + var original_width: int = img.get_width() + var original_height: int = img.get_height() + + var max_size: int = params.get("max_size", 0) + if max_size > 0: + var longest_edge: int = max(original_width, original_height) + if longest_edge > max_size: + var scale: float = float(max_size) / float(longest_edge) + var new_w: int = max(1, int(original_width * scale)) + var new_h: int = max(1, int(original_height * scale)) + img.resize(new_w, new_h, Image.INTERPOLATE_LANCZOS) + + var png_bytes: PackedByteArray = img.save_png_to_buffer() + if png_bytes.is_empty(): + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "PNG encoding produced empty output for source %d" % source_id + ) + var b64: String = Marshalls.raw_to_base64(png_bytes) + + return { + "data": { + "image_base64": b64, + "width": img.get_width(), + "height": img.get_height(), + "original_width": original_width, + "original_height": original_height, + "format": "png", + } + } + + +func _resolve_atlas_source(params: Dictionary) -> Dictionary: + var tileset_path: String = params.get("tileset_path", "") + if tileset_path.is_empty(): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "'tileset_path' parameter is required and must not be empty" + ) + + if not params.has("source_id"): + return ErrorCodes.make( + ErrorCodes.MISSING_REQUIRED_PARAM, + "'source_id' parameter is required" + ) + + var tileset_path_err = McpPathValidator.loadable_error(tileset_path, "tileset_path") + if tileset_path_err != null: + return tileset_path_err + + if not ResourceLoader.exists(tileset_path): + return ErrorCodes.make( + ErrorCodes.RESOURCE_NOT_FOUND, + "TileSet resource not found: %s" % tileset_path + ) + + var ts = load(tileset_path) + if not ts is TileSet: + var loaded_type := "null" if ts == null else ts.get_class() + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Resource at '%s' is not a TileSet (got %s)" % [tileset_path, loaded_type] + ) + + var source_id: int = int(params.get("source_id", -999)) + if source_id < 0 or not ts.has_source(source_id): + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "source_id %d does not exist in TileSet" % source_id + ) + + var src = ts.get_source(source_id) + if not src is TileSetAtlasSource: + var source_type: String = "null" if src == null else src.get_class() + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Source %d is not a TileSetAtlasSource (got %s)" % [source_id, source_type] + ) + + return { + "source_id": source_id, + "src": src, + } diff --git a/addons/godot_ai/handlers/tileset_handler.gd.uid b/addons/godot_ai/handlers/tileset_handler.gd.uid new file mode 100644 index 0000000..643cfd3 --- /dev/null +++ b/addons/godot_ai/handlers/tileset_handler.gd.uid @@ -0,0 +1 @@ +uid://de3v4m1pnk7tr diff --git a/addons/godot_ai/handlers/ui_handler.gd b/addons/godot_ai/handlers/ui_handler.gd new file mode 100644 index 0000000..9795097 --- /dev/null +++ b/addons/godot_ai/handlers/ui_handler.gd @@ -0,0 +1,525 @@ +@tool +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Handles UI-specific (Control) layout helpers: anchor presets, etc. +## +## Anchors/offsets are the worst part of Control layout to set one-property-at-a-time. +## This handler wraps Godot's built-in presets (FULL_RECT, CENTER, TOP_LEFT, ...) so +## callers can set a whole layout with one command, with proper undo. + +var _undo_redo: EditorUndoRedoManager + + +const _PRESETS := { + "top_left": Control.PRESET_TOP_LEFT, + "top_right": Control.PRESET_TOP_RIGHT, + "bottom_left": Control.PRESET_BOTTOM_LEFT, + "bottom_right": Control.PRESET_BOTTOM_RIGHT, + "center_left": Control.PRESET_CENTER_LEFT, + "center_top": Control.PRESET_CENTER_TOP, + "center_right": Control.PRESET_CENTER_RIGHT, + "center_bottom": Control.PRESET_CENTER_BOTTOM, + "center": Control.PRESET_CENTER, + "left_wide": Control.PRESET_LEFT_WIDE, + "top_wide": Control.PRESET_TOP_WIDE, + "right_wide": Control.PRESET_RIGHT_WIDE, + "bottom_wide": Control.PRESET_BOTTOM_WIDE, + "vcenter_wide": Control.PRESET_VCENTER_WIDE, + "hcenter_wide": Control.PRESET_HCENTER_WIDE, + "full_rect": Control.PRESET_FULL_RECT, +} + +const _RESIZE_MODES := { + "minsize": Control.PRESET_MODE_MINSIZE, + "keep_width": Control.PRESET_MODE_KEEP_WIDTH, + "keep_height": Control.PRESET_MODE_KEEP_HEIGHT, + "keep_size": Control.PRESET_MODE_KEEP_SIZE, +} + +const _ANCHOR_OFFSET_PROPS := [ + "anchor_left", "anchor_top", "anchor_right", "anchor_bottom", + "offset_left", "offset_top", "offset_right", "offset_bottom", +] + + +func _init(undo_redo: EditorUndoRedoManager) -> void: + _undo_redo = undo_redo + + +## Apply a Control layout preset (anchors + offsets) to a UI node. +## +## Params: +## path - scene path to a Control node (required) +## preset - preset name: full_rect, center, top_left, ... (required) +## resize_mode - minsize | keep_width | keep_height | keep_size (default: minsize) +## margin - integer margin in pixels from the anchor edges (default: 0) +func set_anchor_preset(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + var preset_name: String = str(params.get("preset", "")).to_lower() + if preset_name.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: preset") + if not _PRESETS.has(preset_name): + var names := _PRESETS.keys() + names.sort() + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown preset '%s'. Valid: %s" % [preset_name, ", ".join(names)] + ) + + var resize_mode_name: String = str(params.get("resize_mode", "minsize")).to_lower() + if not _RESIZE_MODES.has(resize_mode_name): + var names := _RESIZE_MODES.keys() + names.sort() + return ErrorCodes.make( + ErrorCodes.VALUE_OUT_OF_RANGE, + "Unknown resize_mode '%s'. Valid: %s" % [resize_mode_name, ", ".join(names)] + ) + + var margin: int = int(params.get("margin", 0)) + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var scene_root: Node = _resolved.scene_root + if not node is Control: + var got_class: String = node.get_class() + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a Control (got %s)%s" % [ + node_path, got_class, _canvas_layer_overlay_hint(got_class) + ] + ) + + var control := node as Control + var preset_value: int = _PRESETS[preset_name] + var resize_mode_value: int = _RESIZE_MODES[resize_mode_name] + + # Snapshot before so we can undo every property the preset may have touched. + var before: Dictionary = {} + for prop in _ANCHOR_OFFSET_PROPS: + before[prop] = control.get(prop) + + _undo_redo.create_action("MCP: Set %s anchor preset %s" % [control.name, preset_name]) + _undo_redo.add_do_method( + control, "set_anchors_and_offsets_preset", preset_value, resize_mode_value, margin + ) + for prop in _ANCHOR_OFFSET_PROPS: + _undo_redo.add_undo_property(control, prop, before[prop]) + _undo_redo.commit_action() + + var after: Dictionary = {} + for prop in _ANCHOR_OFFSET_PROPS: + after[prop] = control.get(prop) + + return { + "data": { + "path": node_path, + "preset": preset_name, + "resize_mode": resize_mode_name, + "margin": margin, + "anchors": { + "left": after.anchor_left, + "top": after.anchor_top, + "right": after.anchor_right, + "bottom": after.anchor_bottom, + }, + "offsets": { + "left": after.offset_left, + "top": after.offset_top, + "right": after.offset_right, + "bottom": after.offset_bottom, + }, + "undoable": true, + } + } + + +## Set the visible `text` property on a UI Control (Label, Button + subclasses, +## LineEdit, TextEdit, RichTextLabel, LinkButton). Undoable. +func set_text(params: Dictionary) -> Dictionary: + var node_path: String = params.get("path", "") + if node_path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: path") + + if not params.has("text"): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: text") + var text_value: Variant = params["text"] + if typeof(text_value) != TYPE_STRING: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "text must be a string") + + var _resolved := McpNodeValidator.resolve_or_error(node_path, "node_path") + if _resolved.has("error"): + return _resolved + var node: Node = _resolved.node + var scene_root: Node = _resolved.scene_root + var node_type := node.get_class() + if not node is Control: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Node %s is not a Control (got %s)" % [node_path, node_type] + ) + # Scan get_property_list() (matches set_property / _apply_property in this + # repo) so we can both confirm `text` exists and that it's actually a String + # — guards against a custom Control whose `text` happens to be some other + # type, where set()-ing a String would silently mis-coerce. + var text_prop_type := TYPE_NIL + var has_text := false + for prop in node.get_property_list(): + if prop.get("name", "") == "text": + has_text = true + text_prop_type = prop.get("type", TYPE_NIL) + break + if not has_text: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Control %s has no 'text' property (got %s)" % [node_path, node_type] + ) + if text_prop_type != TYPE_STRING: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + "Control %s has a non-string 'text' property (got %s)" % [node_path, node_type] + ) + + var old_value: String = node.get("text") + + _undo_redo.create_action("MCP: Set %s text" % node.name) + _undo_redo.add_do_property(node, "text", text_value) + _undo_redo.add_undo_property(node, "text", old_value) + _undo_redo.commit_action() + + return { + "data": { + "path": node_path, + "text": text_value, + "old_text": old_value, + "node_type": node_type, + "undoable": true, + } + } + + +# ============================================================================ +# build_layout — declarative nested-dict → Control tree in one undo action +# ============================================================================ + +## Build a tree of Control nodes atomically. +## +## Params: +## tree - Dictionary describing the root node. Required fields: "type". +## Optional: "name", "properties" (dict), "anchor_preset", +## "anchor_margin", "theme" (res://, uid:// or user:// path), "children" (array). +## parent_path - Parent scene path. Empty or "/" = scene root. +## +## Validation is done before any scene mutation: class names, property +## existence, and res:// paths are all checked up-front. If anything is +## invalid, no node is created. +func build_layout(params: Dictionary) -> Dictionary: + var tree = params.get("tree") + if not params.has("tree"): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: tree") + if typeof(tree) != TYPE_DICTIONARY: + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "tree must be a dictionary") + + var _scene_check := McpNodeValidator.require_scene_or_error() + if _scene_check.has("error"): + return _scene_check + var scene_root: Node = _scene_check.scene_root + + var parent_path: String = params.get("parent_path", "") + var parent: Node = scene_root + if not parent_path.is_empty() and parent_path != "/": + parent = McpScenePath.resolve(parent_path, scene_root) + if parent == null: + return ErrorCodes.make(ErrorCodes.NODE_NOT_FOUND, McpScenePath.format_parent_error(parent_path, scene_root)) + + # Validate + build in memory first; if anything fails, free and bail. + var built := _build_subtree(tree) + if built.has("error"): + return built + var root_node: Node = built.node + var created: Array[Node] = built.created + + _undo_redo.create_action("MCP: Build UI layout (%d nodes)" % created.size()) + _undo_redo.add_do_method(parent, "add_child", root_node, true) + _undo_redo.add_do_method(root_node, "set_owner", scene_root) + for n in created: + _undo_redo.add_do_method(n, "set_owner", scene_root) + _undo_redo.add_do_reference(n) + _undo_redo.add_undo_method(parent, "remove_child", root_node) + _undo_redo.commit_action() + + return { + "data": { + "root_path": McpScenePath.from_node(root_node, scene_root), + "node_count": created.size(), + "undoable": true, + } + } + + +## Recursively instantiate + configure a node and its children in memory. +## Returns {"node": root, "created": [all descendants incl. root]} or {"error": ...}. +func _build_subtree(spec: Dictionary) -> Dictionary: + var node_type: String = spec.get("type", "") + if node_type.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Every layout node requires a 'type'") + if not ClassDB.class_exists(node_type): + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown type: %s" % node_type) + if not ClassDB.is_parent_class(node_type, "Node"): + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "%s is not a Node type" % node_type) + + var node: Node = ClassDB.instantiate(node_type) + if node == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to instantiate %s" % node_type) + + var node_name: String = spec.get("name", "") + if not node_name.is_empty(): + node.name = node_name + + # Properties. + if spec.has("properties"): + var props = spec.get("properties") + if typeof(props) != TYPE_DICTIONARY: + node.free() + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "properties must be a dictionary") + for key in props: + var value = props[key] + var apply_err := _apply_property(node, str(key), value) + if apply_err != null: + node.free() + return apply_err + + # Theme (res:// / uid:// / user:// path -> Resource). + if spec.has("theme"): + var theme_path: String = str(spec.get("theme", "")) + if not theme_path.is_empty(): + var theme_path_err = McpPathValidator.loadable_error(theme_path, "theme") + if theme_path_err != null: + node.free() + return theme_path_err + if not ResourceLoader.exists(theme_path): + node.free() + return ErrorCodes.make(ErrorCodes.RESOURCE_NOT_FOUND, "Theme not found: %s" % theme_path) + var theme_res: Resource = ResourceLoader.load(theme_path) + if theme_res == null or not theme_res is Theme: + node.free() + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "theme path must point to a Theme resource: %s" % theme_path) + if not node is Control and not node is Window: + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "theme can only be set on Control / Window (got %s)%s" % [ + node_type, _canvas_layer_overlay_hint(node_type) + ] + ) + node.theme = theme_res as Theme + + # Anchor preset — applied before children so children inherit sensible anchors. + if spec.has("anchor_preset"): + var preset_name: String = str(spec.get("anchor_preset", "")).to_lower() + if not _PRESETS.has(preset_name): + node.free() + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "Unknown anchor_preset: %s" % preset_name) + if not node is Control: + node.free() + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "anchor_preset requires a Control (got %s)%s" % [ + node_type, _canvas_layer_overlay_hint(node_type) + ] + ) + var preset_value: int = _PRESETS[preset_name] + var margin: int = int(spec.get("anchor_margin", 0)) + (node as Control).set_anchors_and_offsets_preset(preset_value, Control.PRESET_MODE_MINSIZE, margin) + + var created: Array[Node] = [node] + if spec.has("children"): + var children = spec.get("children") + if typeof(children) != TYPE_ARRAY: + node.free() + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "children must be an array") + for child_spec in children: + if typeof(child_spec) != TYPE_DICTIONARY: + node.free() + return ErrorCodes.make(ErrorCodes.WRONG_TYPE, "each child must be a dictionary") + var child_result := _build_subtree(child_spec) + if child_result.has("error"): + node.free() + return child_result + var child_node: Node = child_result.node + node.add_child(child_node) + for n in child_result.created: + created.append(n) + return {"node": node, "created": created} + + +## Mapping from theme_override_* property prefixes to their add/remove methods. +const _THEME_OVERRIDE_MAP := { + "theme_override_colors/": { + "add": "add_theme_color_override", + "remove": "remove_theme_color_override", + "coerce_type": TYPE_COLOR, + }, + "theme_override_constants/": { + "add": "add_theme_constant_override", + "remove": "remove_theme_constant_override", + "coerce_type": TYPE_INT, + }, + "theme_override_font_sizes/": { + "add": "add_theme_font_size_override", + "remove": "remove_theme_font_size_override", + "coerce_type": TYPE_INT, + }, + "theme_override_styles/": { + "add": "add_theme_stylebox_override", + "remove": "remove_theme_stylebox_override", + "coerce_type": TYPE_OBJECT, + }, +} + + +## Apply a property to a newly-instantiated node. Handles Color/Vector2/NodePath +## coercion from JSON-friendly forms. Returns null on success, error dict on failure. +func _apply_property(node: Node, prop: String, value: Variant) -> Variant: + # Handle theme_override_* pseudo-properties before the regular property scan. + for prefix in _THEME_OVERRIDE_MAP: + if prop.begins_with(prefix): + if not node is Control: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "theme_override_* requires a Control node (got %s)" % node.get_class() + ) + var override_name := prop.substr(prefix.length()) + var info: Dictionary = _THEME_OVERRIDE_MAP[prefix] + var coerce_type: int = info.coerce_type + + # For stylebox overrides, load from a res:// / uid:// / user:// path. + if coerce_type == TYPE_OBJECT: + if value is String and (value.begins_with("res://") or value.begins_with("uid://") or value.begins_with("user://")): + var style_path_err = McpPathValidator.loadable_error(value, "stylebox") + if style_path_err != null: + return style_path_err + var res := ResourceLoader.load(value) + if res == null or not res is StyleBox: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "Style resource not found or not a StyleBox: %s" % value + ) + node.call(info.add, override_name, res) + else: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "theme_override_styles/ expects a res:// / uid:// / user:// path to a StyleBox" + ) + else: + var coercion := _coerce_for_type(value, coerce_type) + if not coercion.ok: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Cannot coerce '%s' for %s" % [value, prop] + ) + node.call(info.add, override_name, coercion.value) + return null + + var found := false + var prop_type := TYPE_NIL + for p in node.get_property_list(): + if p.name == prop: + found = true + prop_type = p.get("type", TYPE_NIL) + break + if not found: + return ErrorCodes.make( + ErrorCodes.PROPERTY_NOT_ON_CLASS, + McpPropertyErrors.build_message(node, prop) + ) + + var coercion := _coerce_for_type(value, prop_type) + if not coercion.ok: + return ErrorCodes.make( + ErrorCodes.WRONG_TYPE, + "Property '%s' on %s expects type %s (cannot coerce %s)" % [ + prop, node.get_class(), type_string(prop_type), value + ] + ) + node.set(prop, coercion.value) + return null + + +## Coerce a JSON-friendly value to the target Godot type. Returns +## {"ok": true, "value": coerced} on success, {"ok": false} on failure. +## For types we don't explicitly coerce, the value is returned as-is +## (Godot will typecheck at set() time and fail loudly if it disagrees). +static func _coerce_for_type(value: Variant, prop_type: int) -> Dictionary: + match prop_type: + TYPE_COLOR: + ## Canonical parser (#714): adds [r,g,b(,a)] array support and + ## strict key/component checking, same shapes everywhere. + var parsed_color = McpJsonValues.parse_color(value) + if parsed_color != null: + return {"ok": true, "value": parsed_color} + return {"ok": false} + TYPE_VECTOR2: + ## Same canonical parser as TYPE_COLOR (CodeRabbit review): + ## keeping the inline copy here would re-introduce exactly the + ## permissive-vs-strict drift this PR removes elsewhere. + var parsed_v2 = McpJsonValues.parse_vector2(value) + if parsed_v2 != null: + return {"ok": true, "value": parsed_v2} + return {"ok": false} + TYPE_VECTOR2I: + if value is Vector2i: + return {"ok": true, "value": value} + if value is Dictionary and value.has("x") and value.has("y"): + return {"ok": true, "value": Vector2i(int(value.x), int(value.y))} + if value is Array and value.size() == 2: + return {"ok": true, "value": Vector2i(int(value[0]), int(value[1]))} + return {"ok": false} + TYPE_RECT2: + if value is Rect2: + return {"ok": true, "value": value} + if value is Array and value.size() == 4: + return { + "ok": true, + "value": + Rect2(float(value[0]), float(value[1]), float(value[2]), float(value[3])), + } + if value is Dictionary: + if value.has("x") and value.has("y") and value.has("w") and value.has("h"): + return { + "ok": true, + "value": + Rect2(float(value.x), float(value.y), float(value.w), float(value.h)), + } + if value.has("position") and value.has("size"): + var pos := _coerce_for_type(value.position, TYPE_VECTOR2) + var sz := _coerce_for_type(value.size, TYPE_VECTOR2) + if pos.ok and sz.ok: + return {"ok": true, "value": Rect2(pos.value, sz.value)} + return {"ok": false} + TYPE_NODE_PATH: + if value is NodePath: + return {"ok": true, "value": value} + if value is String: + return {"ok": true, "value": NodePath(value)} + return {"ok": false} + return {"ok": true, "value": value} + + +# CanvasLayer is the canonical HUD parent but isn't a Control, so applying +# Control-only properties (theme, anchor_preset) to it is a common mistake. +# The recovery shape is always the same: nest a Control child under the layer. +static func _canvas_layer_overlay_hint(node_class: String) -> String: + if node_class != "CanvasLayer": + return "" + return ( + ". CanvasLayer is not a Control — add a Control (e.g. Panel or Control " + + "with anchor_preset=full_rect) as its child and apply theme / " + + "anchor_preset to that overlay." + ) diff --git a/addons/godot_ai/handlers/ui_handler.gd.uid b/addons/godot_ai/handlers/ui_handler.gd.uid new file mode 100644 index 0000000..f48f841 --- /dev/null +++ b/addons/godot_ai/handlers/ui_handler.gd.uid @@ -0,0 +1 @@ +uid://ckm6f1objpgvw diff --git a/addons/godot_ai/mcp_dock.gd b/addons/godot_ai/mcp_dock.gd new file mode 100644 index 0000000..fef75fc --- /dev/null +++ b/addons/godot_ai/mcp_dock.gd @@ -0,0 +1,3784 @@ +@tool +class_name McpDock +extends VBoxContainer + +## Editor dock panel showing MCP connection status, client config, and command log. +## +## Audit-v2 #360 partial extraction. Two cohesive subpanels live in +## res://addons/godot_ai/dock_panels/: +## - log_viewer.gd: MCP request/response log (dev-mode only). +## - port_picker_panel.gd: spawn-failure escape hatch nested in the crash panel. +## +## The audit also called for ServerStatusPanel and ClientRowController +## extractions; those were *deliberately deferred*. Their UI scatters across +## the dock layout (status icon at top, crash panel mid, setup section lower; +## client rows + drift banner + scroll grid spread similarly), so a clean +## extract-by-panel needs either visible UI reorganization or a coordinator- +## Node pattern with property-accessor façades on McpDock that re-tangle the +## very state they claim to move. +## +## A future refactor probably wants extract-by-concern instead — e.g. +## `utils/mcp_async_refresh_state_machine.gd` owning the IDLE → RUNNING → +## RUNNING_TIMED_OUT → DEFERRED_FOR_FILESYSTEM → SHUTTING_DOWN transitions +## and pending-flag triplet, `utils/mcp_client_action_dispatcher.gd` owning +## the per-row Configure/Remove worker pool. The dock would keep UI +## construction and lose the state-machine ownership. See issue #360. + +const ServerStateScript := preload("res://addons/godot_ai/utils/mcp_server_state.gd") +const ClientRefreshStateScript := preload("res://addons/godot_ai/utils/mcp_client_refresh_state.gd") +const Telemetry := preload("res://addons/godot_ai/telemetry.gd") +const UpdateManagerScript := preload("res://addons/godot_ai/utils/update_manager.gd") +const UpdateMixedStateScript := preload("res://addons/godot_ai/utils/update_mixed_state.gd") +const Client := preload("res://addons/godot_ai/clients/_base.gd") +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") +const ClientRegistry := preload("res://addons/godot_ai/clients/_registry.gd") +const JsonStrategy := preload("res://addons/godot_ai/clients/_json_strategy.gd") +const TomlStrategy := preload("res://addons/godot_ai/clients/_toml_strategy.gd") +const CliStrategy := preload("res://addons/godot_ai/clients/_cli_strategy.gd") +const ToolCatalog := preload("res://addons/godot_ai/tool_catalog.gd") +const LogViewerScript := preload("res://addons/godot_ai/dock_panels/log_viewer.gd") +const PortPickerPanelScript := preload("res://addons/godot_ai/dock_panels/port_picker_panel.gd") +const VisionRoutingScript := preload("res://addons/godot_ai/vision_routing.gd") + +const DEV_MODE_SETTING := "godot_ai/dev_mode" +## "Change the port + reconfigure your clients" guide. Surfaced from the crash +## panel when a foreign process holds the HTTP port — the one piece of recovery +## (per-client config rewrite) that doesn't fit in the inline crash body. +## Resolved against the installed plugin version at click time (see +## `_port_conflict_docs_url`) so a shipped build opens the guide as it shipped, +## not tip-of-main, which may have drifted from that build's UI. +const PORT_CONFLICT_DOCS_PATH := "docs/port-conflicts.md" +const REPO_BLOB_BASE := "https://github.com/hi-godot/godot-ai/blob" +## Opened by the "How to install uv" button. See _on_install_uv for why the +## dock links here instead of running an installer itself. +const UV_INSTALL_DOCS_URL := "https://docs.astral.sh/uv/getting-started/installation/" +const CLIENT_STATUS_REFRESH_COOLDOWN_MSEC := 15 * 1000 +const CLIENT_STATUS_REFRESH_TIMEOUT_MSEC := 30 * 1000 +const CLIENT_ACTION_TIMEOUT_MSEC := 30 * 1000 +static var COLOR_MUTED := Color(0.7, 0.7, 0.7) +static var COLOR_HEADER := Color(0.95, 0.95, 0.95) +## Used for "in-progress" / "stale, action needed" UI: the startup-grace +## status icon, the spawn-failure suggested-port hint, the drift banner, +## and the per-row mismatch dot. One constant so a future palette tweak +## doesn't have to find every literal. +static var COLOR_AMBER := Color(1.0, 0.75, 0.25) + +var _connection +var _log_buffer +var _plugin: EditorPlugin + +# Always visible +var _redock_btn: Button +var _status_icon: ColorRect +var _status_label: Label +var _body_scroll: ScrollContainer +var _body: VBoxContainer +var _client_grid: VBoxContainer +var _client_configure_all_btn: Button +var _client_empty_cta_btn: Button +var _clients_summary_label: Label +var _clients_window: Window +var _dev_mode_toggle: CheckButton +var _install_label: Label + +# Tools tab (secondary window, Tab 2) — domain-exclusion UI for clients +# that cap total tool count (Antigravity: 100). Pending set is mutated by +# checkbox clicks; saved set reflects what the spawned server actually +# sees. `Apply and Restart Server` writes pending → setting and triggers a +# plugin reload so the new server comes up with the trimmed list. +var _tools_pending_excluded: PackedStringArray = PackedStringArray() +var _tools_saved_excluded: PackedStringArray = PackedStringArray() +## Custom (addon-registered) tools list — rebuilt live on registry +## tools_changed; per-tool checkboxes apply immediately (no restart). +var _custom_tools_list: VBoxContainer +var _custom_tools_count_label: Label +var _tools_domain_checkboxes: Dictionary = {} +var _tools_count_label: Label +var _tools_apply_btn: Button +var _tools_reset_btn: Button +var _tools_dirty_warning: Label +var _tools_close_confirm: ConfirmationDialog +var _telemetry_toggle: CheckButton +var _telemetry_pending_enabled: bool = true +var _telemetry_saved_enabled: bool = true + +# Settings tab (secondary window, Tab 3) — Vision Routing section plus the +# LAN opt-in (#507): "Allow remote hosts (CIDR)" behind a collapsed +# "Remote access (advanced)" disclosure (auto-expands when a non-empty +# allowlist is configured). The value feeds `--allow-host` at server spawn +# (see plugin.gd::_build_server_flags). The LineEdit's live text is the +# pending state; `_allow_hosts_saved` mirrors the persisted EditorSetting, +# same pending/saved shape as the Tools tab above. +var _allow_hosts_section: VBoxContainer +var _allow_hosts_fold: FoldableContainer +var _allow_hosts_edit: LineEdit +var _allow_hosts_hint: Label +var _allow_hosts_apply_btn: Button +var _allow_hosts_saved: String = "" + +## Per-client UI handles, keyed by client id. Each entry holds the row's +## status dot, configure/remove buttons, config-file buttons, and manual panel. +var _client_rows: Dictionary = {} + +# Drift banner — surfaced near the Clients section when one or more clients +# have a stored entry whose URL no longer matches `http_url()` (typical after +# the user changes `godot_ai/http_port`). Refreshes are stale-while-refreshing: +# cached row dots/banner remain visible while a background worker performs the +# potentially blocking config/CLI probes, then the main thread applies results. +# Automatic focus-in refreshes use a short cooldown to avoid repeated sweeps +# during tab-away/tab-back churn. See #166 and #226. +var _drift_banner: VBoxContainer +var _drift_label: Label +## Set when the user clicks "How to install uv"; consumed by the next +## application focus-in so the uv row is re-probed after the user has had a +## chance to install, not immediately. See _on_install_uv and _notification. +## (Deliberately spelled without the focus-in constant name: the guard in +## tests/unit/test_editor_focus_refocus.py locates the notification handler +## by first occurrence of that token.) +var _uv_recheck_pending := false +## Handles for the Setup section's "Server" row. `_update_status` keeps +## the label text/color in sync with `McpConnection.server_version` so the +## dock reports the TRUE running server version, not the plugin's +## expected version. See #174 follow-up — a plugin upgrade via self- +## update can leave the plugin connected to an older adopted server +## (foreign-port branch never sets `_server_pid`, so `_stop_server` +## can't kill it); the line has to show the mismatch honestly. +var _setup_server_label: Label +## Last rendered server-version string. `_update_status` runs every +## frame; early-outs text repaint when nothing changed. Empty means +## "no line rendered yet" (dev-checkout branch doesn't render a +## user-mode Server line). +var _last_rendered_server_text: String = "" +## Restart-server button shown next to the Setup container when +## `McpConnection.server_version` drifts from the plugin version. Hidden +## in the match case so the UI stays calm. +var _version_restart_btn: Button +var _server_restart_in_progress := false +## Sorted snapshot of the most recent mismatched-client set. Powers two things: +## (a) the Reconfigure button reuses this list instead of re-running +## `check_status` per row (saves ~18 filesystem reads per click), and +## (b) `_refresh_drift_banner` early-returns when the set is unchanged so +## repeated explicit refreshes don't repaint identical text. Mirrors the +## `_last_server_status` pattern used by the crash panel. +var _last_mismatched_ids: Array[String] = [] +## One-shot post-self-update auto-repin (armed by plugin.gd via +## `notify_self_update_success`). After an update, every client configured +## through this plugin still pins the OLD server version — the drift banner +## names them, but until they're rewritten each attach-bridge (re)start +## launches the outdated backend. The first completed status sweep with a +## healthy server consumes this flag and runs the same reconfigure the +## banner button would, so the user isn't left owing a manual click for a +## state the update itself created. Sweeps that land while the server is +## still INCOMPATIBLE (stale-occupant recovery in flight) keep it pending — +## their rows read ERROR, not CONFIGURED_MISMATCH. +var _pending_post_update_repin: bool = false +## The version the completed update replaced — consumed with the flag +## above; the pin-only gate renders each entry against it. +var _post_update_from_version: String = "" +var _client_status_refresh_thread: Thread +## Single source of truth for the refresh-sweep state machine. See +## `ClientRefreshStateScript` for the transition table. Replaces the +## previously scattered booleans (`_in_flight`, `_timed_out`, +## `_deferred_until_filesystem_ready`, `_shutdown_requested`). +var _refresh_state: int = ClientRefreshStateScript.IDLE +## Pending-request flags. Kept separate from `_refresh_state` because +## they're "what should the next refresh look like" — not state of +## any current refresh. A pending request is queued when a refresh +## arrives during RUNNING / RUNNING_TIMED_OUT and consumed by +## `_apply_client_status_refresh_results` once the in-flight worker +## drains. `_pending_force` also captures forced retries deferred via +## DEFERRED_FOR_FILESYSTEM so a pending user click survives the wait. +var _client_status_refresh_pending: bool = false +var _client_status_refresh_pending_force: bool = false +var _client_status_refresh_pending_initial: bool = false +var _last_client_status_refresh_completed_msec: int = 0 +var _client_status_refresh_started_msec: int = 0 +var _client_status_refresh_generation: int = 0 +## Owns the self-update slice: GitHub Releases poll, ZIP download, install +## orchestration, and the install-in-flight gate. Dock keeps banner UI +## only and consults the gate via `_is_self_update_in_progress()`. +var _update_manager +static var _orphaned_client_status_refresh_threads: Array[Thread] = [] + +## Per-row worker state for Configure / Remove. Issue #239: shelling out +## to a hung CLI on main hangs the editor. We dispatch each click to its +## own thread (one slot per client), then `_process` reaps completed workers +## and applies returned payloads on main. The buttons stay disabled while +## the slot is busy so the user can't queue a re-click on the same row. +## +## Per-client (not single-slot) so Configure-all can fan out — the +## workers are independent, only the row UI is shared, and McpCliExec +## bounds the wall-clock for each. +## +## A watchdog can abandon a slot when a worker fails to report completion. +## The thread object is retained in `_orphaned_client_action_threads` until +## it finishes so GDScript does not destroy a live Thread object. +var _client_action_threads: Dictionary = {} +var _client_action_generations: Dictionary = {} +var _client_action_started_msec: Dictionary = {} +var _client_action_names: Dictionary = {} +## Timed-out Configure/Remove workers are abandoned but retained here until +## they finish, so GDScript does not destroy a live Thread object. +static var _orphaned_client_action_threads: Array[Thread] = [] +## Which client each abandoned worker belonged to, so a row whose worker was +## abandoned but is STILL RUNNING can't start a second one on top of it. +## The flat array above exists to keep Thread objects alive; it carries no +## client association, and `_abandon_client_action_thread` erases the row's +## `_client_action_threads` slot — so the dispatch guard alone would let a +## re-click spawn an overlapping worker. Two concurrent Configure workers for +## one client means two uv builds and two writers on the same config file. +## Static for the same reason as the array: a script reload must not GC a +## live Thread. +static var _orphaned_client_action_owners: Dictionary = {} +## Cooperative stop shared across dock instances because orphan action +## threads survive script/dock replacement. A new action clears its row's +## flag before starting; teardown sets every active/orphaned row before join. +static var _client_action_cancel_mutex := Mutex.new() +static var _client_action_cancelled_clients: Dictionary = {} + +# Dev-mode only +var _dev_section: VBoxContainer +var _server_label: Label +var _reload_btn: Button +var _setup_section: VBoxContainer +var _setup_container: VBoxContainer +## Primary dev-section button — always (re)starts a `--reload` dev server. +## Same-version Python edits get adopted as compatible by the lifecycle, so +## neither the drift nor the crash Restart button surfaces; this is the +## unconditional kick contributors need to pick up source changes without +## a version bump. +var _dev_primary_btn: Button +## Small "✕" affordance next to the primary — stops the dev server without +## spawning a replacement. Disabled when no dev server is running. +var _dev_stop_btn: Button +var _log_viewer: LogViewerScript +## Vision Routing (optional) - set by plugin.gd; builds the "Vision Routing" +## tab in Clients & Tools and the quick toggle under Developer mode. +var vision_routing: VisionRoutingScript = null + +var _last_connected := false +var _last_status_text := "" +var _last_status_tooltip := "" +var _startup_grace_until_msec: int = 0 + +# Spawn-failure panel — rendered when `get_server_status` reports a +# non-OK `state`. One panel, one body paragraph per state, no cascading +# booleans. See `_crash_body_for_state`. +var _crash_panel: VBoxContainer +var _crash_output: RichTextLabel +var _crash_restart_btn: Button +var _crash_reload_btn: Button +## Help link — visible only for the genuinely-foreign-occupant INCOMPATIBLE +## case (no `can_recover_incompatible` proof). The inline body names a free +## port; this button carries the per-client reconfigure steps that don't fit +## inline. See `PORT_CONFLICT_DOCS` and `_update_crash_panel`. +var _crash_docs_btn: Button +## Port-picker escape hatch — visible inside the crash panel when the root +## cause is port contention (PORT_EXCLUDED or FOREIGN_PORT). The dock writes +## the EditorSetting and reloads the plugin in response to the panel's +## `port_apply_requested` signal. +var _port_picker_panel: PortPickerPanelScript +## Last status Dict rendered into the panel — used to skip re-population +## when nothing changed, which would otherwise reset the user's scroll +## position on every frame. GDScript Dicts compare by value with `==`. +var _last_server_status: Dictionary = {} + +# First-run grace: uvx installs 60+ Python packages on first run (can take +# 10-30s on a slow connection). Don't scare users with "Disconnected" during +# that window — show "Starting server…" instead. After this expires, fall +# back to the normal disconnect UI. +const STARTUP_GRACE_MSEC := 60 * 1000 + +# Update banner — visible UI only. Releases polling, ZIP download, and +# the install pipeline live on `_update_manager`. +var _update_banner: VBoxContainer +var _update_label: Label +var _update_btn: Button + +# Mixed-state banner — surfaces when `addons/godot_ai/` contains +# `*.update_backup` files left by a self-update whose rollback failed +# (`UpdateReloadRunner.InstallStatus.FAILED_MIXED`). Without this banner +# the user sees "plugin won't start" with no actionable context, re-runs +# the update, and compounds the mismatch (issue #354 / audit-v2 #10). +var _mixed_state_banner: VBoxContainer +var _mixed_state_label: Label +var _mixed_state_files: RichTextLabel +var _mixed_state_rescan_btn: Button + + +func setup(connection: McpConnection, log_buffer: McpLogBuffer, plugin: EditorPlugin) -> void: + _connection = connection + _log_buffer = log_buffer + _plugin = plugin + _startup_grace_until_msec = Time.get_ticks_msec() + STARTUP_GRACE_MSEC + + +func _ready() -> void: + _build_ui() + + +func _process(_delta: float) -> void: + _prune_orphaned_client_status_refresh_threads() + _prune_orphaned_client_action_threads() + _poll_completed_client_status_refresh_thread() + _poll_completed_client_action_threads() + _check_client_status_refresh_timeout() + _check_client_action_timeouts() + if _connection == null: + return + _retry_deferred_client_status_refresh() + _update_status() + if _log_viewer != null and _log_viewer.visible: + _log_viewer.tick() + + +func _exit_tree() -> void: + ## Block on any in-flight refresh worker before letting the dock leave the + ## tree. The plugin disable path (editor_reload_plugin, Project Settings + ## toggle) reloads the McpDock script class — which wipes the static + ## `_orphaned_client_status_refresh_threads`, GCs the Thread objects mid- + ## execution, and triggers `~Thread … destroyed without its completion + ## having been realized` plus GDScript VM corruption (Opcode: 0, IP-bounds + ## errors, intermittent SIGSEGV). Probes finish in well under a second + ## under normal conditions; if a CLI probe genuinely hung, the runtime + ## timeout path (`_abandon_client_status_refresh_thread`) has already + ## moved that thread into the orphan list, so we drain it here too. + ## + ## `wait_to_finish` is unbounded by design: GDScript's Thread API has no + ## timeout, and a polling/abandon fallback would just re-introduce the + ## GC-mid-execution crash this fix exists to prevent. Blocking the editor + ## briefly on plugin-reload is strictly better than the SIGSEGV. + _refresh_state = ClientRefreshStateScript.SHUTTING_DOWN + _drain_client_status_refresh_workers() + _drain_client_action_workers() + + +## Public drain entry consulted by `McpUpdateManager._install_zip` before +## any disk write. Pairs both worker pools so the manager doesn't reach +## into private dock methods. `_exit_tree` still calls the two underlying +## drains directly because it has additional state-machine work +## (SHUTTING_DOWN sticky-set) that the install-time path must NOT inherit. +func prepare_for_self_update_drain() -> void: + _poll_completed_client_status_refresh_thread() + _poll_completed_client_action_threads() + _drain_client_status_refresh_workers() + _drain_client_action_workers() + + +func _drain_client_status_refresh_workers() -> void: + ## Block until any in-flight refresh worker (and any orphaned workers from + ## a prior timeout) finish, then clear refresh state. Same blocking + ## semantics as the `_exit_tree` drain — see #232. Used by `_exit_tree` + ## (dock teardown) and `McpUpdateManager._install_zip` (before extract + ## overwrites plugin scripts on disk). + _client_status_refresh_generation += 1 + if _client_status_refresh_thread != null: + _client_status_refresh_thread.wait_to_finish() + _client_status_refresh_thread = null + for thread in _orphaned_client_status_refresh_threads: + if thread != null: + thread.wait_to_finish() + _orphaned_client_status_refresh_threads.clear() + ## Don't transition out of SHUTTING_DOWN — the drain is called from + ## `_exit_tree` (sticky shutdown) and from + ## `McpUpdateManager._install_zip`'s post-drain reset, which writes + ## the state explicitly. + if _refresh_state != ClientRefreshStateScript.SHUTTING_DOWN: + _refresh_state = ClientRefreshStateScript.IDLE + _client_status_refresh_pending = false + _client_status_refresh_pending_force = false + _client_status_refresh_pending_initial = false + + +func _drain_client_action_workers() -> void: + ## Same drain semantics as the refresh worker (see comment above): the + ## plugin disable / install-update path reloads our script class, so any + ## live Thread must finish before its slot is GC'd or we hit + ## `~Thread … destroyed without its completion having been realized` → + ## VM corruption. Normal UI recovery is handled by the per-row watchdog; + ## teardown still blocks because GDScript's Thread API has no kill/timeout + ## primitive and destroying a live Thread corrupts the VM. + ## + ## Generation-bumped per-row so any result from a worker that finished + ## after we started draining detects the generation mismatch and + ## short-circuits without touching freed UI state. + ## + ## After draining, restore the row UI for any in-flight rows: bare + ## `_client_action_threads.clear()` would leave the dock stuck showing + ## "Configuring…" / "Removing…" with disabled buttons forever — a + ## user-visible failure mode for the install-update bail-out branch + ## (zip extract failure on the manager clears `_install_in_flight` and + ## the dock stays alive). + ## Signal every worker before joining any one of them. Normal Configure + ## keeps its full cold-install budget, while shutdown/update can stop all + ## in-flight uvx poll loops concurrently and avoid a 180s editor stall. + for client_id in _client_action_threads.keys(): + _set_client_action_cancel_requested(String(client_id), true) + for client_id in _orphaned_client_action_owners.keys(): + _set_client_action_cancel_requested(String(client_id), true) + for client_id in _client_action_threads.keys(): + var t: Thread = _client_action_threads[client_id] + if t != null: + t.wait_to_finish() + _client_action_generations[client_id] = int(_client_action_generations.get(client_id, 0)) + 1 + _client_action_started_msec.erase(client_id) + _client_action_names.erase(client_id) + _clear_client_action_phase(String(client_id)) + _finalize_action_buttons(String(client_id)) + var row: Dictionary = _client_rows.get(String(client_id), {}) + if not row.is_empty(): + _apply_row_status( + String(client_id), + row.get("status", Client.Status.NOT_CONFIGURED), + "" + ) + _client_action_threads.clear() + for thread in _orphaned_client_action_threads: + if thread != null: + thread.wait_to_finish() + _orphaned_client_action_threads.clear() + _orphaned_client_action_owners.clear() + _client_action_started_msec.clear() + _client_action_names.clear() + _client_action_phase_mutex.lock() + _client_action_phases.clear() + _client_action_phase_mutex.unlock() + _client_action_phase_shown.clear() + _client_action_cancel_mutex.lock() + _client_action_cancelled_clients.clear() + _client_action_cancel_mutex.unlock() + + +func _check_client_action_timeouts() -> void: + var now := Time.get_ticks_msec() + for client_id in _client_action_threads.keys(): + if not _client_action_started_msec.has(client_id): + continue + var started := int(_client_action_started_msec.get(client_id, 0)) + if now - started >= _client_action_budget_msec(String(client_id)): + _abandon_client_action_thread(String(client_id)) + + +## Watchdog budget for an in-flight client action. +## +## The 30s default is sized for a CLI registry call. Once the worker reports it +## has moved on to building the pinned uv environment, that budget is far too +## short: a cold build is *expected* to run for tens of seconds, and abandoning +## it would report a false Configure timeout for exactly the slow cold start the +## pre-warm exists to absorb — re-enabling the row and discarding the worker's +## completion while the build is still running and about to succeed. +## +## The prewarm phase therefore gets the base budget plus the pre-warm's own +## ceiling. The action still cannot hang forever: `McpCliExec.run` bounds the +## build at `PREWARM_TIMEOUT_MS` on its own, so this is a backstop above a +## backstop rather than the only limit. +func _client_action_budget_msec(client_id: String) -> int: + if _read_client_action_phase(client_id) == _PHASE_PREWARM: + return CLIENT_ACTION_TIMEOUT_MSEC + ClientConfigurator.PREWARM_TIMEOUT_MS + return CLIENT_ACTION_TIMEOUT_MSEC + + +func _abandon_client_action_thread(client_id: String) -> void: + if not _client_action_threads.has(client_id): + return + var thread: Thread = _client_action_threads[client_id] + var elapsed := Time.get_ticks_msec() - int(_client_action_started_msec.get(client_id, Time.get_ticks_msec())) + var worker_alive := thread != null and thread.is_alive() + if thread != null: + _orphaned_client_action_threads.append(thread) + if worker_alive: + ## The worker can cross the base watchdog immediately before it + ## announces PREWARM. Cancel now so it cannot become an orphan and + ## then begin a fresh 180s uvx operation outside timeout tracking. + _set_client_action_cancel_requested(client_id, true) + var owned: Array = _orphaned_client_action_owners.get(client_id, []) + owned.append(thread) + _orphaned_client_action_owners[client_id] = owned + _client_action_threads.erase(client_id) + _client_action_started_msec.erase(client_id) + _clear_client_action_phase(client_id) + var action := str(_client_action_names.get(client_id, "configure")) + _client_action_names.erase(client_id) + _client_action_generations[client_id] = int(_client_action_generations.get(client_id, 0)) + 1 + ## Only hand the row back when nothing is still running for it. Re-enabling + ## while the abandoned worker is mid-build invites a second worker on top + ## of the first; the prune below re-enables the row once it actually ends. + if not worker_alive: + _finalize_action_buttons(client_id) + print("MCP | client action timed out: client=%s action=%s elapsed_ms=%d worker_alive=%s" % [ + client_id, + action, + elapsed, + str(worker_alive), + ]) + var label := "Remove" if action == "remove" else "Configure" + var detail := ( + "%s is taking longer than expected and is still running; refreshing current status." % label + if worker_alive + else "%s did not report completion in time; refreshing current status." % label + ) + _apply_row_status(client_id, Client.Status.ERROR, detail) + _refresh_clients_summary() + if is_inside_tree(): + _request_client_status_refresh(true) + + +func _prune_orphaned_client_action_threads() -> void: + var completed_orphan := false + for i in range(_orphaned_client_action_threads.size() - 1, -1, -1): + var thread := _orphaned_client_action_threads[i] + if thread == null: + _orphaned_client_action_threads.remove_at(i) + elif not thread.is_alive(): + thread.wait_to_finish() + _orphaned_client_action_threads.remove_at(i) + completed_orphan = true + _release_finished_orphan_owners() + if completed_orphan and is_inside_tree(): + _request_client_action_completion_refresh() + + +## Hand a row back once its abandoned worker has actually finished. Pairs with +## `_abandon_client_action_thread`, which deliberately leaves the buttons +## disabled while the orphan is still running — without this the row would stay +## disabled forever. +func _release_finished_orphan_owners() -> void: + for client_id in _orphaned_client_action_owners.keys(): + var owned: Array = _orphaned_client_action_owners[client_id] + for i in range(owned.size() - 1, -1, -1): + var t: Thread = owned[i] + if t == null or not t.is_alive(): + owned.remove_at(i) + if owned.is_empty(): + _orphaned_client_action_owners.erase(client_id) + if not _client_action_threads.has(client_id): + _finalize_action_buttons(String(client_id)) + + +## True while a previously-abandoned worker for this client is still running. +static func _has_live_orphan(client_id: String) -> bool: + var owned: Array = _orphaned_client_action_owners.get(client_id, []) + for t in owned: + if t != null and (t as Thread).is_alive(): + return true + return false + + +func _request_client_action_completion_refresh() -> void: + _request_client_status_refresh(true) + + +func _notification(what: int) -> void: + # Detect dock/undock by watching for reparenting events. + if what == NOTIFICATION_PARENTED or what == NOTIFICATION_UNPARENTED: + _update_redock_visibility.call_deferred() + elif what == NOTIFICATION_APPLICATION_FOCUS_IN: + if _should_refresh_client_statuses_on_focus_in(): + _request_client_status_refresh(false) + ## Re-probe uv only when the user actually went off to install it + ## (see _on_install_uv). `check_uv_version()` is cached, so an + ## ungated refresh here would usually be free — but after the + ## button invalidated that cache it costs one blocking + ## `uvx --version`, and this notification must not grow a probe on + ## the common focus-in path. One-shot: clear before refreshing. + if _uv_recheck_pending: + _uv_recheck_pending = false + _refresh_setup_status.call_deferred() + + +func _should_refresh_client_statuses_on_focus_in() -> bool: + ## Focus-in is part of Godot/editor window activation. Keep automatic refresh, + ## but only through the async/cooldown-protected path; never run a blocking + ## client-status sweep directly from this notification. + return true + + +func _is_floating() -> bool: + var p := get_parent() + while p != null: + if p is Window: + return p != get_tree().root + p = p.get_parent() + return false + + +func _update_redock_visibility() -> void: + if _redock_btn == null: + return + var floating := _is_floating() + if _redock_btn.visible != floating: + _redock_btn.visible = floating + + +func _on_redock() -> void: + # When floating, our Window is NOT the editor root. Closing it triggers + # Godot's internal dock-return logic (same as clicking the window's X). + var win := get_window() + if win != null and win != get_tree().root: + win.close_requested.emit() + + +func _build_margin_container(margin: int = 12) -> MarginContainer: + var margin_container := MarginContainer.new() + margin_container.add_theme_constant_override("margin_left", margin) + margin_container.add_theme_constant_override("margin_right", margin) + margin_container.add_theme_constant_override("margin_top", margin) + margin_container.add_theme_constant_override("margin_bottom", margin) + return margin_container + + +func _build_ui() -> void: + add_theme_constant_override("separation", 8) + + # --- Top row: status indicator + redock button (when floating) --- + var status_row := HBoxContainer.new() + status_row.add_theme_constant_override("separation", 8) + + _status_icon = ColorRect.new() + _status_icon.custom_minimum_size = Vector2(14, 14) + # Amber on first paint — matches the "Starting server…" label text and + # distinguishes from a real disconnect (red). + _status_icon.color = COLOR_AMBER + var icon_center := CenterContainer.new() + icon_center.add_child(_status_icon) + status_row.add_child(icon_center) + + _status_label = Label.new() + # Start in grace state — _update_status will take over on the next frame + # once the connection is available. Never show bare "Disconnected" on + # first paint because that's misleading while the server is still + # spinning up. + _status_label.text = "Starting server…" + _status_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + status_row.add_child(_status_label) + + _redock_btn = Button.new() + _redock_btn.text = "Dock" + _redock_btn.tooltip_text = "Return this panel to the editor dock" + _redock_btn.visible = false + _redock_btn.pressed.connect(_on_redock) + status_row.add_child(_redock_btn) + + add_child(status_row) + + # Install-mode line — so a git-clone user doesn't press the yellow Update + # banner below and silently downgrade from main to the last release tag. + # See #144. + _install_label = Label.new() + _install_label.add_theme_color_override("font_color", COLOR_MUTED) + _install_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _install_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _install_label.text = _install_mode_text() + _install_label.tooltip_text = _install_mode_tooltip() + _install_label.mouse_filter = Control.MOUSE_FILTER_STOP + add_child(_install_label) + + _body_scroll = ScrollContainer.new() + _body_scroll.name = "DockBodyScroll" + _body_scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _body_scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + _body_scroll.custom_minimum_size = Vector2(0, 48) + _body_scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + add_child(_body_scroll) + + _body = VBoxContainer.new() + _body.name = "DockBody" + _body.add_theme_constant_override("separation", 8) + _body.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _body_scroll.add_child(_body) + + # --- Spawn-failure panel (shown when `_start_server` reports a non-OK + # state via `get_server_status`). One body paragraph + the matching + # action; the top status label already carries the state headline. + _crash_panel = VBoxContainer.new() + _crash_panel.add_theme_constant_override("separation", 6) + _crash_panel.visible = false + + _crash_output = RichTextLabel.new() + _crash_output.custom_minimum_size = Vector2(0, 60) + _crash_output.bbcode_enabled = false + _crash_output.selection_enabled = true + _crash_output.scroll_following = false + _crash_output.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _crash_output.fit_content = true + _crash_panel.add_child(_crash_output) + + _port_picker_panel = PortPickerPanelScript.new() + _port_picker_panel.setup() + _port_picker_panel.port_apply_requested.connect(_on_port_apply_requested) + _crash_panel.add_child(_port_picker_panel) + + _crash_restart_btn = Button.new() + _crash_restart_btn.text = "Restart Server" + _crash_restart_btn.tooltip_text = "Stop the old server on this port and start the bundled godot-ai server" + _crash_restart_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _crash_restart_btn.add_theme_color_override("font_color", Color.WHITE) + _crash_restart_btn.add_theme_color_override("font_hover_color", Color.WHITE) + _crash_restart_btn.add_theme_color_override("font_pressed_color", Color.WHITE) + _crash_restart_btn.pressed.connect(_on_restart_stale_server) + _crash_restart_btn.visible = false + _crash_panel.add_child(_crash_restart_btn) + + _crash_reload_btn = Button.new() + _crash_reload_btn.text = "Reload Plugin" + _crash_reload_btn.tooltip_text = "Re-run the spawn after fixing the underlying issue" + _crash_reload_btn.pressed.connect(_on_reload_plugin) + _crash_panel.add_child(_crash_reload_btn) + + _crash_docs_btn = Button.new() + _crash_docs_btn.text = "How to change the port" + _crash_docs_btn.tooltip_text = "Open the guide: change godot_ai/http_port and reconfigure your MCP clients" + _crash_docs_btn.visible = false + _crash_docs_btn.pressed.connect(func(): OS.shell_open(_port_conflict_docs_url())) + _crash_panel.add_child(_crash_docs_btn) + + _crash_panel.add_child(HSeparator.new()) + _body.add_child(_crash_panel) + + _build_mixed_state_banner() + _refresh_mixed_state_banner() + + # --- Update banner (top of dock, hidden until check finds a newer version) --- + _update_banner = VBoxContainer.new() + _update_banner.add_theme_constant_override("separation", 4) + _update_banner.visible = false + + _update_label = Label.new() + _update_label.add_theme_font_size_override("font_size", 15) + _update_label.add_theme_color_override("font_color", Color(1.0, 0.85, 0.3)) + ## Wrap long banner text (e.g. the < 4.5 support-floor guidance) instead + ## of letting a single line stretch the whole dock wide. The dock is a + ## fixed-width side panel, so constrain horizontally and wrap. + _update_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _update_label.size_flags_horizontal = Control.SIZE_FILL + _update_label.custom_minimum_size = Vector2(0, 0) + _update_banner.add_child(_update_label) + + var update_btn_row := HBoxContainer.new() + update_btn_row.add_theme_constant_override("separation", 6) + + _update_btn = Button.new() + _update_btn.text = "Update" + _update_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _update_btn.pressed.connect(_on_update_pressed) + update_btn_row.add_child(_update_btn) + + var release_link := Button.new() + release_link.text = "Release notes" + release_link.pressed.connect(func(): OS.shell_open(UpdateManagerScript.RELEASES_PAGE)) + update_btn_row.add_child(release_link) + + _update_banner.add_child(update_btn_row) + _update_banner.add_child(HSeparator.new()) + + _body.add_child(_update_banner) + + if _update_manager == null: + _update_manager = UpdateManagerScript.new() + _update_manager.setup(_plugin, self) + _update_manager.update_check_completed.connect(_on_update_check_result) + _update_manager.install_state_changed.connect(_on_install_state_changed) + _body.add_child(_update_manager) + _update_manager.check_for_updates.call_deferred() + + # --- Dev-only connection extras (server label + reload button) --- + _dev_section = VBoxContainer.new() + _dev_section.add_theme_constant_override("separation", 6) + _body.add_child(_dev_section) + + _server_label = Label.new() + _server_label.add_theme_color_override("font_color", COLOR_MUTED) + _dev_section.add_child(_server_label) + _refresh_server_label() + + var btn_row := HBoxContainer.new() + btn_row.add_theme_constant_override("separation", 6) + + _reload_btn = Button.new() + _reload_btn.text = "Dev: Reload Plugin" + _reload_btn.tooltip_text = "Developer utility: reload the GDScript plugin. This does not restart or replace the server." + _reload_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _reload_btn.pressed.connect(_on_reload_plugin) + btn_row.add_child(_reload_btn) + + _dev_section.add_child(btn_row) + + # --- Setup section (dev-only or when uv missing) --- + _setup_section = VBoxContainer.new() + _setup_section.add_theme_constant_override("separation", 6) + _body.add_child(_setup_section) + + _setup_section.add_child(HSeparator.new()) + _setup_section.add_child(_make_header("Setup")) + _setup_container = VBoxContainer.new() + _setup_container.add_theme_constant_override("separation", 6) + _setup_section.add_child(_setup_container) + + _body.add_child(HSeparator.new()) + + # --- Clients --- + var clients_header_row := HBoxContainer.new() + clients_header_row.add_theme_constant_override("separation", 8) + + var clients_header := _make_header("Clients") + clients_header_row.add_child(clients_header) + + _clients_summary_label = Label.new() + _clients_summary_label.add_theme_color_override("font_color", COLOR_MUTED) + _clients_summary_label.clip_text = true + _clients_summary_label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS + _clients_summary_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + clients_header_row.add_child(_clients_summary_label) + + var clients_actions := HFlowContainer.new() + clients_actions.add_theme_constant_override("h_separation", 8) + clients_actions.add_theme_constant_override("v_separation", 4) + + var clients_refresh_btn := Button.new() + clients_refresh_btn.text = "Refresh" + clients_refresh_btn.tooltip_text = "Refresh client status in the background. Cached status stays visible while checks run." + clients_refresh_btn.pressed.connect(_on_refresh_clients_pressed) + clients_actions.add_child(clients_refresh_btn) + + var clients_open_btn := Button.new() + clients_open_btn.text = "Clients & Tools" + clients_open_btn.tooltip_text = "Open the Clients & Tools window — configure AI clients, choose telemetry preferences, or disable tool domains to fit under a client's hard tool-count cap (e.g. Antigravity's 100)." + clients_open_btn.pressed.connect(_on_open_clients_window) + clients_actions.add_child(clients_open_btn) + + _body.add_child(clients_header_row) + _body.add_child(clients_actions) + + _client_empty_cta_btn = Button.new() + _client_empty_cta_btn.text = "Configure an AI client ->" + _client_empty_cta_btn.tooltip_text = "Open the Clients tab to configure an AI coding client for this Godot AI server." + _client_empty_cta_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _client_empty_cta_btn.visible = false + _client_empty_cta_btn.pressed.connect(_on_open_clients_window) + _body.add_child(_client_empty_cta_btn) + + # Drift banner — hidden until a sweep finds at least one mismatched client. + _drift_banner = VBoxContainer.new() + _drift_banner.add_theme_constant_override("separation", 4) + _drift_banner.visible = false + _drift_label = Label.new() + _drift_label.add_theme_color_override("font_color", COLOR_AMBER) + _drift_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _drift_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _drift_banner.add_child(_drift_label) + var drift_btn := Button.new() + drift_btn.text = "Reconfigure mismatched" + drift_btn.tooltip_text = "Re-run Configure on every client whose stored URL doesn't match the current server URL." + drift_btn.pressed.connect(_on_reconfigure_mismatched) + _drift_banner.add_child(drift_btn) + _body.add_child(_drift_banner) + + _clients_window = Window.new() + _clients_window.title = "Godot AI Settings" + ## `Vector2i * float` yields Vector2; wrap the result back to Vector2i. + _clients_window.min_size = Vector2i(Vector2(560, 460) * EditorInterface.get_editor_scale()) + _clients_window.visible = false + _clients_window.close_requested.connect(_on_clients_window_close_requested) + add_child(_clients_window) + + ## Tabbed secondary window: Clients (per-client rows), Tools (domain- + ## exclusion checkboxes for clients that cap total tool count, like + ## Antigravity at 100), and Settings (allow-host LAN opt-in, #507). + ## Adding another tab is one more _build_*_tab call — no surgery on the + ## rest of the window. + var tabs := TabContainer.new() + tabs.anchor_right = 1.0 + tabs.anchor_bottom = 1.0 + _clients_window.add_child(tabs) + + var clients_tab := VBoxContainer.new() + clients_tab.add_theme_constant_override("separation", 8) + var clients_margin := _build_margin_container() + clients_margin.name = "Clients" + clients_margin.add_child(clients_tab) + tabs.add_child(clients_margin) + + _client_configure_all_btn = Button.new() + _client_configure_all_btn.text = "Configure all" + _client_configure_all_btn.tooltip_text = "Configure every client that isn't already pointing at this server" + _client_configure_all_btn.size_flags_horizontal = Control.SIZE_SHRINK_END + _client_configure_all_btn.pressed.connect(_on_configure_all_clients) + clients_tab.add_child(_client_configure_all_btn) + + var clients_scroll := ScrollContainer.new() + clients_scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL + clients_scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + clients_scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + clients_tab.add_child(clients_scroll) + + _client_grid = VBoxContainer.new() + _client_grid.add_theme_constant_override("separation", 4) + _client_grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL + clients_scroll.add_child(_client_grid) + + for client_id in ClientConfigurator.client_ids(): + _build_client_row(client_id) + + _build_tools_tab(tabs) + _build_settings_tab(tabs) + + _body.add_child(HSeparator.new()) + + # --- Dev mode toggle (always visible) --- + var dev_toggle_row := HBoxContainer.new() + var dev_toggle_label := Label.new() + dev_toggle_label.text = "Developer mode" + dev_toggle_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + dev_toggle_row.add_child(dev_toggle_label) + + _dev_mode_toggle = CheckButton.new() + _dev_mode_toggle.button_pressed = _load_dev_mode() + _dev_mode_toggle.toggled.connect(_on_dev_mode_toggled) + dev_toggle_row.add_child(_dev_mode_toggle) + _body.add_child(dev_toggle_row) + + # --- Log section (dev-only) --- + _log_viewer = LogViewerScript.new() + _log_viewer.setup(_log_buffer) + _log_viewer.logging_enabled_changed.connect(_on_log_logging_enabled_changed) + _body.add_child(_log_viewer) + + # Apply initial dev-mode visibility + _apply_dev_mode_visibility() + _refresh_setup_status.call_deferred() + _perform_initial_client_status_refresh() + + +## Static so `dock_panels/*.gd` subpanels can call it via `McpDock._make_header(...)` +## without re-declaring identical helpers + COLOR_HEADER constants. +static func _make_header(text: String) -> Label: + var label := Label.new() + label.text = text + label.add_theme_font_size_override("font_size", 18) + label.add_theme_color_override("font_color", COLOR_HEADER) + return label + + +func _build_client_row(client_id: String) -> void: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 6) + row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + + var dot := ColorRect.new() + dot.custom_minimum_size = Vector2(10, 10) + dot.color = COLOR_MUTED + var dot_center := CenterContainer.new() + dot_center.add_child(dot) + row.add_child(dot_center) + + var name_label := Label.new() + name_label.text = ClientConfigurator.client_display_name(client_id) + name_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + ## #838/#816 step 11: say which transport Configure will write — the + ## client-owned attach bridge or the client's native URL mode. + var transport_tag := Label.new() + transport_tag.text = _client_transport_tag(client_id) + transport_tag.add_theme_color_override("font_color", COLOR_MUTED) + transport_tag.tooltip_text = ( + "Configure writes a local `godot-ai attach` launch command for this client." + if transport_tag.text == "attach" + else "Configure writes this client's native URL entry." + ) + ## Long error messages from `_verify_post_state` (e.g. "reported remove ok + ## but verification still reads configured…") used to push the Retry / + ## Configure button off-screen — the row's Label wanted its full text + ## width as minimum size, so the buttons got squeezed out. Wrap onto + ## multiple lines instead so the row keeps its right edge stable and + ## the buttons remain visible; the user can also read the whole message + ## without resizing the window. + name_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + name_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + row.add_child(name_label) + row.add_child(transport_tag) + + var configure_btn := Button.new() + configure_btn.text = "Configure" + configure_btn.pressed.connect(_on_configure_client.bind(client_id)) + row.add_child(configure_btn) + + var remove_btn := Button.new() + remove_btn.text = "Remove" + remove_btn.visible = false + remove_btn.pressed.connect(_on_remove_client.bind(client_id)) + row.add_child(remove_btn) + + # F-3-4: use the authoritative facade so Open/Reveal land on the same + # file `_check_status_merged` drives (last-wins across project tiers, + # matching the F2 status fix). + var config_path := ClientConfigurator.effective_authoritative_path(client_id) + var open_config_btn := Button.new() + _apply_editor_icon(open_config_btn, "ExternalLink", "Open") + open_config_btn.custom_minimum_size = Vector2(28, 28) + open_config_btn.visible = not config_path.is_empty() + open_config_btn.pressed.connect(_on_open_config_file.bind(client_id)) + row.add_child(open_config_btn) + + var reveal_btn := Button.new() + _apply_editor_icon(reveal_btn, "Folder", "Reveal") + reveal_btn.custom_minimum_size = Vector2(28, 28) + reveal_btn.visible = not config_path.is_empty() + reveal_btn.pressed.connect(_on_reveal_config_folder.bind(client_id)) + row.add_child(reveal_btn) + + _client_grid.add_child(row) + + var manual_panel := VBoxContainer.new() + manual_panel.add_theme_constant_override("separation", 4) + manual_panel.visible = false + + var manual_hint := Label.new() + manual_hint.text = "Run this manually:" + manual_hint.add_theme_color_override("font_color", COLOR_MUTED) + manual_panel.add_child(manual_hint) + + var manual_text := TextEdit.new() + manual_text.editable = false + manual_text.custom_minimum_size = Vector2(0, 60) + manual_text.wrap_mode = TextEdit.LINE_WRAPPING_BOUNDARY + manual_panel.add_child(manual_text) + + var copy_btn := Button.new() + copy_btn.text = "Copy" + copy_btn.pressed.connect(_on_copy_manual_command.bind(client_id)) + manual_panel.add_child(copy_btn) + + _client_grid.add_child(manual_panel) + + _client_rows[client_id] = { + "dot": dot, + "status": Client.Status.NOT_CONFIGURED, + "name_label": name_label, + "configure_btn": configure_btn, + "remove_btn": remove_btn, + "open_config_btn": open_config_btn, + "reveal_btn": reveal_btn, + "config_path": config_path, + "manual_panel": manual_panel, + "manual_text": manual_text, + } + _refresh_client_config_file_buttons(client_id) + + +func _apply_editor_icon(button: Button, icon_name: String, fallback_text: String) -> void: + if has_theme_icon(icon_name, "EditorIcons"): + button.icon = get_theme_icon(icon_name, "EditorIcons") + else: + button.text = fallback_text + + +# --- Status updates --- + +func _update_status() -> void: + var connected: bool = _connection != null and _connection.is_connected + ## Pull the connection's transport snapshot on this existing refresh tick. + ## `has_method` preserves the plugin self-update seam while an older + ## Connection instance is still alive under a hot-reloaded dock script. + var transport_status: Dictionary = ( + _connection.get_transport_status() + if _connection != null and _connection.has_method("get_transport_status") + else {} + ) + ## During plugin self-update there's a brief window where this dock + ## script is already the new version (Godot hot-reloads scripts on + ## file change) but `_plugin` is still the old `EditorPlugin` instance + ## (only `set_plugin_enabled(false, true)` re-instantiates that). When + ## the new dock calls a method the old plugin doesn't have, `_process` + ## errors every frame until `McpUpdateManager._reload_after_update` + ## lands. Guard every `_plugin.()` call with `has_method` + ## so that window stays silent. See #168. + var server_status: Dictionary = ( + _plugin.get_server_status() + if _plugin != null and _plugin.has_method("get_server_status") + else {} + ) + var state: int = int(server_status.get("state", ServerStateScript.UNINITIALIZED)) + if ServerStateScript.blocks_client_health(state): + connected = false + + ## One `match`/`elif` chain, one source of truth. Adding a new + ## spawn outcome = one `ServerStateScript` constant + one arm here + + ## one body string in `_crash_body_for_state`. + ## Default covers both a missing/old Connection instance and an unknown + ## future transport phase. Every recognized state below overrides it, so + ## startup grace and settled disconnect have one rendering path. + var inside_startup_grace := Time.get_ticks_msec() < _startup_grace_until_msec + var status_text := "Starting server…" if inside_startup_grace else "Disconnected" + var status_color := COLOR_AMBER if inside_startup_grace else Color.RED + if _server_restart_in_progress: + status_text = "Restarting server..." + status_color = COLOR_AMBER + elif connected: + status_text = _connected_status_text() + status_color = Color.GREEN + elif state == ServerStateScript.CRASHED: + var exit_ms: int = server_status.get("exit_ms", 0) + status_text = "Server exited after %.1fs" % (exit_ms / 1000.0) + status_color = Color.RED + elif state == ServerStateScript.PORT_EXCLUDED: + status_text = "Port %d reserved by Windows" % ClientConfigurator.http_port() + status_color = Color.RED + elif state == ServerStateScript.INCOMPATIBLE: + status_text = "Incompatible server on port %d" % ClientConfigurator.http_port() + status_color = Color.RED + elif state == ServerStateScript.FOREIGN_PORT: + ## #647: the post-crash probe names the actual conflicting port + ## (HTTP or WS) — don't blame port 8000 when 9500 is the occupant. + var conflict_port: int = int(server_status.get("conflict_port", 0)) + if conflict_port <= 0: + conflict_port = ClientConfigurator.http_port() + status_text = "Port %d held by another process" % conflict_port + status_color = Color.RED + elif state == ServerStateScript.NO_COMMAND: + status_text = "No server command found" + status_color = Color.RED + elif not transport_status.is_empty(): + var transport_phase := str(transport_status.get("phase", "")) + if transport_phase == "connecting": + status_text = _transport_status_text(transport_status) + status_color = COLOR_AMBER + elif transport_phase == "retrying": + status_text = _transport_status_text(transport_status) + status_color = COLOR_AMBER + elif transport_phase == "closing": + status_text = _transport_status_text(transport_status) + status_color = COLOR_AMBER + elif transport_phase == "blocked": + ## Exact terminal labels come from lifecycle state above. This is a + ## generic fallback for a blocked connection without a diagnosis. + status_text = _transport_status_text(transport_status) + status_color = Color.RED + + ## keep_server_on_exit (#800): the reaper env opt-outs are staged at + ## spawn, so a mid-session toggle only lands on the next server start — + ## say so while the running server still carries the old behavior. + if connected and ClientConfigurator.keep_server_on_exit() != bool(server_status.get("keep_alive", false)): + status_text += " — keep-server-on-exit applies after Restart" + + _update_crash_panel(server_status) + _refresh_server_version_label(server_status) + _refresh_server_label(server_status) + + ## A transient disconnect reason remains in the transport snapshot until + ## handshake_ack. Once the dock renders the connection as OPEN, do not pair + ## its green label with the previous peer's recovery diagnostic. + var status_tooltip := "" if connected else str(transport_status.get("reason", "")) + var changed: bool = ( + connected != _last_connected + or status_text != _last_status_text + or status_tooltip != _last_status_tooltip + ) + if not changed: + return + var just_connected: bool = connected and not _last_connected + _last_connected = connected + _last_status_text = status_text + _last_status_tooltip = status_tooltip + _status_icon.color = status_color + _status_label.text = status_text + _status_label.tooltip_text = status_tooltip + if just_connected: + ## #739: the server just came up. If the startup uv probe failed + ## (the reporter's screenshot: green "Server connected" beside a + ## red "uv: not found" row), the failure was transient — re-probe + ## instead of pinning the red row for the whole session. Runs + ## AFTER the label writes above and via the deferred queue, so the + ## status-machine state is committed before the probe can block. + _schedule_uv_reprobe() + + ## Status transitions are exactly when "is the launch still settling?" + ## can change (Starting server… -> connected / Disconnected / terminal + ## diagnosis), so re-evaluate the Setup section's visibility here (#744). + ## Cheap: runs only on `changed`, and the uv probe result is cached. + _apply_dev_mode_visibility() + + _update_dev_section_buttons() + + +## Render the diagnostic panel body for a given spawn state. The top +## status label already names the problem; this answers "what do I do?". +## Panel shows for any non-OK state; picker shows only when moving the HTTP +## port alone is a valid recovery. Incompatible godot-ai servers commonly +## hold both HTTP and WS ports, so their message points to Editor Settings +## instead of offering the HTTP-only quick picker. +func _update_crash_panel(server_status: Dictionary) -> void: + var state: int = int(server_status.get("state", ServerStateScript.UNINITIALIZED)) + if not ServerStateScript.is_terminal_diagnosis(state): + if _crash_panel.visible: + _crash_panel.visible = false + _last_server_status = {} + return + if server_status == _last_server_status: + return + _last_server_status = server_status.duplicate() + _crash_panel.visible = true + _crash_output.clear() + _crash_output.add_text(_crash_body_for_state(state, server_status)) + var show_recovery_restart := ( + state == ServerStateScript.INCOMPATIBLE + and bool(server_status.get("can_recover_incompatible", false)) + ) + if _crash_restart_btn != null: + _crash_restart_btn.visible = show_recovery_restart + _crash_restart_btn.disabled = _server_restart_in_progress + _crash_restart_btn.text = "Restarting..." if _server_restart_in_progress else "Restart Server" + if _crash_reload_btn != null: + _crash_reload_btn.visible = ( + not show_recovery_restart + and state != ServerStateScript.INCOMPATIBLE + ) + ## Docs link only for the genuinely-foreign occupant: a recoverable + ## (older godot-ai) server gets Restart Server instead, and the inline + ## body already names a free port — the link carries the per-client + ## reconfigure steps that don't fit inline. + if _crash_docs_btn != null: + _crash_docs_btn.visible = ( + state == ServerStateScript.INCOMPATIBLE + and not bool(server_status.get("can_recover_incompatible", false)) + ) + + ## #647: the quick picker only moves `godot_ai/http_port`, so hide it + ## when the diagnosed conflict is on the WebSocket port — the crash + ## body already points at `godot_ai/ws_port` in Editor Settings. + var conflict_port := int(server_status.get("conflict_port", 0)) + var http_conflict := conflict_port <= 0 or conflict_port == ClientConfigurator.http_port() + var port_picker_visible := ( + state == ServerStateScript.PORT_EXCLUDED + or (state == ServerStateScript.FOREIGN_PORT and http_conflict) + ) + _port_picker_panel.visible = port_picker_visible + if port_picker_visible: + ## Seed the spinbox with a suggested non-reserved port each time the + ## panel surfaces. Idempotent when the user already has a good + ## candidate queued up. + _port_picker_panel.seed_suggested_port() + + +static func _crash_body_for_state(state: int, server_status: Dictionary = {}) -> String: + ## Single sentence per state. The top status label already names the + ## problem; don't repeat it here. This copy answers "what do I do?". + var port := ClientConfigurator.http_port() + match state: + ServerStateScript.PORT_EXCLUDED: + return "Windows (Hyper-V / WSL2 / Docker) reserved port %d. Pick a free port or try `net stop winnat; net start winnat` in an admin shell." % port + ServerStateScript.INCOMPATIBLE: + var message := str(server_status.get("message", "")) + if bool(server_status.get("can_recover_incompatible", false)): + var expected := str(server_status.get("expected_version", "")) + if expected.is_empty(): + expected = ClientConfigurator.get_plugin_version() + if not message.is_empty(): + return "%s Click Restart Server below to replace it with godot-ai v%s." % [message, expected] + return "Port %d is occupied by an older godot-ai server. Click Restart Server below to replace it with godot-ai v%s." % [port, expected] + ## Genuinely foreign occupant (no recovery proof). Name a concrete + ## free port so the user doesn't have to hunt for one, and let the + ## crash panel's "How to change the port" link carry the per-client + ## reconfigure steps. `suggest_free_port` already routes through the + ## Windows reservation table, so the named port won't itself fail + ## with WinError 10013. + var hint := _free_port_hint(port) + if not message.is_empty(): + return "%s %s" % [message, hint] + return "Port %d is occupied by an incompatible server. %s" % [port, hint] + ServerStateScript.FOREIGN_PORT: + ## #647: prefer the lifecycle's diagnosis (it names the right + ## port — HTTP vs WS — and the Editor Setting to change) over + ## the generic HTTP-port fallback. + var foreign_message := str(server_status.get("message", "")) + if not foreign_message.is_empty(): + return foreign_message + return "Another process is already bound to port %d. Pick a free port or stop the other process." % port + ServerStateScript.CRASHED: + ## #805: a specific crash diagnosis from the lifecycle (e.g. the + ## flapping-occupant latch) beats the generic launch-mode copy. + ## Generic crash paths clear the message, so stale text from an + ## earlier state can't leak in here. + var crash_message := str(server_status.get("message", "")) + if not crash_message.is_empty(): + return crash_message + ## Both spawn attempts failed on the uvx tier — stock releases: + ## PyPI lag. Local builds (version with +metadata): almost always the + ## dev venv was not found (unresolved junction/symlink) so uvx tried + ## a pin that may lack checkout-local extras. + if ClientConfigurator.get_server_launch_mode() == "uvx": + var version := ClientConfigurator.get_plugin_version() + var pin := ClientConfigurator._pypi_pin_version(version) + if pin != version: + ## `%` binds tighter than `+` in GDScript — format the fully + ## concatenated string, never the last fragment alone. + return ( + "The server exited before the WebSocket handshake. " + + "Local plugin version is %s (PEP 440 local build metadata) — uvx pins PyPI godot-ai==%s. " + + "If you need checkout-local server code, ensure addons/godot_ai resolves to your " + + "dev tree (symlink/junction) with a `.venv`, or set GODOT_AI_VENV_PYTHON to that " + + "venv's python binary, then Reload Plugin. Log should show 'MCP | using dev venv: ...'." + ) % [version, pin] + return ( + "The server exited before the WebSocket handshake, even after a `uvx --refresh` retry. " + + "If this is a brand-new release, PyPI's index may still be propagating (~10 min). " + + "Wait a moment and click Reload Plugin to retry, or check Godot's output log for Python's traceback. " + + "Target: godot-ai==%s." + ) % pin + return "The server exited before the WebSocket handshake. Check Godot's output log (bottom panel) for Python's traceback." + ServerStateScript.NO_COMMAND: + return "No godot-ai server found. Install `uv` via the Setup panel above, or run `pip install godot-ai`." + _: + return "" + + +## One sentence naming concrete free ports for the user to switch to. Names +## BOTH http and ws: this branch also fires for an incompatible godot-ai +## server we can't prove we own, which commonly holds both ports — moving only +## http would then leave the new server unable to bind ws. Both suggestions are +## routed through `suggest_free_port` so they clear Windows' winnat reservation +## table (no point suggesting a port that 10013s on bind). Only the http port +## reaches client configs; the ws port is server↔plugin, hence the wording. +## The per-client reconfigure steps live behind the crash panel's docs link. +static func _free_port_hint(port: int) -> String: + var free_http := ClientConfigurator.suggest_free_port(port + 1) + var free_ws := ClientConfigurator.suggest_free_port(ClientConfigurator.ws_port() + 1) + return "Ports %d (HTTP) and %d (WS) are free — set `godot_ai/http_port` and `godot_ai/ws_port` in Editor Settings, then update your client config with the new HTTP port (How to change the port, below)." % [free_http, free_ws] + + +## URL for the port-conflict guide, pinned to the release tag that matches the +## installed plugin version (releases are tagged `v`). The crash-panel +## button only exists in builds that ship `docs/port-conflicts.md`, so the +## versioned ref always resolves — and a shipped build never points users at a +## tip-of-main guide that has drifted from its own UI. +static func _port_conflict_docs_url() -> String: + var version := ClientConfigurator.get_plugin_version() + var git_ref := ("v%s" % version) if not version.is_empty() else "main" + return "%s/%s/%s" % [REPO_BLOB_BASE, git_ref, PORT_CONFLICT_DOCS_PATH] + + +## Build the mixed-state banner. Hidden until `_refresh_mixed_state_banner` +## confirms `*.update_backup` files exist in the addons tree. Mirrors the +## issue #354 fix shape: structured, agent-readable diagnostic that survives +## a normal editor restart so the user can act on it instead of re-running +## the update. +func _build_mixed_state_banner() -> void: + _mixed_state_banner = VBoxContainer.new() + _mixed_state_banner.add_theme_constant_override("separation", 4) + _mixed_state_banner.visible = false + + _mixed_state_label = Label.new() + _mixed_state_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _mixed_state_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _mixed_state_label.add_theme_color_override("font_color", Color.RED) + _mixed_state_banner.add_child(_mixed_state_label) + + _mixed_state_files = RichTextLabel.new() + _mixed_state_files.bbcode_enabled = false + _mixed_state_files.fit_content = true + _mixed_state_files.autowrap_mode = TextServer.AUTOWRAP_OFF + _mixed_state_files.selection_enabled = true + _mixed_state_files.scroll_active = true + _mixed_state_files.custom_minimum_size = Vector2(0, 90) + _mixed_state_files.add_theme_color_override("default_color", COLOR_AMBER) + _mixed_state_banner.add_child(_mixed_state_files) + + _mixed_state_rescan_btn = Button.new() + _mixed_state_rescan_btn.text = "Re-scan" + _mixed_state_rescan_btn.tooltip_text = ( + "Scan addons/godot_ai/ for *.update_backup files again." + + " Click after restoring the addon manually to dismiss this banner." + ) + _mixed_state_rescan_btn.pressed.connect(func(): _refresh_mixed_state_banner(true)) + _mixed_state_banner.add_child(_mixed_state_rescan_btn) + + _mixed_state_banner.add_child(HSeparator.new()) + _body.add_child(_mixed_state_banner) + + +func _refresh_mixed_state_banner(force: bool = false) -> void: + ## Re-scan button passes `force=true` to bypass the scanner's TTL + ## cache so a manual fix is reflected immediately. + _apply_mixed_state_banner_diagnostic(UpdateMixedStateScript.diagnose( + UpdateMixedStateScript.ADDON_DIR, force + )) + + +## Render seam exposed for testing — the GDScript test suite drives this +## directly with synthetic diagnostics so dock banner contracts can be +## pinned without polluting the real `addons/godot_ai/` tree with backup +## files. Callers from production go through `_refresh_mixed_state_banner`. +func _apply_mixed_state_banner_diagnostic(diag: Dictionary) -> void: + if _mixed_state_banner == null: + return + if diag.is_empty(): + _mixed_state_banner.visible = false + return + _mixed_state_banner.visible = true + ## `Dictionary.get(...)` returns Variant; Label.text is typed String. + ## Explicit cast keeps the type contract honest and dodges some Godot + ## 4.x point-release quirks around Variant→typed-property assignment. + _mixed_state_label.text = String(diag.get("message", "")) + _mixed_state_files.clear() + for path in diag.get("backup_files", []): + _mixed_state_files.add_text(String(path)) + _mixed_state_files.newline() + if bool(diag.get("truncated", false)): + _mixed_state_files.add_text( + "… (list truncated at %d entries)" % UpdateMixedStateScript.MAX_BACKUP_RESULTS + ) + _mixed_state_files.newline() + + +## Signal handler for the extracted LogViewer — the panel owns its own +## display visibility, the dock owns logging routing. Routes to BOTH the +## dispatcher (gates [recv]/[send] recording) and the log buffer's console +## echo — the connection logs [event]/[defer] lines directly to the buffer, +## bypassing the dispatcher, so gating only `mcp_logging` left the console +## spamming with the toggle off (#626). Ring recording is unaffected, so +## the dock's log panel keeps working while the console stays quiet. +func _on_log_logging_enabled_changed(enabled: bool) -> void: + if _connection and _connection.dispatcher: + _connection.dispatcher.mcp_logging = enabled + if _log_buffer != null: + _log_buffer.enabled = enabled + + +## Signal handler for the extracted PortPickerPanel — the panel range-validates +## the spinbox value before emitting, so we just write the EditorSetting and +## reload the plugin here. +func _on_port_apply_requested(new_port: int) -> void: + var es := EditorInterface.get_editor_settings() + if es != null: + es.set_setting(McpSettings.SETTING_HTTP_PORT, new_port) + ## Every saved client config now points at the old port. Re-sweep so the + ## drift banner appears in the same frame the user committed the change — + ## the plugin reload below will run a second sweep on its own first paint, + ## but we want the banner up immediately rather than after the reload + ## handshake races to completion. See #166. + _refresh_all_client_statuses() + ## Reload after the setting is committed so `_start_server` reads the new + ## port on the re-enabled plugin instance. + _on_reload_plugin() + + +func _refresh_server_label(server_status: Dictionary = {}) -> void: + if _server_label == null: + return + var ws_port := ClientConfigurator.ws_port() + if _plugin != null and _plugin.has_method("get_resolved_ws_port"): + ws_port = int(_plugin.get_resolved_ws_port()) + var text := "WS: %d HTTP: %d" % [ws_port, ClientConfigurator.http_port()] + if server_status.is_empty() and _plugin != null and _plugin.has_method("get_server_status"): + server_status = _plugin.get_server_status() + if _plugin != null and _plugin.has_method("get_server_pid"): + var ownership := _server_ownership_tag( + int(server_status.get("state", ServerStateScript.UNINITIALIZED)), + int(_plugin.get_server_pid()), + ) + if not ownership.is_empty(): + text += " · %s" % ownership + _server_label.text = text + + +## #838/#816 step 11: name which backend flavor the editor is riding. +## Diagnostic display only — never kill proof (external adoption clears PID +## authority, see server_lifecycle.gd::adopt_compatible_server / #669). +static func _server_ownership_tag(state: int, server_pid: int) -> String: + if state != ServerStateScript.READY: + return "" + return "plugin-managed backend" if server_pid > 0 else "externally adopted backend" + + +## "attach" when Configure writes a client-owned launch command for this +## client, "URL" when it writes the client's native URL entry. Derived from +## descriptor data so the tag can never disagree with what Configure does. +static func _client_transport_tag(client_id: String) -> String: + var client := ClientRegistry.get_by_id(client_id) + if client == null: + return "" + return "URL" if client.command_shape == Client.CommandShape.NONE else "attach" + + +# --- Telemetry setting persistence --- + + +## Returns true if GODOT_AI_DISABLE_TELEMETRY or DISABLE_TELEMETRY is set +## to a truthy value, false if either is set and non-truthy, null if neither +## env var is present at all. +func _is_telemetry_disabled_via_env() -> Variant: + if not (OS.has_environment("GODOT_AI_DISABLE_TELEMETRY") or OS.has_environment("DISABLE_TELEMETRY")): + return null + return McpSettings.env_truthy("GODOT_AI_DISABLE_TELEMETRY") or McpSettings.env_truthy("DISABLE_TELEMETRY") + + +## Reads the telemetry preference, applying env-var override when present. +## Initialises _telemetry_pending_enabled / _telemetry_saved_enabled and +## sets the checkbox state + locked tooltip. Call after _telemetry_toggle +## has been created. +func _load_telemetry_setting() -> void: + var es := EditorInterface.get_editor_settings() + var env_disabled = _is_telemetry_disabled_via_env() + + var enabled: bool + if env_disabled != null: + ## Env var present: resolve and save to EditorSettings so future sessions without + ## the env var honour the last-set value. + enabled = not bool(env_disabled) + if es != null: + es.set_setting(McpSettings.SETTING_TELEMETRY_ENABLED, enabled) + else: + ## No env var: read (or create) the EditorSettings key. + if es != null and es.has_setting(McpSettings.SETTING_TELEMETRY_ENABLED): + enabled = bool(es.get_setting(McpSettings.SETTING_TELEMETRY_ENABLED)) + else: + enabled = true + if es != null: + es.set_setting(McpSettings.SETTING_TELEMETRY_ENABLED, true) + + _telemetry_pending_enabled = enabled + _telemetry_saved_enabled = enabled + + if _telemetry_toggle == null: + return + _telemetry_toggle.set_pressed_no_signal(enabled) + if env_disabled != null: + _telemetry_toggle.disabled = true + _telemetry_toggle.tooltip_text = ( + "Telemetry is controlled by an environment variable " + + "(GODOT_AI_DISABLE_TELEMETRY / DISABLE_TELEMETRY)." + ) + else: + _telemetry_toggle.disabled = false + _telemetry_toggle.tooltip_text = "" + + +func _on_telemetry_toggled(pressed: bool) -> void: + _telemetry_pending_enabled = pressed + _refresh_tools_ui_state() + + +# --- Dev mode persistence --- + + +func _load_dev_mode() -> bool: + # Default OFF for every install (including dev checkouts). Contributors + # who want the extra diagnostic UI (Reload Plugin, MCP log + # panel, Start/Stop Dev Server) can flip the toggle once — editor + # settings persist across sessions. + var es := EditorInterface.get_editor_settings() + if es == null: + return false + if not es.has_setting(DEV_MODE_SETTING): + es.set_setting(DEV_MODE_SETTING, false) + return false + return bool(es.get_setting(DEV_MODE_SETTING)) + + +func _on_dev_mode_toggled(enabled: bool) -> void: + var es := EditorInterface.get_editor_settings() + if es != null: + es.set_setting(DEV_MODE_SETTING, enabled) + _apply_dev_mode_visibility() + _refresh_setup_status() + + +func _apply_dev_mode_visibility() -> void: + if _dev_mode_toggle == null: + return ## dock UI not built yet (unit tests, teardown window) + var dev := _dev_mode_toggle.button_pressed + _dev_section.visible = dev + if _log_viewer != null: + _log_viewer.visible = dev + # Setup section: visible in dev mode, OR in user mode when uv is missing + # (so users can install uv from the dock) — but not while the server + # launch is still settling (#744): mid-launch a red "uv: not found" row + # is usually a transient probe failure (#739) or irrelevant because the + # launch is succeeding via the .venv or system tiers. `_update_status` + # re-applies visibility on every status transition, so the section + # appears the moment the launch outcome makes it relevant. + var is_dev := ClientConfigurator.is_dev_checkout() + var uv_missing := not is_dev and ClientConfigurator.check_uv_version().is_empty() + _setup_section.visible = _setup_section_should_show(dev, uv_missing, _server_launch_pending()) + + +## Pure visibility decision for the Setup section (#744). Split out so the +## truth table is unit-testable without faking the uv probe or a dev +## checkout: dev toggle always shows the section; a missing uv only shows +## it once the server launch has settled. +static func _setup_section_should_show( + dev_toggle: bool, uv_missing: bool, launch_pending: bool +) -> bool: + return dev_toggle or (uv_missing and not launch_pending) + + +## True while the server launch outcome is still unknown: not connected, +## no terminal diagnosis yet, and the startup grace window ("Starting +## server…" in the status row) is still running. Mirrors the status-label +## logic in `_update_status` so the Setup section and the amber status +## text agree on what "still launching" means. +func _server_launch_pending() -> bool: + if _last_connected: + return false + var server_status: Dictionary = ( + _plugin.get_server_status() + if _plugin != null and _plugin.has_method("get_server_status") + else {} + ) + var state: int = int(server_status.get("state", ServerStateScript.UNINITIALIZED)) + if ServerStateScript.is_terminal_diagnosis(state): + return false + return Time.get_ticks_msec() < _startup_grace_until_msec + + +# --- Button handlers --- + + +func _do_plugin_reload() -> void: + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", false) + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", true) + + +func _on_reload_plugin() -> void: + # Persist a pending plugin_reload telemetry event *before* the + # disable kills the live WebSocket — the new plugin's _enter_tree + # flushes it via `_telemetry.flush_pending_plugin_reload()`. + Telemetry.record_pending_plugin_reload("dock_button") + # Defer the toggle so any in-flight input event finishes propagating + # before the dock (and its Window children) leave the tree. Calling + # set_plugin_enabled synchronously from a button press frees the + # viewport mid-dispatch. + _do_plugin_reload.call_deferred() + + +## Setup-section "Server" row: always report the TRUE running server +## version (from the handshake_ack) rather than the plugin's expected +## version, and highlight the mismatch so self-update drift is visible +## at a glance instead of silently masked by a green label. +## +## Render states, keyed off live version metadata: +## - empty (pre-ack): show the expected version only as an unverified target +## - matches plugin: show it green, no Restart button +## - dev mismatch: show amber with an explicit dev marker +## - release mismatch: show actual vs expected; only surface Restart when the +## plugin has ownership proof for the process +func _refresh_server_version_label(server_status: Dictionary = {}) -> void: + if _setup_server_label == null: + return + var plugin_ver := ClientConfigurator.get_plugin_version() + if server_status.is_empty(): + ## Re-fetch only when called outside `_update_status`'s frame + ## (e.g. from `_apply_new_port`, `_on_restart_*`). Inside the + ## per-frame loop, the caller threads its cached snapshot through + ## so we don't allocate a fresh Dictionary every frame. + server_status = ( + _plugin.get_server_status() + if _plugin != null and _plugin.has_method("get_server_status") + else {} + ) + var server_ver: String = _connection.server_version if _connection != null else "" + if server_ver.is_empty(): + server_ver = str(server_status.get("actual_version", "")) + var expected_ver := str(server_status.get("expected_version", "")) + if expected_ver.is_empty(): + expected_ver = plugin_ver + var state: int = int(server_status.get("state", ServerStateScript.UNINITIALIZED)) + if _server_restart_in_progress and ( + server_ver == expected_ver + or ( + ServerStateScript.is_terminal_diagnosis(state) + and state != ServerStateScript.INCOMPATIBLE + ) + ): + _server_restart_in_progress = false + var text: String + var color: Color + var show_restart := false + if _server_restart_in_progress: + text = "restarting server..." + color = COLOR_AMBER + show_restart = true + elif server_ver.is_empty(): + text = "checking live version (expected godot-ai == %s)" % expected_ver + color = COLOR_MUTED + elif server_ver == expected_ver: + text = "godot-ai == %s" % server_ver + color = Color.GREEN + else: + text = "godot-ai == %s (expected %s)" % [server_ver, expected_ver] + var is_incompatible: bool = state == ServerStateScript.INCOMPATIBLE + color = Color.RED if is_incompatible else COLOR_AMBER + var has_managed_proof: bool = ( + _plugin != null + and _plugin.has_method("can_restart_managed_server") + and _plugin.can_restart_managed_server() + ) + var can_recover: bool = bool(server_status.get("can_recover_incompatible", false)) + show_restart = ( + (not is_incompatible and has_managed_proof) + ## Recoverable incompatible servers get the primary action in + ## the top error panel. Duplicating it in Setup made the UI + ## look like it had multiple restart paths. + or (is_incompatible and can_recover and _crash_restart_btn == null) + ) + if text == _last_rendered_server_text: + _setup_server_label.add_theme_color_override("font_color", color) + _update_restart_button(show_restart) + return + _last_rendered_server_text = text + _setup_server_label.text = text + _setup_server_label.add_theme_color_override("font_color", color) + _update_restart_button(show_restart) + + +func _update_restart_button(visible: bool) -> void: + if _version_restart_btn != null: + _version_restart_btn.visible = visible + _version_restart_btn.disabled = _server_restart_in_progress + _version_restart_btn.text = "Restarting..." if _server_restart_in_progress else "Restart" + if _crash_restart_btn != null: + _crash_restart_btn.disabled = _server_restart_in_progress + _crash_restart_btn.text = "Restarting..." if _server_restart_in_progress else "Restart Server" + + +func _on_restart_stale_server() -> void: + if _plugin == null or _server_restart_in_progress: + return + _server_restart_in_progress = true + _last_rendered_server_text = "" + _refresh_server_version_label() + if not is_inside_tree(): + await _dispatch_stale_server_restart() + _server_restart_in_progress = false + _last_rendered_server_text = "" + _refresh_server_version_label() + return + call_deferred("_restart_stale_server_after_feedback") + + +func _restart_stale_server_after_feedback() -> void: + await get_tree().create_timer(0.15).timeout + if not await _dispatch_stale_server_restart(): + _server_restart_in_progress = false + _last_rendered_server_text = "" + _refresh_server_version_label() + + +func _dispatch_stale_server_restart() -> bool: + if _plugin == null: + return false + var status: Dictionary = ( + _plugin.get_server_status() + if _plugin.has_method("get_server_status") + else {} + ) + if int(status.get("state", ServerStateScript.UNINITIALIZED)) == ServerStateScript.INCOMPATIBLE: + if _plugin.has_method("recover_incompatible_server"): + ## Coroutine in production (#678): recovery reports success only + ## after the respawn walk completes and the connection unblocks. + return bool(await _plugin.recover_incompatible_server()) + elif _plugin.has_method("force_restart_server"): + _plugin.force_restart_server() + return true + return false + + +# --- Setup section --- + +## #739: a `uvx --version` probe that failed once at editor startup used +## to pin "uv: not found" for the whole session — the Install-uv click +## was the only invalidation path, so the fix users discovered was +## re-clicking Install on every launch. Re-probe on events that suggest +## the failure was transient (server-connect transition, manual Refresh). +## No-op once uv has been found, so this costs nothing in the healthy +## steady state; when uv is genuinely absent, the re-probe is a fast +## negative (CliFinder's well-known-dir walk plus one bounded `where`). +## Runs on the main thread like the initial probe — same wall-clock +## bound, and the triggering events are rare (once per connect / click). +## +## Callers go through _schedule_uv_reprobe() rather than calling this +## inline: the cache-miss probe shells out (bounded at 3s) on the +## calling thread, and both call sites sit mid-flow in UI handlers — +## the connect transition wants its status-label writes committed +## first, and the Refresh click wants the client sweep dispatched +## without waiting on the probe. Same deferred convention as +## _on_install_uv. (The deferred queue still flushes on the main +## thread, so a worst-case 3s probe delays that frame — acceptable for +## a rare, bounded event; a worker thread would be the heavier cure.) +func _schedule_uv_reprobe() -> void: + _reprobe_uv_if_negative.call_deferred() + + +func _reprobe_uv_if_negative() -> void: + if not ClientConfigurator.uv_probe_negative(): + return + ClientConfigurator.invalidate_uv_detection() + _refresh_setup_status() + _apply_dev_mode_visibility() + + +func _refresh_setup_status() -> void: + if _setup_container == null: + return + for child in _setup_container.get_children(): + child.queue_free() + _dev_primary_btn = null + _dev_stop_btn = null + + var is_dev := ClientConfigurator.is_dev_checkout() + if is_dev: + _setup_container.add_child(_make_status_row("Mode", "Dev (venv)", Color.CYAN)) + + var btn_row := HBoxContainer.new() + btn_row.add_theme_constant_override("separation", 4) + btn_row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + + _dev_primary_btn = Button.new() + _dev_primary_btn.text = "Restart Dev Server" + _dev_primary_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _dev_primary_btn.pressed.connect(_on_dev_primary_pressed) + btn_row.add_child(_dev_primary_btn) + + _dev_stop_btn = Button.new() + _dev_stop_btn.text = "✕" + _dev_stop_btn.tooltip_text = "Stop the dev server without spawning a replacement." + _dev_stop_btn.pressed.connect(_on_dev_stop_pressed) + btn_row.add_child(_dev_stop_btn) + + _setup_container.add_child(btn_row) + _update_dev_section_buttons() + return + + # User mode — check for uv + var uv_version := ClientConfigurator.check_uv_version() + if not uv_version.is_empty(): + var compact_uv_version := _compact_uv_version_text(uv_version) + var uv_tooltip := uv_version if compact_uv_version != uv_version else "" + _setup_container.add_child(_make_status_row("uv", compact_uv_version, Color.GREEN, uv_tooltip)) + ## Build the Server row with a placeholder label we can update every + ## frame. `_refresh_server_version_label` replaces the text + color + ## once `McpConnection.server_version` lands via `handshake_ack`, and + ## flips to amber + "(plugin X)" on drift. Pre-ack we show the + ## plugin's expected version so the row isn't blank. + var server_row := HBoxContainer.new() + server_row.add_theme_constant_override("separation", 8) + var key_label := Label.new() + key_label.text = "Server" + key_label.add_theme_color_override("font_color", COLOR_MUTED) + key_label.custom_minimum_size = Vector2(60, 0) + server_row.add_child(key_label) + _setup_server_label = Label.new() + _setup_server_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + server_row.add_child(_setup_server_label) + _version_restart_btn = Button.new() + _version_restart_btn.text = "Restart" + _version_restart_btn.tooltip_text = "Kill the server on port %d and respawn with the plugin's bundled version" % ClientConfigurator.http_port() + _version_restart_btn.pressed.connect(_on_restart_stale_server) + _version_restart_btn.visible = false + server_row.add_child(_version_restart_btn) + _setup_container.add_child(server_row) + _last_rendered_server_text = "" + _refresh_server_version_label() + else: + _setup_container.add_child(_make_status_row("uv", "not found", Color.RED)) + var install_btn := Button.new() + install_btn.text = "How to install uv" + install_btn.tooltip_text = ( + "Opens the official uv installation docs. Godot AI deliberately does " + + "not run the installer for you — see _on_install_uv." + ) + install_btn.pressed.connect(_on_install_uv) + _setup_container.add_child(install_btn) + + +func _install_mode_text() -> String: + if ClientConfigurator.is_dev_checkout(): + return "Install: dev checkout — update via git pull" + return "Install: v%s" % ClientConfigurator.get_plugin_version() + + +func _install_mode_tooltip() -> String: + if not ClientConfigurator.is_dev_checkout(): + return "Plugin installed from a release ZIP, Asset Library, or source copy. Update button in this dock downloads the latest GitHub release." + var target := _resolve_plugin_symlink_target() + if target.is_empty(): + return "Plugin source tree resolved via local .venv — press Reload Plugin after editing." + return "Plugin source: %s\nPress Reload Plugin after editing." % target + + +func _resolve_plugin_symlink_target() -> String: + var logical := ProjectSettings.globalize_path("res://addons/godot_ai").rstrip("/").rstrip("\\") + var resolved := ClientConfigurator.resolve_addons_realpath() + if resolved.is_empty() or resolved == logical: + return "" + return resolved + + +static func _compact_uv_version_text(uv_version: String) -> String: + var text := uv_version.strip_edges() + if text.ends_with(")"): + var metadata_start := text.rfind(" (") + if metadata_start >= 0: + return text.substr(0, metadata_start).strip_edges() + return text + + +func _make_status_row( + label_text: String, + value_text: String, + value_color: Color, + tooltip_text: String = "" +) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 6) + if not tooltip_text.is_empty(): + row.tooltip_text = tooltip_text + + var label := Label.new() + label.text = label_text + label.add_theme_color_override("font_color", COLOR_MUTED) + label.custom_minimum_size.x = 60 + if not tooltip_text.is_empty(): + label.tooltip_text = tooltip_text + row.add_child(label) + + var value := Label.new() + value.text = value_text + value.add_theme_color_override("font_color", value_color) + if not tooltip_text.is_empty(): + value.tooltip_text = tooltip_text + row.add_child(value) + + return row + + +## Pure helper for the primary "Restart Dev Server" button. Always enabled +## (clicking with nothing running just spawns fresh); tooltip adapts to +## whether a kill+respawn or fresh spawn is what'll happen. +static func _dev_primary_btn_state(has_managed: bool, dev_running: bool) -> Dictionary: + var port := ClientConfigurator.http_port() + if has_managed or dev_running: + return { + "text": "Restart Dev Server", + "tooltip": ( + "Kill the server on port %d and start a fresh --reload dev server. " + + "Use this to pick up Python source changes that don't bump the version." + ) % port, + } + return { + "text": "Start Dev Server", + "tooltip": "Spawn a --reload dev server on port %d. Auto-restarts when you edit Python sources." % port, + } + + +## Pure helper for the small "✕" stop button — only enabled when a dev +## server is actually running. Stops without respawning; intentionally +## never targets a managed server (that's the lifecycle's responsibility). +static func _dev_stop_btn_state(dev_running: bool) -> Dictionary: + if dev_running: + return {"enabled": true, "tooltip": "Stop the dev server without spawning a replacement."} + return {"enabled": false, "tooltip": "No --reload dev server to stop."} + + +func _on_dev_primary_pressed() -> void: + if _plugin == null or _server_restart_in_progress: + return + if not _plugin.has_method("force_restart_or_start_dev_server"): + return + if _plugin.has_method("record_dev_server_toggle"): + _plugin.record_dev_server_toggle("start") + _server_restart_in_progress = true + _update_dev_section_buttons() + if not is_inside_tree(): + ## Test path — no scene tree means no timer; run synchronously + ## so suite assertions see the dispatch without `await`. + _plugin.force_restart_or_start_dev_server() + _server_restart_in_progress = false + return + call_deferred("_perform_dev_restart_after_feedback") + + +func _on_dev_stop_pressed() -> void: + if _plugin == null: + return + if _plugin.has_method("stop_dev_server"): + _plugin.stop_dev_server() + if _plugin.has_method("record_dev_server_toggle"): + _plugin.record_dev_server_toggle("stop") + _update_dev_section_buttons.call_deferred() + + +func _perform_dev_restart_after_feedback() -> void: + ## Brief paint cycle so the user sees "Restarting..." before the + ## blocking _wait_for_port_free freezes the editor for up to 5s. + await get_tree().create_timer(0.15).timeout + ## Re-check has_method post-await — a self-update mixed-state window + ## could swap _plugin's script class while we were sleeping, leaving + ## the old reference pointing at a class that no longer carries the + ## new method. Same #168 guard pattern as _update_dev_section_buttons. + if _plugin != null and _plugin.has_method("force_restart_or_start_dev_server"): + _plugin.force_restart_or_start_dev_server() + ## start_dev_server's spawn happens via a 0.5s SceneTree timer; give + ## it time to land plus a buffer for the WS reconnect before clearing + ## the busy state. The unconditional clear matches sibling restart + ## buttons — overshoot is fine because subsequent _update_status calls + ## refresh the button against live plugin state. + await get_tree().create_timer(2.0).timeout + _server_restart_in_progress = false + _update_dev_section_buttons() + + +## Single-scan refresh of every dev-section button state. Both buttons +## key off the same `has_managed_server` / `is_dev_server_running` pair, +## and the latter scrapes lsof/ps — so doing the discovery once and +## applying to both avoids the duplicate subprocess fork on every +## connection-state transition. +func _update_dev_section_buttons() -> void: + if _plugin == null: + return + if not (_plugin.has_method("has_managed_server") and _plugin.has_method("is_dev_server_running")): + return + var has_managed: bool = _plugin.has_managed_server() + var dev_running: bool = _plugin.is_dev_server_running() + if _dev_primary_btn != null: + if _server_restart_in_progress: + _dev_primary_btn.disabled = true + _dev_primary_btn.text = "Restarting..." + _dev_primary_btn.tooltip_text = "Killing the current server and respawning..." + else: + var primary_state := _dev_primary_btn_state(has_managed, dev_running) + _dev_primary_btn.disabled = false + _dev_primary_btn.text = primary_state["text"] + _dev_primary_btn.tooltip_text = primary_state["tooltip"] + if _dev_stop_btn != null: + var stop_state := _dev_stop_btn_state(dev_running) + _dev_stop_btn.disabled = (not stop_state["enabled"]) or _server_restart_in_progress + _dev_stop_btn.tooltip_text = stop_state["tooltip"] + + +func _client_status_refresh_has_completed() -> bool: + return _last_client_status_refresh_completed_msec > 0 + + +func _connected_status_text() -> String: + return "Server connected" + + +static func _transport_status_text(snapshot: Dictionary) -> String: + ## Total over the transport enum for isolated consumers/tests. The dock's + ## connected fast path renders `_connected_status_text()` before calling it. + var phase := str(snapshot.get("phase", "")) + var attempt := maxi(1, int(snapshot.get("attempt", 0))) + match phase: + "connected": + return "Server connected" + "connecting": + return "Connecting — attempt %d" % attempt + "retrying": + var retry_in_sec := ceili(maxf(0.0, float(snapshot.get("retry_in_sec", 0.0)))) + return "Retrying in %ds — attempt %d" % [retry_in_sec, attempt] + "closing": + return "Disconnecting…" + "blocked": + return "Connection blocked" + return "Disconnected" + + +## Open uv's official install documentation rather than executing an +## installer on the user's behalf. +## +## This used to shell out to `curl -LsSf https://astral.sh/uv/install.sh | sh` +## (and the PowerShell `irm … | iex` equivalent). That is arbitrary remote +## code execution as the editor user, one dock click deep, with no version +## pin, no checksum, and no signature — while this same plugin verifies its +## OWN updates with an RSA-4096 signature over a SHA-256 sidecar, pinned to a +## GitHub host and this repo's release-asset path. Holding a third-party +## installer to a weaker standard than our own payload is the wrong trade, +## and pinning a digest here would only cover the bootstrap script, not the +## uv binary it goes on to fetch. +## +## Opening the docs keeps the discovery value of the button (the user still +## learns uv is missing and how to get it) while leaving the decision to +## install — and the choice of install method — with the user. Mirrors the +## dock's existing "Run this manually" fallback for client CLIs. +func _on_install_uv() -> void: + OS.shell_open(UV_INSTALL_DOCS_URL) + ## Drop the cached uvx path AND the cached `uvx --version` so that once + ## the user has installed uv (in a terminal, from the docs we just + ## opened), the dock finds the new binary instead of replaying the + ## cached "not found" result for the rest of the session. + ## Routing through the configurator matters on Windows, where the + ## CLI-finder cache key is `uvx.exe` — invalidating just `"uvx"` + ## would leave the cache stale and the dock would keep showing + ## "uv: not found" for the rest of the session. + ClientConfigurator.invalidate_uv_detection() + ## Deliberately do NOT refresh here. `OS.shell_open` returns as soon as + ## the browser is handed the URL, so an immediate refresh would run long + ## before the user could install anything and would simply re-cache + ## "not found" — undoing the invalidation above. (The old shell-out was + ## a blocking `OS.execute`, so refreshing straight after it was correct + ## then; it stopped being correct when the installer call went away.) + ## Re-probe when the editor regains focus instead — see _notification. + _uv_recheck_pending = true + + +# --- Client section --- + +func _on_configure_client(client_id: String) -> void: + if _server_blocks_client_health(): + _apply_row_status(client_id, Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return + _dispatch_client_action(client_id, "configure") + + +func _on_remove_client(client_id: String) -> void: + _dispatch_client_action(client_id, "remove") + + +## Spawn a worker thread for Configure / Remove so a hung CLI can't lock +## the editor (issue #239). The action verbs are: "configure" → calls +## `ClientConfigurator.configure`; "remove" → calls +## `ClientConfigurator.remove`. Both routes shell out to the per-client +## CLI via `McpCliExec.run`, which is wall-clock-bounded. +## +## Per-row in-flight rules: +## - One worker at a time per client (the row's slot). +## - Both buttons disabled while the slot is busy — prevents a +## double-click queueing a stale Configure on top of a still-running +## Remove. +## - The dot turns amber and the row label gets a "Configuring…" / +## "Removing…" suffix so the user can see the click was registered. +func _dispatch_client_action(client_id: String, action: String) -> void: + if _is_self_update_in_progress(): + ## Same gate as the refresh worker — the install window overwrites + ## plugin scripts on disk, and a worker mid-call into them would + ## SIGABRT in `GDScriptFunction::call`. See `_update_manager`. + return + if _client_action_threads.has(client_id): + return + ## An abandoned-but-still-running worker owns this row's config file just + ## as much as a tracked one does. Defensive: `_abandon_client_action_thread` + ## already leaves the buttons disabled in that state. + if _has_live_orphan(client_id): + return + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + + ## Drop any phase left behind by a previous action on this row — a + ## generation-mismatch or shutdown return can skip the normal finalize, + ## and a stale phase would suppress the label for this new action. + _clear_client_action_phase(client_id) + _set_client_action_cancel_requested(client_id, false) + _set_row_action_in_flight(client_id, action) + ## Snapshot `server_url` on main: `http_url()` reads + ## `EditorInterface.get_editor_settings()`, which is main-thread-only. + ## The status-refresh worker uses the same pattern — see + ## `_perform_initial_client_status_refresh` and + ## `_request_client_status_refresh`. + var launch_context := ClientConfigurator.capture_launch_context() + var server_url := ClientConfigurator.server_url_from(launch_context) + ## #691: refresh the env snapshot on main before this worker starts — + ## configure/remove resolve CLI + config paths off-thread and must not + ## race a concurrent spawn window's setenv/unsetenv. + ClientConfigurator.warm_env_snapshot() + var generation := int(_client_action_generations.get(client_id, 0)) + 1 + _client_action_generations[client_id] = generation + var thread := Thread.new() + _client_action_threads[client_id] = thread + _client_action_started_msec[client_id] = Time.get_ticks_msec() + _client_action_names[client_id] = action + var err := thread.start( + Callable(self, "_run_client_action_worker").bind( + client_id, action, server_url, launch_context, generation + ) + ) + if err != OK: + _client_action_threads.erase(client_id) + _client_action_started_msec.erase(client_id) + _client_action_names.erase(client_id) + _finalize_action_buttons(client_id) + _apply_row_status(client_id, Client.Status.ERROR, "couldn't start worker thread") + _refresh_clients_summary() + + +func _run_client_action_worker( + client_id: String, + action: String, + server_url: String, + launch_context: Dictionary, + generation: int, +) -> Dictionary: + var result: Dictionary + var prewarm: Dictionary = {} + if action == "remove": + result = ClientConfigurator.remove(client_id, server_url, launch_context) + else: + result = ClientConfigurator.configure(client_id, server_url, launch_context) + ## #851: the entry we just wrote pins an exact `godot-ai==X`. If uv has + ## never built that environment, the FIRST client spawn builds it — + ## ~67 packages — which is what flashes a terminal window on Windows + ## and what can push a bridge spawn past the MCP client's default 30s + ## connect timeout, so the tools appear to vanish. Pay that cost here, + ## on a deliberate click the dock can label, instead of on the client's + ## critical path. + ## + ## Best-effort: the config file is already written and correct. A + ## failed or timed-out warm only means the next launch pays the cold + ## cost it always used to, so `result` is deliberately left untouched. + if result.get("status") == "ok": + _set_client_action_phase(client_id, _PHASE_PREWARM) + prewarm = ClientConfigurator.prewarm_attach_launch( + launch_context, + ClientConfigurator.PREWARM_TIMEOUT_MS, + {}, + Callable(self, "_is_client_action_cancel_requested").bind(client_id), + ) + return { + "client_id": client_id, + "action": action, + "result": result, + "prewarm": prewarm, + "generation": generation, + } + + +func _poll_completed_client_action_threads() -> void: + for client_id in _client_action_threads.keys(): + var thread: Thread = _client_action_threads[client_id] + if thread == null: + continue + if thread.is_alive(): + _apply_client_action_phase(String(client_id)) + continue + var payload: Variant = thread.wait_to_finish() + _client_action_threads[client_id] = null + if payload is Dictionary: + var data := payload as Dictionary + var result: Dictionary = data.get("result", {}) + _report_prewarm_outcome( + String(data.get("client_id", client_id)), data.get("prewarm", {}) + ) + _apply_client_action_result( + String(data.get("client_id", client_id)), + String(data.get("action", _client_action_names.get(client_id, "configure"))), + result, + int(data.get("generation", _client_action_generations.get(client_id, 0))) + ) + else: + _apply_client_action_result( + String(client_id), + String(_client_action_names.get(client_id, "configure")), + {"status": "error", "message": "worker returned no result"}, + int(_client_action_generations.get(client_id, 0)) + ) + + +func _apply_client_action_result(client_id: String, action: String, result: Dictionary, generation: int) -> void: + if int(_client_action_generations.get(client_id, 0)) != generation: + if _client_action_threads.get(client_id, null) == null: + _client_action_threads.erase(client_id) + _client_action_started_msec.erase(client_id) + _client_action_names.erase(client_id) + return + if _refresh_state == ClientRefreshStateScript.SHUTTING_DOWN: + return + if _client_action_threads.has(client_id): + var t: Thread = _client_action_threads[client_id] + if t != null: + t.wait_to_finish() + _client_action_threads.erase(client_id) + _client_action_started_msec.erase(client_id) + _client_action_names.erase(client_id) + _clear_client_action_phase(client_id) + _finalize_action_buttons(client_id) + if _server_blocks_client_health(): + _apply_row_status(client_id, Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return + + var success_status := Client.Status.NOT_CONFIGURED if action == "remove" else Client.Status.CONFIGURED + if result.get("status") == "ok": + ## #877: Remove targets only the selected scope, so a configure is the + ## only action with an all-scope sweep to disclose. The manual panel + ## that lists those removes is shown on the failure path below, which + ## left the success path — where the sweep actually ran — silent. + var sweep_note := ( + ClientConfigurator.configure_sweep_note(client_id) if action == "configure" else "" + ) + _apply_row_status(client_id, success_status, sweep_note) + var row: Dictionary = _client_rows.get(client_id, {}) + if not row.is_empty(): + (row["manual_panel"] as VBoxContainer).visible = false + else: + _apply_row_status(client_id, Client.Status.ERROR, str(result.get("message", "failed"))) + if action == "configure": + _show_manual_command_for(client_id) + _refresh_clients_summary() + + +## Phase label for the Configure worker's pre-warm step. The config write +## itself is fast; building the pinned uv environment is the part that can +## run for tens of seconds, so it gets its own label rather than sitting +## under a motionless "Configuring…". +const _PHASE_PREWARM := "prewarm" + +## Worker-written, main-read. `Dictionary` writes are not atomic across +## threads, so both sides take the mutex — the same discipline `CliFinder` +## uses for its cache. Held only across the dictionary access, never across +## the subprocess, so the main thread can never block on uv. +var _client_action_phase_mutex := Mutex.new() +var _client_action_phases: Dictionary = {} +## Rows whose button text already reflects their phase, so the per-frame poll +## rewrites the label once instead of on every frame. +var _client_action_phase_shown: Dictionary = {} + + +## Thread-safe cancellation state read by McpCliExec's 50ms poll loop. +func _set_client_action_cancel_requested(client_id: String, requested: bool) -> void: + _client_action_cancel_mutex.lock() + if requested: + _client_action_cancelled_clients[client_id] = true + else: + _client_action_cancelled_clients.erase(client_id) + _client_action_cancel_mutex.unlock() + + +func _is_client_action_cancel_requested(client_id: String) -> bool: + _client_action_cancel_mutex.lock() + var requested := bool(_client_action_cancelled_clients.get(client_id, false)) + _client_action_cancel_mutex.unlock() + return requested + + +func _set_client_action_phase(client_id: String, phase: String) -> void: + _client_action_phase_mutex.lock() + _client_action_phases[client_id] = phase + _client_action_phase_mutex.unlock() + + +func _read_client_action_phase(client_id: String) -> String: + _client_action_phase_mutex.lock() + var phase := String(_client_action_phases.get(client_id, "")) + _client_action_phase_mutex.unlock() + return phase + + +func _clear_client_action_phase(client_id: String) -> void: + _client_action_phase_mutex.lock() + _client_action_phases.erase(client_id) + _client_action_phase_mutex.unlock() + _client_action_phase_shown.erase(client_id) + + +## Per-frame, for a still-running worker: promote the button label when the +## worker reports it has moved on to warming the package environment. Keeps +## the dock honest about why Configure is taking a while — otherwise a cold +## uv build looks like a hang. +func _apply_client_action_phase(client_id: String) -> void: + if _read_client_action_phase(client_id) != _PHASE_PREWARM: + return + if _client_action_phase_shown.get(client_id, "") == _PHASE_PREWARM: + return + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + _client_action_phase_shown[client_id] = _PHASE_PREWARM + (row["configure_btn"] as Button).text = "Installing…" + + +## One line per Configure so a cold build is attributable after the fact — +## the dock label is transient, and #851's symptom (a terminal window on +## Windows) is easiest to correlate against a timestamped log entry. Silent +## on the skip paths: a dev-venv/system tier having no env to warm is the +## normal case, not news. +func _report_prewarm_outcome(client_id: String, prewarm: Variant) -> void: + if not (prewarm is Dictionary): + return + var data := prewarm as Dictionary + if data.is_empty() or bool(data.get("skipped", false)): + return + if bool(data.get("timed_out", false)): + print( + "MCP | %s: package pre-warm timed out; the first client launch will build the environment" + % client_id + ) + return + if int(data.get("exit_code", -1)) != 0: + print( + "MCP | %s: package pre-warm failed (exit %d); the first client launch will build the environment" + % [client_id, int(data.get("exit_code", -1))] + ) + return + print("MCP | %s: package environment pre-warmed" % client_id) + + +## In-flight visual: rewrite the verb onto the button the user just +## clicked ("Configuring…" / "Removing…") so the feedback lands where +## their attention already is. Don't pollute the row label — that'd +## clobber any drift hint ("URL out of date") still relevant to the row. +## The dot turns amber so the row reads as "busy" at a glance, not as +## green (premature success) or red (premature failure). Both buttons +## go disabled so a double-click or second action can't queue stale +## work behind the in-flight worker. +func _set_row_action_in_flight(client_id: String, action: String) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + var configure_btn: Button = row["configure_btn"] + var remove_btn: Button = row["remove_btn"] + configure_btn.disabled = true + remove_btn.disabled = true + if action == "remove": + remove_btn.text = "Removing…" + else: + configure_btn.text = "Configuring…" + (row["dot"] as ColorRect).color = COLOR_AMBER + + +## Re-enable both buttons and reset their text back to canonical labels. +## `_apply_row_status` sets `configure_btn.text` per the resulting +## Status (Configure / Reconfigure / Retry), so we only need to reset +## `remove_btn.text` here — its sibling visibility toggle already +## handles whether to show it at all. +func _finalize_action_buttons(client_id: String) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + (row["configure_btn"] as Button).disabled = false + var remove_btn: Button = row["remove_btn"] + remove_btn.disabled = false + remove_btn.text = "Remove" + + +func _on_refresh_clients_pressed() -> void: + ## Explicit user action — also give a failed uv probe another chance + ## (#739), mirroring how the same click already re-sweeps client CLIs. + _schedule_uv_reprobe() + _request_client_status_refresh(true) + + +func _on_configure_all_clients() -> void: + if _server_blocks_client_health(): + for client_id in _client_rows: + _apply_row_status(String(client_id), Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return + if ClientRefreshStateScript.should_disable_client_actions(_refresh_state): + return + for client_id in _client_rows: + var status: Client.Status = _client_rows[client_id].get("status", Client.Status.NOT_CONFIGURED) + if status == Client.Status.CONFIGURED: + continue + _on_configure_client(String(client_id)) + _refresh_clients_summary() + + +func _on_open_clients_window() -> void: + if _clients_window == null: + return + ## Re-sweep before the user has time to act on stale dot colors. The request + ## is async/stale-while-refreshing so the popup paints immediately with + ## last-known state; the fresh colors land when the background worker returns. + ## This is an explicit user action, so it bypasses the focus-in cooldown. + _request_client_status_refresh(true) + ## Also re-sync the Tools tab from the persisted setting — another + ## editor instance (or a hand-edit of editor_settings-4.tres) may have + ## changed the excluded list while the window was closed. + _reset_tools_pending_from_setting() + _refresh_tools_ui_state() + if vision_routing != null: + vision_routing.refresh_ui() + # popup_centered() with a minsize forces the window to that size and + # centers on the parent viewport. Setting .size on a hidden Window + # doesn't always take effect, so we force it at popup time here. + _clients_window.popup_centered(Vector2i(640, 600)) + + +func _settings_are_dirty() -> bool: + return ( + _tools_pending_excluded != _tools_saved_excluded + or _telemetry_pending_enabled != _telemetry_saved_enabled + or _allow_hosts_is_dirty() + ) + + +func _on_clients_window_close_requested() -> void: + if _clients_window == null: + return + ## If the user has unapplied settings, a close would silently throw the + ## pending state away. Prompt before discarding current options and if + ## they confirm, reset pending → saved so the window shows the persisted + ## state the next time they open it. + if _settings_are_dirty(): + _show_tools_close_confirm() + return + _clients_window.hide() + + +# --- Tools tab (domain exclusion) --- + +func _build_tools_tab(tabs: TabContainer) -> void: + ## Tab 2 — domain-exclusion checkboxes. Rendered once, on dock construction. + ## `_reset_tools_pending_from_setting()` re-syncs checkbox state from the + ## saved setting each time the window opens. + var tools_tab := VBoxContainer.new() + tools_tab.add_theme_constant_override("separation", 8) + var tools_margin := _build_margin_container() + tools_margin.name = "Tools" + tools_margin.add_child(tools_tab) + tabs.add_child(tools_margin) + + var intro := Label.new() + intro.text = ( + "Some MCP clients cap tools per connection (Antigravity: 100). " + + "Uncheck a domain to drop its non-core tools from this server. " + + "Core tools stay on. Changes require a server restart." + ) + intro.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + intro.add_theme_color_override("font_color", COLOR_MUTED) + intro.size_flags_horizontal = Control.SIZE_EXPAND_FILL + tools_tab.add_child(intro) + + var count_row := HBoxContainer.new() + count_row.add_theme_constant_override("separation", 8) + var count_header := Label.new() + count_header.text = "Tools Enabled:" + count_header.add_theme_color_override("font_color", COLOR_MUTED) + count_row.add_child(count_header) + _tools_count_label = Label.new() + _tools_count_label.add_theme_font_size_override("font_size", 15) + count_row.add_child(_tools_count_label) + _tools_dirty_warning = Label.new() + _tools_dirty_warning.add_theme_color_override("font_color", COLOR_AMBER) + _tools_dirty_warning.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _tools_dirty_warning.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + _tools_dirty_warning.visible = false + _tools_dirty_warning.text = "Unapplied changes" + count_row.add_child(_tools_dirty_warning) + tools_tab.add_child(count_row) + + tools_tab.add_child(HSeparator.new()) + + var scroll := ScrollContainer.new() + scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL + scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + tools_tab.add_child(scroll) + + var grid := VBoxContainer.new() + grid.add_theme_constant_override("separation", 4) + grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL + scroll.add_child(grid) + + ## Core pseudo-row — disabled checkbox, always checked. Shows the 5 + ## always-loaded tools as a single line item so the user can see where + ## their baseline tool budget goes without listing individual core names + ## inline (tooltip has them). + var core_row := HBoxContainer.new() + core_row.add_theme_constant_override("separation", 8) + var core_chk := CheckBox.new() + core_chk.button_pressed = true + core_chk.disabled = true + core_chk.focus_mode = Control.FOCUS_NONE + core_row.add_child(core_chk) + var core_label := Label.new() + core_label.text = "Core (always on)" + core_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + core_row.add_child(core_label) + var core_count := Label.new() + core_count.text = "%d tools" % (ToolCatalog.CORE_TOOLS.size() + ToolCatalog.ALWAYS_ON_TOOLS.size()) + core_count.add_theme_color_override("font_color", COLOR_MUTED) + core_row.add_child(core_count) + core_row.tooltip_text = "%s · always on: %s" % [ + ", ".join(ToolCatalog.CORE_TOOLS), + ", ".join(ToolCatalog.ALWAYS_ON_TOOLS), + ] + grid.add_child(core_row) + + grid.add_child(HSeparator.new()) + + _tools_domain_checkboxes.clear() + for entry in ToolCatalog.DOMAINS: + _build_tools_domain_row(grid, entry) + + ## Custom (addon-registered) tools — unlike the domain rows above, + ## toggles apply LIVE: the registry re-pushes the filtered catalog to + ## the server on every change, no restart needed. + grid.add_child(HSeparator.new()) + var custom_header_row := HBoxContainer.new() + custom_header_row.add_theme_constant_override("separation", 8) + var custom_header := Label.new() + custom_header.text = "Custom tools (addon-registered)" + custom_header.size_flags_horizontal = Control.SIZE_EXPAND_FILL + custom_header_row.add_child(custom_header) + _custom_tools_count_label = Label.new() + _custom_tools_count_label.add_theme_color_override("font_color", COLOR_MUTED) + custom_header_row.add_child(_custom_tools_count_label) + grid.add_child(custom_header_row) + var custom_hint := Label.new() + custom_hint.text = "Applies immediately — disabled tools are hidden from agents and rejected if called." + custom_hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + custom_hint.add_theme_color_override("font_color", COLOR_MUTED) + custom_hint.size_flags_horizontal = Control.SIZE_EXPAND_FILL + grid.add_child(custom_hint) + _custom_tools_list = VBoxContainer.new() + _custom_tools_list.add_theme_constant_override("separation", 4) + _custom_tools_list.size_flags_horizontal = Control.SIZE_EXPAND_FILL + grid.add_child(_custom_tools_list) + _connect_custom_tool_registry() + _refresh_custom_tools_rows() + + tools_tab.add_child(HSeparator.new()) + + var telemetry_row := HBoxContainer.new() + telemetry_row.add_theme_constant_override("separation", 8) + var telemetry_label := Label.new() + telemetry_label.text = "Telemetry" + telemetry_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + telemetry_row.add_child(telemetry_label) + _telemetry_toggle = CheckButton.new() + _telemetry_toggle.toggled.connect(_on_telemetry_toggled) + telemetry_row.add_child(_telemetry_toggle) + tools_tab.add_child(telemetry_row) + + tools_tab.add_child(HSeparator.new()) + + var footer := HBoxContainer.new() + footer.add_theme_constant_override("separation", 8) + + _tools_apply_btn = Button.new() + _tools_apply_btn.text = "Apply and Restart Server" + _tools_apply_btn.tooltip_text = "Save the excluded list to Editor Settings and reload the plugin so the server respawns with --exclude-domains." + _tools_apply_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _tools_apply_btn.pressed.connect(_on_tools_apply) + footer.add_child(_tools_apply_btn) + + _tools_reset_btn = Button.new() + _tools_reset_btn.text = "Reset to defaults" + _tools_reset_btn.tooltip_text = "Re-enable every domain (no --exclude-domains flag). Still needs Apply." + _tools_reset_btn.pressed.connect(_on_tools_reset) + footer.add_child(_tools_reset_btn) + + tools_tab.add_child(footer) + + _tools_close_confirm = ConfirmationDialog.new() + _tools_close_confirm.title = "Discard unapplied changes?" + ## Generic wording: _settings_are_dirty() covers domain toggles, the + ## telemetry switch, AND the Settings tab's allow-host field (#507) — + ## the old "checked/unchecked domains" text misled non-domain edits. + _tools_close_confirm.dialog_text = ( + "You have unapplied changes in this window.\n" + + "Close it and discard those changes?" + ) + _tools_close_confirm.ok_button_text = "Discard" + _tools_close_confirm.confirmed.connect(_on_tools_discard_confirmed) + add_child(_tools_close_confirm) + + _reset_tools_pending_from_setting() + _refresh_tools_ui_state() + + +## --- Custom (addon-registered) tools section --- + +func _connect_custom_tool_registry() -> void: + var registry := McpToolRegistry.get_instance() + if registry == null: + return + if not registry.tools_changed.is_connected(_on_custom_tool_registry_changed): + registry.tools_changed.connect(_on_custom_tool_registry_changed) + + +func _on_custom_tool_registry_changed() -> void: + ## Deferred: tools_changed can fire from inside a checkbox toggle in + ## this very list — rebuilding synchronously would free the emitting + ## control mid-signal. + _refresh_custom_tools_rows.call_deferred() + + +func _refresh_custom_tools_rows() -> void: + if _custom_tools_list == null or not is_instance_valid(_custom_tools_list): + return + for child in _custom_tools_list.get_children(): + child.queue_free() + var registry := McpToolRegistry.get_instance() + var specs: Array = [] if registry == null else registry.all() + specs.sort_custom(func(a, b): return String(a.name) < String(b.name)) + var enabled_count := 0 + for spec in specs: + if registry.is_tool_enabled(spec.name): + enabled_count += 1 + _custom_tools_list.add_child(_build_custom_tool_row(registry, spec)) + if _custom_tools_count_label != null and is_instance_valid(_custom_tools_count_label): + _custom_tools_count_label.text = "%d/%d enabled" % [enabled_count, specs.size()] + if specs.is_empty(): + var empty := Label.new() + empty.text = "None registered. Addons add tools via McpToolRegistry — see docs/plugin-architecture.md." + empty.add_theme_color_override("font_color", COLOR_MUTED) + empty.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + empty.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _custom_tools_list.add_child(empty) + + +func _build_custom_tool_row(registry: McpToolRegistry, spec: McpCustomToolSpec) -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + var chk := CheckBox.new() + chk.button_pressed = registry.is_tool_enabled(spec.name) + chk.toggled.connect(func(pressed: bool): registry.set_tool_enabled(spec.name, pressed)) + row.add_child(chk) + var name_label := Label.new() + name_label.text = spec.name + (" · promoted" if spec.promoted else "") + name_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name_label) + var source_label := Label.new() + source_label.text = spec.source if not spec.source.is_empty() else spec.source_path.get_base_dir().get_file() + source_label.add_theme_color_override("font_color", COLOR_MUTED) + row.add_child(source_label) + ## Tooltip = the agent-facing description plus provenance, so the user + ## can judge what they're enabling without leaving the dock. + row.tooltip_text = "%s\n\nsource: %s%s" % [ + spec.description, + spec.source_path, + "\npromoted: registers as first-class MCP tool custom_%s" % spec.name if spec.promoted else "", + ] + name_label.tooltip_text = row.tooltip_text + return row + + +func _build_tools_domain_row(parent: VBoxContainer, entry: Dictionary) -> void: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + + var chk := CheckBox.new() + chk.button_pressed = true # default; `_reset_tools_pending_from_setting` corrects + chk.toggled.connect(_on_tools_domain_toggled.bind(String(entry["id"]))) + row.add_child(chk) + + var name_label := Label.new() + name_label.text = String(entry["label"]) + name_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(name_label) + + var count_label := Label.new() + count_label.text = "%d tools" % int(entry["count"]) + count_label.add_theme_color_override("font_color", COLOR_MUTED) + row.add_child(count_label) + + ## Hover tooltip = flat list of tool names in this domain. Lets the + ## user decide without leaving the dock (e.g. "I just want to drop + ## `animation_preset_*` — do I lose anything else?"). + var tools_list: Array = entry.get("tools", []) + row.tooltip_text = ", ".join(tools_list) + name_label.tooltip_text = row.tooltip_text + count_label.tooltip_text = row.tooltip_text + + parent.add_child(row) + _tools_domain_checkboxes[String(entry["id"])] = chk + + +func _reset_tools_pending_from_setting() -> void: + ## Read the saved setting → pending/saved arrays, then sync checkbox state. + ## Unknown domain names in the setting (e.g. from an older plugin + ## version) are dropped from the display here (only ids with a checkbox + ## survive). The startup path is protected separately: + ## `ClientConfigurator.excluded_domains()` filters unknown names before + ## they reach `--exclude-domains`, whose `parse_exclude_list` hard-fails + ## on them. + var saved_raw := ClientConfigurator.excluded_domains() + var saved := PackedStringArray() + if not saved_raw.is_empty(): + for part in saved_raw.split(","): + var t := part.strip_edges() + if t.is_empty(): + continue + if _tools_domain_checkboxes.has(t) and saved.find(t) == -1: + saved.append(t) + saved.sort() + _tools_saved_excluded = saved + _tools_pending_excluded = saved.duplicate() + for id in _tools_domain_checkboxes: + var chk: CheckBox = _tools_domain_checkboxes[id] + ## `set_pressed_no_signal` — mutating programmatically should not + ## fire the toggled handler, which would mutate pending back. + chk.set_pressed_no_signal(_tools_pending_excluded.find(id) == -1) + ## Also reset telemetry pending state from the persisted setting. + if _telemetry_toggle != null: + _load_telemetry_setting() + ## And the Settings tab's allow-host field (#507) — same window-open / + ## discard-confirm re-sync contract as the tools checkboxes. + _reset_allow_hosts_from_setting() + + +func _on_tools_domain_toggled(pressed: bool, domain_id: String) -> void: + var idx := _tools_pending_excluded.find(domain_id) + if pressed and idx != -1: + _tools_pending_excluded.remove_at(idx) + elif not pressed and idx == -1: + _tools_pending_excluded.append(domain_id) + _tools_pending_excluded.sort() + _refresh_tools_ui_state() + + +func _refresh_tools_ui_state() -> void: + if _tools_count_label == null: + return + var enabled := ToolCatalog.enabled_tool_count(_tools_pending_excluded) + var total := ToolCatalog.total_tool_count() + _tools_count_label.text = "%d / %d" % [enabled, total] + var dirty := _settings_are_dirty() + _tools_dirty_warning.visible = dirty + _tools_apply_btn.disabled = not dirty + ## Color the count when the user is over Antigravity's cap — a soft + ## signal that their selection still won't fit. 100 is the Antigravity + ## limit; other clients may cap higher, so this is advisory only. + if enabled > 100: + _tools_count_label.add_theme_color_override("font_color", COLOR_AMBER) + else: + _tools_count_label.remove_theme_color_override("font_color") + + +func _on_tools_apply() -> void: + var canonical_excluded := ToolCatalog.canonical(_tools_pending_excluded) + var es := EditorInterface.get_editor_settings() + if es != null: + es.set_setting(McpSettings.SETTING_EXCLUDED_DOMAINS, canonical_excluded) + es.set_setting(McpSettings.SETTING_TELEMETRY_ENABLED, _telemetry_pending_enabled) + _tools_saved_excluded = _tools_pending_excluded.duplicate() + _telemetry_saved_enabled = _telemetry_pending_enabled + _refresh_tools_ui_state() + ## Plugin reload respawns the server with the new `--exclude-domains` flag + ## (see `plugin.gd::_build_server_flags`) and telemetry option. Mirrors the + ## port-change Apply flow. + _on_reload_plugin() + + +func _on_tools_reset() -> void: + ## Resets only the tool-domain exclusions, not the telemetry toggle. + ## Telemetry is a privacy preference users typically want to set once + ## and have honored — flipping it back to "on" via a generic Reset + ## button would be a surprising privacy regression. The button label + ## is scoped to tools accordingly. + _tools_pending_excluded = PackedStringArray() + for id in _tools_domain_checkboxes: + var chk: CheckBox = _tools_domain_checkboxes[id] + chk.set_pressed_no_signal(true) + _refresh_tools_ui_state() + + +func _show_tools_close_confirm() -> void: + if _tools_close_confirm == null: + return + _tools_close_confirm.popup_centered() + + +func _on_tools_discard_confirmed() -> void: + _reset_tools_pending_from_setting() + _refresh_tools_ui_state() + if _clients_window != null: + _clients_window.hide() + + +# --- Settings tab (allow-host LAN opt-in, #507) --- + +func _build_settings_tab(tabs: TabContainer) -> void: + ## Tab 3 — settings-style controls that don't fit Clients or Tools: the + ## Vision Routing section plus the `--allow-host` LAN opt-in behind a + ## collapsed "Remote access (advanced)" disclosure, so its security + ## warning renders exactly at the point of configuration. Rendered once + ## on dock construction, mirroring `_build_tools_tab`; + ## `_reset_allow_hosts_from_setting()` and `vision_routing.refresh_ui()` + ## re-sync each time the window opens (via + ## `_reset_tools_pending_from_setting` / `_on_open_clients_window`). + var settings_tab := VBoxContainer.new() + settings_tab.add_theme_constant_override("separation", 8) + var settings_margin := _build_margin_container() + settings_margin.name = "Settings" + settings_margin.add_child(settings_tab) + tabs.add_child(settings_margin) + + ## Vision Routing is configuration, not status — it lives here rather + ## than in the dock. Not dev-gated: it is the Settings tab's primary + ## content and must work for every user. + if vision_routing != null: + vision_routing.build_section(settings_tab) + + ## Remote access (advanced): collapsed by default; auto-expands when a + ## non-empty CIDR allowlist is already configured so an active + ## off-loopback bind is never hidden behind a collapsed header. The + ## disclosure replaces the former developer-mode gate for this block. + _allow_hosts_fold = FoldableContainer.new() + _allow_hosts_fold.title = "Remote access (advanced)" + _allow_hosts_fold.folded = true + settings_tab.add_child(_allow_hosts_fold) + + _allow_hosts_section = VBoxContainer.new() + _allow_hosts_section.add_theme_constant_override("separation", 6) + _allow_hosts_fold.add_child(_allow_hosts_section) + + _allow_hosts_section.add_child(_make_header("Allow remote hosts (CIDR)")) + + var intro := Label.new() + intro.text = ( + "Comma-separated CIDRs or bare IPs (e.g. 192.168.1.0/24, 10.0.0.5). " + + "When non-empty, the server binds off loopback and accepts MCP " + + "connections from these ranges (--allow-host)." + ) + intro.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + intro.add_theme_color_override("font_color", COLOR_MUTED) + intro.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _allow_hosts_section.add_child(intro) + + ## Warning banner — the DNS-rebinding guard is widened to every machine + ## in the named ranges, so make the user name a network they trust + ## instead of offering a blanket "expose everything" toggle (#507). + var warning := Label.new() + warning.text = ( + "Warning: every machine in these ranges can drive this Godot editor, " + + "and the DNS-rebinding guard's Host allowlist is widened to match. " + + "Only name networks you trust. On untrusted or shared networks, " + + "prefer an SSH tunnel or Tailscale instead of exposing the port." + ) + warning.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + warning.add_theme_color_override("font_color", COLOR_AMBER) + warning.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _allow_hosts_section.add_child(warning) + + _allow_hosts_edit = LineEdit.new() + _allow_hosts_edit.placeholder_text = "e.g. 192.168.1.0/24, 10.0.0.5 — empty = loopback only" + _allow_hosts_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _allow_hosts_edit.text_changed.connect(_on_allow_hosts_text_changed) + _allow_hosts_section.add_child(_allow_hosts_edit) + + _allow_hosts_hint = Label.new() + _allow_hosts_hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _allow_hosts_hint.add_theme_color_override("font_color", Color.RED) + _allow_hosts_hint.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _allow_hosts_hint.visible = false + _allow_hosts_section.add_child(_allow_hosts_hint) + + _allow_hosts_apply_btn = Button.new() + _allow_hosts_apply_btn.text = "Apply and Restart Server" + _allow_hosts_apply_btn.tooltip_text = ( + "Save the allowlist to Editor Settings and reload the plugin so the " + + "server respawns with --allow-host. Clear the field and Apply to " + + "return to loopback-only." + ) + _allow_hosts_apply_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _allow_hosts_apply_btn.pressed.connect(_on_allow_hosts_apply) + _allow_hosts_section.add_child(_allow_hosts_apply_btn) + + _reset_allow_hosts_from_setting() + + +func _reset_allow_hosts_from_setting() -> void: + _allow_hosts_saved = ClientConfigurator.allow_hosts() + _refresh_allow_hosts_fold_state() + if _allow_hosts_edit == null: + return + _allow_hosts_edit.text = _allow_hosts_saved + _refresh_allow_hosts_ui_state() + + +## Auto-expands the "Remote access (advanced)" disclosure whenever a +## non-empty allowlist is configured, so an active off-loopback bind is +## never hidden behind a collapsed header. +func _refresh_allow_hosts_fold_state() -> void: + if _allow_hosts_fold == null: + return + if ClientConfigurator.allow_hosts().is_empty(): + _allow_hosts_fold.fold() + else: + _allow_hosts_fold.expand() + + +func _allow_hosts_is_dirty() -> bool: + if _allow_hosts_edit == null: + return false + return McpAllowHosts.normalize(_allow_hosts_edit.text) != _allow_hosts_saved + + +func _on_allow_hosts_text_changed(_new_text: String) -> void: + _refresh_allow_hosts_ui_state() + + +func _refresh_allow_hosts_ui_state() -> void: + if _allow_hosts_edit == null or _allow_hosts_apply_btn == null: + return + var invalid := McpAllowHosts.invalid_tokens(_allow_hosts_edit.text) + if invalid.is_empty(): + _allow_hosts_hint.visible = false + else: + ## Name the accepted syntax in the hint — matches the server's + ## `parse_allow_hosts` (CIDR / bare IP, comma-separated). + _allow_hosts_hint.text = ( + "Invalid entries (must be a CIDR like 192.168.1.0/24 or a bare IP, comma-separated): %s" + % ", ".join(invalid) + ) + _allow_hosts_hint.visible = true + _allow_hosts_apply_btn.disabled = not _allow_hosts_is_dirty() or not invalid.is_empty() + + +func _on_allow_hosts_apply() -> void: + if _allow_hosts_edit == null: + return + var normalized := McpAllowHosts.normalize(_allow_hosts_edit.text) + if not McpAllowHosts.invalid_tokens(normalized).is_empty(): + return + var es := EditorInterface.get_editor_settings() + if es != null: + es.set_setting(McpSettings.SETTING_ALLOW_HOSTS, normalized) + _allow_hosts_saved = normalized + _allow_hosts_edit.text = normalized + _refresh_allow_hosts_ui_state() + ## Plugin reload respawns the server with the new `--allow-host` flag + ## (see `plugin.gd::_build_server_flags`). Mirrors the Tools-tab Apply + ## and port-change flows. + _on_reload_plugin() + + +func _refresh_clients_summary() -> void: + # Count from cached row status values — `_apply_row_status` is the single + # source of truth, and reading cached status avoids re-running + # filesystem/CLI-hitting checks on every refresh. The same cache re-derives + # the drift banner so per-row mutations (Configure/Reconfigure/Remove on a + # row in the Clients & Tools window) keep the dock-level banner in sync + # without an extra sweep. See #166 and #226. + if _clients_summary_label == null: + return + var configured := 0 + var mismatched_ids: Array[String] = [] + for client_id in _client_rows: + var status: Client.Status = _client_rows[client_id].get("status", Client.Status.NOT_CONFIGURED) + if status == Client.Status.CONFIGURED: + configured += 1 + elif status == Client.Status.CONFIGURED_MISMATCH: + mismatched_ids.append(client_id) + var text := "%d / %d configured" % [configured, _client_rows.size()] + if mismatched_ids.size() > 0: + text += " (%d stale)" % mismatched_ids.size() + if ClientRefreshStateScript.should_show_checking_badge(_refresh_state): + text += ( + " (checking...)" + if _refresh_state != ClientRefreshStateScript.RUNNING_TIMED_OUT + else " (client probe still running)" + ) + _clients_summary_label.text = text + if _client_configure_all_btn != null: + _client_configure_all_btn.disabled = ClientRefreshStateScript.should_disable_client_actions(_refresh_state) + if _client_empty_cta_btn != null: + _client_empty_cta_btn.visible = configured == 0 and _client_status_refresh_has_completed() + _refresh_drift_banner(mismatched_ids) + _update_status() + + +func _show_manual_command_for(client_id: String) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + var cmd := ClientConfigurator.manual_command(client_id) + if cmd.is_empty(): + row["manual_panel"].visible = false + return + row["manual_text"].text = cmd + row["manual_panel"].visible = true + ## #680: for rows low in the list the panel materializes below the + ## visible scroll area and the Configure click looks like a no-op. + ## Deferred so the just-shown panel has a settled rect to scroll to. + _scroll_manual_panel_into_view.call_deferred(row["manual_panel"]) + + +func _scroll_manual_panel_into_view(panel: Control) -> void: + if panel == null or not panel.is_inside_tree(): + return + var ancestor := panel.get_parent() + while ancestor != null and not (ancestor is ScrollContainer): + ancestor = ancestor.get_parent() + if ancestor != null: + (ancestor as ScrollContainer).ensure_control_visible(panel) + + +func _on_copy_manual_command(client_id: String) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + DisplayServer.clipboard_set(row["manual_text"].text) + + +func _on_open_config_file(client_id: String) -> void: + var path := _client_config_path_for_row(client_id) + if path.is_empty(): + return + if FileAccess.file_exists(path): + OS.shell_open(path) + return + _reveal_config_folder(path) + + +func _on_reveal_config_folder(client_id: String) -> void: + var path := _client_config_path_for_row(client_id) + if path.is_empty(): + return + _reveal_config_folder(path) + + +func _client_config_path_for_row(client_id: String) -> String: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return "" + return String(row.get("config_path", "")) + + +func _reveal_config_folder(path: String) -> void: + var dir := path.get_base_dir() + if dir.is_empty(): + return + OS.shell_open(dir) + + +func _refresh_all_client_statuses() -> void: + ## Compatibility wrapper for older explicit call sites. Treat this as a manual + ## refresh: it bypasses focus-in cooldown but still runs probes off the editor + ## main thread. + if _server_blocks_client_health(): + for client_id in _client_rows: + _apply_row_status(String(client_id), Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return + _request_client_status_refresh(true) + + +func _is_client_status_refresh_in_cooldown() -> bool: + if _last_client_status_refresh_completed_msec <= 0: + return false + return Time.get_ticks_msec() - _last_client_status_refresh_completed_msec < CLIENT_STATUS_REFRESH_COOLDOWN_MSEC + + +func _has_client_status_refresh_timed_out() -> bool: + if not ClientRefreshStateScript.has_worker_alive(_refresh_state): + return false + if _client_status_refresh_started_msec <= 0: + return false + return Time.get_ticks_msec() - _client_status_refresh_started_msec >= CLIENT_STATUS_REFRESH_TIMEOUT_MSEC + + +func _check_client_status_refresh_timeout() -> void: + if not _has_client_status_refresh_timed_out(): + return + if _refresh_state == ClientRefreshStateScript.RUNNING_TIMED_OUT: + return + _refresh_state = ClientRefreshStateScript.RUNNING_TIMED_OUT + _refresh_clients_summary() + + +func _abandon_client_status_refresh_thread() -> void: + ## GDScript cannot interrupt a blocking `OS.execute(..., true)` call in a + ## worker. If a CLI probe hangs, orphan this run, bump the generation so any + ## late result becomes a no-op, and let a forced/manual refresh start a fresh + ## probe slot. Completed orphan threads are pruned from `_process`. + _client_status_refresh_generation += 1 + if _client_status_refresh_thread != null: + _orphaned_client_status_refresh_threads.append(_client_status_refresh_thread) + _client_status_refresh_thread = null + if _refresh_state != ClientRefreshStateScript.SHUTTING_DOWN: + _refresh_state = ClientRefreshStateScript.IDLE + ## Reset the full pending-request triplet, not just the + ## focus-in / cooldown half. A timed-out worker has already + ## warmed bytecode, so any stale `_pending_initial` from an + ## earlier deferred-during-busy startup is no longer load-bearing + ## — leaving it set would cause `_retry_deferred_*` to dispatch + ## `_perform_initial_*` a second time after this abandon + ## (which would then no-op because no fresh worker is needed + ## but still re-warm bytecode and walk the row set redundantly). + _client_status_refresh_pending = false + _client_status_refresh_pending_force = false + _client_status_refresh_pending_initial = false + _client_status_refresh_started_msec = 0 + _refresh_clients_summary() + + +func _prune_orphaned_client_status_refresh_threads() -> void: + for i in range(_orphaned_client_status_refresh_threads.size() - 1, -1, -1): + var thread := _orphaned_client_status_refresh_threads[i] + if thread == null: + _orphaned_client_status_refresh_threads.remove_at(i) + elif not thread.is_alive(): + thread.wait_to_finish() + _orphaned_client_status_refresh_threads.remove_at(i) + + +func _perform_initial_client_status_refresh() -> void: + ## Pre-warm strategy bytecode on main, then hand every client probe + ## (JSON / TOML / CLI alike) to the worker. + ## + ## Godot's GDScript hot-reload of overwritten plugin files is lazy: the + ## bytecode swap happens on first dereference, not at `set_plugin_enabled` + ## time. A worker thread spawned from a fresh `_build_ui` walks into + ## `_json_strategy.*` / `_cli_strategy.*` / `client_configurator.*` while + ## bytecode pages are mid-swap → SIGABRT. Dereferencing those scripts on + ## main first forces the swap to complete here; the worker then finds + ## stable bytecode. Filesystem signals don't bracket the swap window + ## (they fire before bytecode replacement), and FOCUS_IN doesn't fire on + ## in-place plugin reload because the editor stays focused — so neither + ## works as a gate. See #233 / #235. + ## + ## Phase 1 (sync, on main): a single explicit `_warm_strategy_bytecode` + ## call invokes a pure-memory helper on each strategy script — + ## `_json_strategy.gd`, `_toml_strategy.gd`, `_cli_strategy.gd`, plus + ## `client_configurator.gd` via `client_ids()` / `get_by_id`. No disk, + ## no `OS.execute`, no JSON parse on main. `client_status_probe_snapshot` + ## per client adds the `installed` flag and (for CLI clients) a cached + ## CLI path to each probe. + ## + ## Phase 2 (worker): every probe — JSON, TOML, CLI — runs through the + ## same `_run_client_status_refresh_worker` pipeline. Disk reads + JSON + ## parses for the ~17 non-CLI clients now happen off the main thread, + ## so the dock paints immediately on cold open instead of stalling + ## behind ~16 sync `FileAccess.open` + `JSON.parse_string` calls. + ## + ## No-op outside the tree — GDScript tests instantiate via `new()`. + if not is_inside_tree(): + return + if _client_rows.is_empty(): + return + if ClientRefreshStateScript.is_blocked_for_spawn(_refresh_state): + return + if _is_self_update_in_progress(): + return + if _is_editor_filesystem_busy(): + _defer_initial_client_status_refresh_until_filesystem_ready() + return + if ClientRefreshStateScript.has_worker_alive(_refresh_state): + return + + if _server_blocks_client_health(): + for client_id in _client_rows: + _apply_row_status(String(client_id), Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return + + _warm_strategy_bytecode() + + var generation := _begin_client_status_refresh_run() + var launch_context := ClientConfigurator.capture_launch_context() + var server_url := ClientConfigurator.server_url_from(launch_context) + var all_probes: Array[Dictionary] = [] + + for client_id in _client_rows: + var probe := ClientConfigurator.client_status_probe_snapshot(String(client_id)) + if probe.is_empty(): + continue + all_probes.append(probe) + _refresh_clients_summary() + + if all_probes.is_empty(): + _finalize_completed_refresh() + return + + _client_status_refresh_thread = Thread.new() + var err := _client_status_refresh_thread.start( + Callable(self, "_run_client_status_refresh_worker").bind( + all_probes, server_url, launch_context, generation + ) + ) + if err != OK: + _refresh_state = ClientRefreshStateScript.IDLE + _client_status_refresh_thread = null + _refresh_clients_summary() + + +## Force GDScript's lazy bytecode swap to complete for every script the +## worker thread will reach into. Each call is pure-memory — no disk, no +## network, no `OS.execute` — so it only costs the bytecode dereference +## itself. See `_perform_initial_client_status_refresh` for context and +## #233 / #235 for the SIGABRT this exists to prevent. +func _warm_strategy_bytecode() -> void: + var ids := ClientConfigurator.client_ids() + if ids.is_empty(): + return + var any_client := ClientRegistry.get_by_id(String(ids[0])) + if any_client != null: + JsonStrategy.verify_entry(any_client, {}, "") + TomlStrategy.format_body(PackedStringArray(), "") + CliStrategy.format_args(PackedStringArray(), "", "") + ## #691: refresh the env snapshot on main before the worker starts, so + ## its config-path expansions read the snapshot instead of racing a + ## concurrent spawn window's setenv/unsetenv. + ClientConfigurator.warm_env_snapshot() + + +func _begin_client_status_refresh_run() -> int: + ## Marks a refresh as starting and returns the new generation token. + ## Generation is bumped here (not at completion) so that a worker result + ## reaped after `_abandon_client_status_refresh_thread` or `_exit_tree` + ## fires can be detected as stale via generation mismatch. + _refresh_state = ClientRefreshStateScript.RUNNING + _client_status_refresh_pending = false + _client_status_refresh_pending_force = false + _client_status_refresh_started_msec = Time.get_ticks_msec() + _client_status_refresh_generation += 1 + _refresh_clients_summary() + return _client_status_refresh_generation + + +func _finalize_completed_refresh() -> void: + ## Stamps cooldown and clears in-flight state. Called at the end of every + ## refresh that successfully applied results — the worker reaping path + ## and the no-CLI fast path in `_perform_initial_client_status_refresh`. + _last_client_status_refresh_completed_msec = Time.get_ticks_msec() + if _refresh_state != ClientRefreshStateScript.SHUTTING_DOWN: + _refresh_state = ClientRefreshStateScript.IDLE + _refresh_clients_summary() + ## After the summary pass so `_last_mismatched_ids` reflects the sweep + ## that just completed. + _maybe_auto_repin_after_update() + + +func _request_client_status_refresh(force: bool = false) -> bool: + ## Stale-while-refreshing: do not clear dots, summary, or the drift banner + ## when a refresh is requested. The existing UI remains visible until the + ## background worker's result is applied on the main thread. + if _server_blocks_client_health(): + for client_id in _client_rows: + _apply_row_status(String(client_id), Client.Status.ERROR, _server_blocked_client_message()) + _refresh_clients_summary() + return false + if _is_self_update_in_progress(): + ## Self-update is overwriting plugin scripts on disk; spawning a worker + ## now would crash it inside `GDScriptFunction::call` once the bytecode + ## swap reaches a script the worker is mid-call into. Focus-in / + ## manual button / cooldown timer all funnel through here, so one + ## gate covers every spawn path during the install window. The flag + ## lives on `_update_manager` and dies with the dock instance during + ## `set_plugin_enabled(false)`. + return false + if ClientRefreshStateScript.has_worker_alive(_refresh_state): + if force and _has_client_status_refresh_timed_out(): + _abandon_client_status_refresh_thread() + else: + _client_status_refresh_pending = true + _client_status_refresh_pending_force = _client_status_refresh_pending_force or force + _refresh_clients_summary() + return false + if ClientRefreshStateScript.is_blocked_for_spawn(_refresh_state): + return false + if not force and _is_client_status_refresh_in_cooldown(): + return false + if _client_rows.is_empty(): + return false + if _is_editor_filesystem_busy(): + if force: + _defer_client_status_refresh_until_filesystem_ready(force) + return false + + ## Manual refresh (any `force=true` path: button click, popup open, + ## external API caller) implies "may have installed a CLI since the + ## last sweep" — flush CliFinder so freshly-installed binaries get + ## re-detected. Focus-in (`force=false`) stays cached so the cheap + ## case stays cheap. Per-CLI invalidation + ## (`invalidate_uvx_cli_cache`) still pairs with specific events + ## like `_on_install_uv` where the binary name is known. + if force: + ClientConfigurator.invalidate_cli_cache() + + ## Force the bytecode swap on the same scripts the worker will reach + ## into — same #233/#235 guard `_perform_initial_*` already had. + ## Without this, a manual refresh dispatched before the initial sweep + ## has run (e.g. user clicks Refresh during the deferred-initial + ## window after `_defer_client_status_refresh_until_filesystem_ready` + ## cleared `_pending_initial`) walks into mid-swap bytecode and + ## SIGABRTs. + _warm_strategy_bytecode() + + var client_probes: Array[Dictionary] = [] + for client_id in _client_rows: + client_probes.append(ClientConfigurator.client_status_probe_snapshot(String(client_id))) + var launch_context := ClientConfigurator.capture_launch_context() + var server_url := ClientConfigurator.server_url_from(launch_context) + + var generation := _begin_client_status_refresh_run() + _client_status_refresh_thread = Thread.new() + var err := _client_status_refresh_thread.start( + Callable(self, "_run_client_status_refresh_worker").bind( + client_probes, server_url, launch_context, generation + ) + ) + if err != OK: + _refresh_state = ClientRefreshStateScript.IDLE + _client_status_refresh_thread = null + _refresh_clients_summary() + return false + return true + + +func _is_editor_filesystem_busy() -> bool: + var fs := EditorInterface.get_resource_filesystem() + return fs != null and fs.is_scanning() + + +func _defer_initial_client_status_refresh_until_filesystem_ready() -> void: + _refresh_state = ClientRefreshStateScript.DEFERRED_FOR_FILESYSTEM + _client_status_refresh_pending_initial = true + + +func _defer_client_status_refresh_until_filesystem_ready(force: bool) -> void: + ## Godot can still be reparsing/reloading plugin scripts while the editor + ## filesystem is busy. Do not spawn a worker into that window: the worker + ## can call plugin GDScript while the main thread is reloading it, which + ## crashes in `GDScriptFunction::call`. + ## + ## A manual refresh request is more recent intent than any earlier + ## deferred-initial sweep, so we clear `_pending_initial` here. + ## `_request_client_status_refresh` warms strategy bytecode itself + ## now (see #233/#235), so the safety net the initial path provided + ## still applies to the replayed manual refresh. + _refresh_state = ClientRefreshStateScript.DEFERRED_FOR_FILESYSTEM + _client_status_refresh_pending_force = _client_status_refresh_pending_force or force + _client_status_refresh_pending_initial = false + + +func _retry_deferred_client_status_refresh() -> void: + if _refresh_state != ClientRefreshStateScript.DEFERRED_FOR_FILESYSTEM: + return + if _is_self_update_in_progress(): + return + if _is_editor_filesystem_busy(): + return + + var initial := _client_status_refresh_pending_initial + var force := _client_status_refresh_pending_force + _refresh_state = ClientRefreshStateScript.IDLE + _client_status_refresh_pending_force = false + _client_status_refresh_pending_initial = false + if initial: + _perform_initial_client_status_refresh() + else: + _request_client_status_refresh(force) + + +func _run_client_status_refresh_worker( + client_probes: Array[Dictionary], + server_url: String, + launch_context: Dictionary, + generation: int, +) -> Dictionary: + var results: Dictionary = {} + # Command-shaped clients share one attach launch. Discovery can be the + # dominant cold-cache cost, so resolve it once per refresh worker rather + # than once for Claude Desktop and again for Codex. + var resolved_launch := ClientConfigurator.resolve_attach_launch(launch_context) + for probe in client_probes: + var client_id := String(probe.get("id", "")) + if client_id.is_empty(): + continue + var details := ClientConfigurator.check_status_details_for_url_with_cli_path( + client_id, + server_url, + String(probe.get("cli_path", "")), + launch_context, + resolved_launch, + ) + var installed := bool(probe.get("installed", false)) + results[client_id] = { + "status": details.get("status", Client.Status.NOT_CONFIGURED), + "installed": installed, + "error_msg": details.get("error_msg", ""), + } + return {"results": results, "generation": generation} + + +func _poll_completed_client_status_refresh_thread() -> void: + if _client_status_refresh_thread == null: + return + if _client_status_refresh_thread.is_alive(): + return + var payload: Variant = _client_status_refresh_thread.wait_to_finish() + _client_status_refresh_thread = null + if payload is Dictionary: + var data := payload as Dictionary + var results: Dictionary = data.get("results", {}) + _apply_client_status_refresh_results( + results, + int(data.get("generation", _client_status_refresh_generation)) + ) + else: + _apply_client_status_refresh_results({}, _client_status_refresh_generation) + + +func _apply_client_status_refresh_results(results: Dictionary, generation: int) -> void: + if generation != _client_status_refresh_generation or _refresh_state == ClientRefreshStateScript.SHUTTING_DOWN: + return + if _client_status_refresh_thread != null: + _client_status_refresh_thread.wait_to_finish() + _client_status_refresh_thread = null + if _server_blocks_client_health(): + for client_id in _client_rows: + _apply_row_status(String(client_id), Client.Status.ERROR, _server_blocked_client_message()) + _finalize_completed_refresh() + return + + for client_id in results: + ## Skip rows whose Configure / Remove worker is still running so the + ## status refresh doesn't overwrite the "Configuring…" / "Removing…" + ## badge with a stale dot color. The action's own completion handler + ## will repaint the row when it lands. + if _client_action_threads.has(String(client_id)): + continue + var result: Dictionary = results[client_id] + _apply_row_status( + String(client_id), + result.get("status", Client.Status.NOT_CONFIGURED), + str(result.get("error_msg", "")), + result.get("installed", false) + ) + _finalize_completed_refresh() + + if _client_status_refresh_pending: + var pending_force := _client_status_refresh_pending_force + _client_status_refresh_pending = false + _client_status_refresh_pending_force = false + _request_client_status_refresh(pending_force) + + +func _server_blocks_client_health() -> bool: + if _plugin == null or not _plugin.has_method("get_server_status"): + return false + var status: Dictionary = _plugin.get_server_status() + return ServerStateScript.blocks_client_health( + int(status.get("state", ServerStateScript.UNINITIALIZED)) + ) + + +func _server_blocked_client_message() -> String: + if _plugin == null or not _plugin.has_method("get_server_status"): + return "server incompatible" + var status: Dictionary = _plugin.get_server_status() + var message := str(status.get("message", "")) + return message if not message.is_empty() else "server incompatible" + + +func _refresh_drift_banner(mismatched_ids: Array[String]) -> void: + if _drift_banner == null: + return + ## Sort so set-equality is order-independent — `_client_rows` iteration + ## order is dict-insertion order, but a future change to the iteration + ## site shouldn't make us repaint identical content. + mismatched_ids = mismatched_ids.duplicate() + mismatched_ids.sort() + if mismatched_ids == _last_mismatched_ids: + return + _last_mismatched_ids = mismatched_ids + if mismatched_ids.is_empty(): + _drift_banner.visible = false + return + var names: Array[String] = [] + for id in mismatched_ids: + names.append(ClientConfigurator.client_display_name(id)) + ## Active server URL is already shown on the WS:/HTTP: line above the + ## Clients section, so it doesn't need to repeat here. Lead with the + ## client names — that's the only thing the user can act on. + var verb := "needs" if mismatched_ids.size() == 1 else "need" + _drift_label.text = "%s %s to be reconfigured." % [", ".join(names), verb] + _drift_banner.visible = true + + +func _on_reconfigure_mismatched() -> void: + ## Re-Configure every client whose URL is currently stale. Iterates the + ## cached list from the most recent sweep instead of re-running + ## `check_status` per row (saves ~18 filesystem reads per click). The + ## trailing `_refresh_all_client_statuses()` re-sweeps anyway, so any + ## entries the user manually fixed between sweep and click get re-counted + ## as CONFIGURED there. + for client_id in _last_mismatched_ids: + if _client_rows.has(client_id): + _on_configure_client(client_id) + _refresh_all_client_statuses() + + +## Arm the one-shot post-update repin (see `_pending_post_update_repin`). +## Called by plugin.gd when it drains a `status == "success"` self-update +## marker, i.e. exactly once per completed update. `from_version` is the +## plugin version the update replaced — required by the pin-only gate +## below; an empty value (marker from a pre-gate runner) arms nothing, so +## those updates keep the manual drift-banner path. +func notify_self_update_success(from_version: String = "") -> void: + if from_version.strip_edges().is_empty(): + return + _post_update_from_version = from_version.strip_edges() + _pending_post_update_repin = true + + +## Consume `_pending_post_update_repin` on the first completed status sweep +## that could actually observe drift. Runs from `_finalize_completed_refresh` +## AFTER `_refresh_clients_summary()` has rebuilt `_last_mismatched_ids` +## from the sweep that just landed. +## +## Blast-radius gate: only entries whose SOLE drift is the old version pin +## are repinned (`entry_drift_is_version_pin_only`). A mismatched entry can +## also mean "points at a different editor's ports" — this dock ran inside +## a side project with custom ports, or the user hand-tuned the entry — and +## auto-rewriting those hijacks every AI client on the machine to THIS +## editor's ports (observed live: the self-update smoke fixture on port +## 18000 repinned 21 real client configs). Those stay on the drift banner's +## human click. +func _maybe_auto_repin_after_update() -> void: + if not _pending_post_update_repin: + return + ## While the server is INCOMPATIBLE (post-update stale-occupant recovery + ## still in flight) every row reads ERROR, not CONFIGURED_MISMATCH — a + ## consume here would see an empty mismatch list and drop the repin on + ## the floor. Stay pending for the sweep that lands after recovery. + if _server_blocks_client_health(): + return + if ClientRefreshStateScript.should_disable_client_actions(_refresh_state): + return + _pending_post_update_repin = false + var from_version := _post_update_from_version + _post_update_from_version = "" + if _last_mismatched_ids.is_empty(): + return + var launch_context := ClientConfigurator.capture_launch_context() + var pin_only: Array[String] = [] + for client_id in _last_mismatched_ids: + if _entry_drift_is_version_pin_only(String(client_id), from_version, launch_context): + pin_only.append(String(client_id)) + if pin_only.is_empty(): + print( + "MCP | self-update complete — no client entry drifts by version pin alone; leaving %d drifted config(s) to the Reconfigure banner" + % _last_mismatched_ids.size() + ) + return + print( + "MCP | self-update complete — repinning %d client config(s) from v%s to v%s" + % [pin_only.size(), from_version, ClientConfigurator.get_plugin_version()] + ) + for client_id in pin_only: + if _client_rows.has(client_id): + _on_configure_client(client_id) + _refresh_all_client_statuses() + + +## Instance seam over the static gate so the dock test suite can fake the +## per-client verdict without real config files on disk. +func _entry_drift_is_version_pin_only( + client_id: String, from_version: String, launch_context: Dictionary +) -> bool: + return ClientConfigurator.entry_drift_is_version_pin_only( + client_id, from_version, launch_context + ) + + +func _apply_row_status( + client_id: String, + status: Client.Status, + error_msg: String = "", + installed_override: Variant = null, +) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + row["status"] = status + var dot: ColorRect = row["dot"] + var configure_btn: Button = row["configure_btn"] + var remove_btn: Button = row["remove_btn"] + var name_label: Label = row["name_label"] + var base_name := ClientConfigurator.client_display_name(client_id) + _refresh_client_config_file_buttons(client_id) + match status: + Client.Status.CONFIGURED: + dot.color = Color.GREEN + configure_btn.text = "Reconfigure" + remove_btn.visible = true + ## `error_msg` doubles as a detail slot on the green path: a + ## successful configure passes the sweep note (#877). Transient by + ## design — the next status refresh re-applies CONFIGURED with no + ## detail, so the row settles back to its plain name. + name_label.text = ( + "%s (%s)" % [base_name, error_msg] if not error_msg.is_empty() else base_name + ) + Client.Status.NOT_CONFIGURED: + dot.color = COLOR_MUTED + configure_btn.text = "Configure" + remove_btn.visible = false + var installed: bool = installed_override if installed_override != null else ClientConfigurator.is_installed(client_id) + name_label.text = base_name if installed else "%s (not detected)" % base_name + Client.Status.CONFIGURED_MISMATCH: + ## Amber matches the dock-level drift banner so a glance at the + ## row + the banner read as the same condition. + dot.color = COLOR_AMBER + configure_btn.text = "Reconfigure" + remove_btn.visible = true + ## Drift is usually a stale URL, but a `{scope}` client can also be + ## registered in a scope the user did not select (#872), and + ## "URL out of date" would be a wrong description of that. Prefer + ## the probe's own words whenever it supplied any. + name_label.text = ( + "%s (%s)" % [base_name, error_msg] + if not error_msg.is_empty() + else "%s (URL out of date)" % base_name + ) + _: + dot.color = Color.RED + configure_btn.text = "Retry" + remove_btn.visible = false + name_label.text = "%s — %s" % [base_name, error_msg] if not error_msg.is_empty() else base_name + + +func _refresh_client_config_file_buttons(client_id: String) -> void: + var row: Dictionary = _client_rows.get(client_id, {}) + if row.is_empty(): + return + # Re-resolve on every refresh so the Open/Reveal buttons follow the entry + # when it lands in (or moves to) a higher-precedence merge tier (codex F3). + # F-3-4: switched from `effective_config_path` to the authoritative facade + # so multi-project-tier cases resolve to the LATEST tier (matching F2 + # status semantics) instead of failing closed to `path_template`. + row["config_path"] = ClientConfigurator.effective_authoritative_path(client_id) + var config_path := String(row["config_path"]) + var has_path := not config_path.is_empty() + var open_config_btn: Button = row["open_config_btn"] + var reveal_btn: Button = row["reveal_btn"] + open_config_btn.visible = has_path + reveal_btn.visible = has_path + open_config_btn.disabled = not has_path + reveal_btn.disabled = not has_path + if has_path: + open_config_btn.tooltip_text = "Open config file:\n%s" % config_path + reveal_btn.tooltip_text = "Reveal in folder:\n%s" % config_path.get_base_dir() + else: + open_config_btn.tooltip_text = "" + reveal_btn.tooltip_text = "" + + +# --- Update check & self-update --- + +## Tolerates a null manager so test fixtures that build the dock without +## `_build_ui()` don't false-positive on the worker-spawn gate. +func _is_self_update_in_progress() -> bool: + return _update_manager != null and bool(_update_manager.is_install_in_flight()) + + +func _on_update_pressed() -> void: + if _update_manager != null: + _update_manager.start_install() + + +func _on_update_check_result(result: Dictionary) -> void: + _update_label.text = String(result.get("label_text", "")) + _update_banner.visible = true + + +## Apply only the keys present so the manager can ship partial updates +## (e.g. button-text-only during the download phase) without clobbering +## banner state. +func _on_install_state_changed(state: Dictionary) -> void: + if state.has("button_text") and _update_btn != null: + _update_btn.text = String(state["button_text"]) + if state.has("button_disabled") and _update_btn != null: + _update_btn.disabled = bool(state["button_disabled"]) + if state.has("label_text") and _update_label != null: + _update_label.text = String(state["label_text"]) + if state.has("banner_visible") and _update_banner != null: + _update_banner.visible = bool(state["banner_visible"]) + if String(state.get("outcome", "")) == "success" and _update_label != null: + ## Visual confirmation for successful terminal update states. + _update_label.add_theme_color_override("font_color", Color.GREEN) diff --git a/addons/godot_ai/mcp_dock.gd.uid b/addons/godot_ai/mcp_dock.gd.uid new file mode 100644 index 0000000..5868719 --- /dev/null +++ b/addons/godot_ai/mcp_dock.gd.uid @@ -0,0 +1 @@ +uid://b8yknttdjanm5 diff --git a/addons/godot_ai/plugin.cfg b/addons/godot_ai/plugin.cfg new file mode 100644 index 0000000..ff997ab --- /dev/null +++ b/addons/godot_ai/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godot AI" +description="MCP server and AI tools for Godot" +author="Godot AI" +version="3.2.4" +script="plugin.gd" diff --git a/addons/godot_ai/plugin.gd b/addons/godot_ai/plugin.gd new file mode 100644 index 0000000..db0de5c --- /dev/null +++ b/addons/godot_ai/plugin.gd @@ -0,0 +1,2144 @@ +@tool +extends EditorPlugin + +const GAME_HELPER_AUTOLOAD_NAME := "_mcp_game_helper" +const GAME_HELPER_AUTOLOAD_PATH := "res://addons/godot_ai/runtime/game_helper.gd" + +## Editor-process Logger subclass — captures parse errors, @tool runtime +## errors, and push_error/push_warning so the LLM can read them via +## `logs_read(source="editor")`. +const EditorLogger := preload("res://addons/godot_ai/runtime/editor_logger.gd") + +## EditorSettings keys used to remember which server process the plugin +## spawned — survives editor restarts, lets a later editor session adopt +## and manage a server it didn't spawn itself. See #135. +const MANAGED_SERVER_PID_SETTING := "godot_ai/managed_server_pid" +const MANAGED_SERVER_VERSION_SETTING := "godot_ai/managed_server_version" +const MANAGED_SERVER_WS_PORT_SETTING := "godot_ai/managed_server_ws_port" +## Per-launch WS handshake auth token (#690), generated at spawn and handed +## to the server via the GODOT_AI_WS_TOKEN spawn env. Persisted alongside +## the managed-server record so a reloaded plugin instance adopting the +## same server keeps authenticating; cleared with the rest of the record. +const MANAGED_SERVER_WS_TOKEN_SETTING := "godot_ai/managed_server_ws_token" +## keep_server_on_exit (#800): records whether the managed server was +## launched with the keep-alive env opt-outs, so a later session adopting +## the survivor routes its own editor exit through detach too. The live +## setting can't answer that — it may have changed since the spawn. +const MANAGED_SERVER_KEEP_ALIVE_SETTING := "godot_ai/managed_server_keep_alive" +const UPDATE_RELOAD_RUNNER_SCRIPT := preload("res://addons/godot_ai/update_reload_runner.gd") + +## Server lifecycle + port discovery extracted from this file (#297 PR 5). +## State enums + version-check seam extracted in PR 6 (#297). Plugin.gd +## keeps thin shims so the dock and characterization tests see an +## unchanged public surface; spawn-machinery state now lives in the +## lifecycle manager. +const ServerLifecycleManager := preload("res://addons/godot_ai/utils/server_lifecycle.gd") +const PortResolver := preload("res://addons/godot_ai/utils/port_resolver.gd") +const ServerStateScript := preload("res://addons/godot_ai/utils/mcp_server_state.gd") + +## Plugin-class scripts used by this file. The script-local preload aliases +## are ordinary dependency shorthand and keep construction sites compact. +## They are not the self-update safety boundary; #398 was stale Script-object +## content from a mixed old/new snapshot, fixed by the runner's single-phase +## write-before-scan model. +const Connection := preload("res://addons/godot_ai/connection.gd") +const Dispatcher := preload("res://addons/godot_ai/dispatcher.gd") +const Telemetry := preload("res://addons/godot_ai/telemetry.gd") +const LogBuffer := preload("res://addons/godot_ai/utils/log_buffer.gd") +const GameLogBuffer := preload("res://addons/godot_ai/utils/game_log_buffer.gd") +const EditorLogBuffer := preload("res://addons/godot_ai/utils/editor_log_buffer.gd") +const SurfacedErrorTracker := preload("res://addons/godot_ai/utils/surfaced_error_tracker.gd") +const Dock := preload("res://addons/godot_ai/mcp_dock.gd") +const DebuggerPlugin := preload("res://addons/godot_ai/debugger/mcp_debugger_plugin.gd") +const VisionRoutingScript := preload("res://addons/godot_ai/vision_routing.gd") +const ExportPlugin := preload("res://addons/godot_ai/export/mcp_export_plugin.gd") +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") +const WindowsPortReservation := preload("res://addons/godot_ai/utils/windows_port_reservation.gd") +const McpToolRegistry := preload("res://addons/godot_ai/custom_tools/mcp_tool_registry.gd") +const McpServiceLocator := preload("res://addons/godot_ai/custom_tools/mcp_service_locator.gd") + +## Handlers are intentionally NOT preloaded here (#736). The old +## `const X := preload("res://addons/godot_ai/handlers/...")` block pulled +## every handler — and everything handlers preload — into plugin.gd's +## compile closure, so Godot parsed/compiled ~119 addon scripts before the +## first instruction of _enter_tree ran. GDScript has no cross-restart +## compile cache, so that stalled "Initializing plugins" on every editor +## boot and every plugin re-enable. Handlers are now registered by script +## path via McpDispatcher.register_lazy_handler / register_lazy and are +## load()ed at the first dispatch of one of their commands. +## +## Handlers remain preload-style scripts with no `class_name` so they don't +## pollute the project-wide global scope (#253): a user project that happens +## to define its own `InputHandler`, `SceneHandler`, etc. would otherwise +## hard-error on plugin enable. +const HANDLERS_DIR := "res://addons/godot_ai/handlers/" + +## The Python server writes its own PID here on startup (passed as +## `--pid-file`) and unlinks on clean exit. Deterministic replacement +## for scraping `netstat -ano` to find the port owner — especially on +## Windows where `OS.kill` on the uvx launcher doesn't take the Python +## child with it, and the scrape was the only path to the real PID. +## See issue for #154-era Windows update friction. +## Re-export of PortResolver.SERVER_PID_FILE so the spawn flags, the +## resolver, and characterization tests share one source of truth. +const SERVER_PID_FILE := PortResolver.SERVER_PID_FILE + +## How long we watch the spawned server for early exit once it has PROVEN it +## started — i.e. published its pid-file. If the process is still alive when +## this expires, we stop watching. Mid-session crashes after this point get +## caught by the WebSocket disconnect flow. +const SERVER_WATCH_MS := 30 * 1000 +## Watch ceiling for a spawn that has NOT yet published its pid-file (#896). +## +## The short window above justifies itself with "mid-session crashes surface +## via WebSocket disconnect" — which is only true for a server that got far +## enough to be connected to. A cold `uvx` spawn on a slow link can still be +## resolving and downloading its ~67-package environment at 30s, having proven +## nothing; stopping the watch there means a launcher that dies at 45s is never +## observed, `_diagnose_spawn_fast_exit` never runs (it is only reachable from +## inside the watch), and the plugin redials forever while the dock shows a +## bare "Disconnected". +## +## Sized to cover that download. Independent of any pre-warm: this window has +## to hold even when nothing warmed the cache first. +const SERVER_COLD_START_WATCH_MS := 180 * 1000 +## Python's import graph (FastMCP + Rich + uvicorn) plus the pid-file write +## take a beat on cold starts, especially on Windows. Hold off on declaring +## a spawn a crash until this window elapses so the watch loop has time to +## observe either the pid-file (dev venv) or the port listening (uvx). +const SPAWN_GRACE_MS := 5 * 1000 +## Windows only (#797). A uv-created venv launches the real server under a +## different PID than the one `OS.create_process` returns, and that watched PID +## has been seen dying on a healthy boot while the server was still starting +## and had not written its pid-file yet. Past SPAWN_GRACE_MS that reads as +## "server exited" and only the crash-survivor adoption path rescues the +## session. While no pid-file has appeared we keep watching until this longer +## window closes, rather than calling a handoff an exit. Sized to cover a cold +## uvx resolve on top of the launcher hop, and kept well under SERVER_WATCH_MS +## so a genuinely dead Windows spawn is still diagnosed inside the watch rather +## than falling off the end of it. +const SPAWN_HANDOFF_MS := 15 * 1000 +const SERVER_STATUS_PATH := "/godot-ai/status" +const SERVER_STATUS_PROBE_TIMEOUT_MS := 800 +const STARTUP_TRACE_COUNTER_NAMES := [ + "powershell", + "netstat", + "netsh", + "lsof", + "http_status_probe", + "server_command_discovery", +] + +## Untyped on purpose — see policy below. Type fences move to handler `_init` +## sites that take typed parameters. +## +## Self-update field and load-surface policy: plugin entry-load fields that +## survive reload stay untyped. Typed fields against plugin-defined classes +## were the #242 / #244 crash class: Godot can reparse a long-lived script +## while its old field storage and the new type shape disagree. Static-var +## initializers are the most dangerous form because they execute at +## script-load; a top-level typed Dictionary/Array storage change can fail +## before `_enter_tree` runs. +## +## The mitigation is two-part: +## (1) Field declarations are untyped (this block). +## (2) Construction and static access use local names declared at the top +## of the file (e.g. `Connection`, `Dispatcher`, `LogBuffer`, +## `ClientConfigurator`, `WindowsPortReservation`, ...), which keeps +## this entry script's load surface explicit and reviewable. +## +## Constructors, constants, and static methods on `Mcp*` classes are not the +## self-update safety metric under the single-phase runner. The old syntactic +## lint counted bare `Mcp*.MEMBER` references, but #398 was caused by the +## runner scanning a mixed old/new snapshot and reusing stale Script-object +## content. Bare names and preload aliases can both be parsed against stale +## content under an old two-phase runner; from the fixed runner onward the +## full v(N+1) snapshot is written before the scan. In short: preload aliases +## are not the self-update safety metric. +## +## `tests/unit/test_plugin_self_update_safety.py` locks this wording in. +## +var _connection +var _dispatcher +var _telemetry +var _log_buffer +var _game_log_buffer +var _editor_log_buffer +var _surfaced_error_tracker +var _editor_logger: Logger +var _dock +var _debugger_plugin +var _vision_routing +var _export_plugin +var _custom_tool_registry +var _custom_tool_service_locator +## Spawn / stop / adopt orchestration plus state machine; allocated in +## `_init` so test fixtures (which never enter the tree) can drive +## `_start_server`. Owns `_server_pid`, `_server_state`, the version- +## check seam, and the adoption-confirmation deadline — see +## `utils/server_lifecycle.gd`. +var _lifecycle +static var _server_started_this_session := false # guard against re-entrant spawns +static var _resolved_ws_port := ClientConfigurator.DEFAULT_WS_PORT +## True once a startup walk has published a port via `_set_resolved_ws_port` +## this editor session. Gates the `_enter_tree` pre-resolution seed: a fresh +## session seeds `_resolved_ws_port` from the configured EditorSettings +## value, but a plugin reload must keep the prior instance's published +## resolution, which can legitimately differ from the configured value +## (Windows-reservation remap, adopted-server record). +static var _ws_port_resolution_published := false +## Per-launch WS handshake auth token (#690). Static for the same reason as +## _resolved_ws_port: a plugin reload in the same editor session adopts the +## server the previous instance spawned, and must keep its token. Empty +## when this editor never spawned a token-carrying server (dev servers, +## fresh installs) — the handshake then omits the field. +static var _ws_auth_token := "" + +## Server-watch timer lives on the plugin because it's a Node — the +## manager is RefCounted and can't host children. +var _server_watch_timer: Timer = null +var _headless_disabled := false +var _startup_trace_enabled := false +var _startup_trace_start_ms := 0 +var _startup_trace_last_ms := 0 +var _startup_trace_counters: Dictionary = {} +## Startup-path probes can now run on a worker thread (#678); the trace +## counters they bump are shared with the main thread, so serialize. +var _startup_trace_mutex := Mutex.new() +var _startup_trace_netsh_start_count := 0 + + +func _init() -> void: + _lifecycle = ServerLifecycleManager.new(self) + + +func _enter_tree() -> void: + _startup_trace_begin() + + ## `_process` is only used by the adoption-confirmation watcher; keep + ## it off until `_watch_for_adoption_confirmation` arms it, so the + ## plugin has zero per-frame cost in the common case. + set_process(false) + + ## #740: register the export plugin BEFORE the headless guard so + ## `godot --headless --export-*` runs strip the game-helper autoload + ## from exported packs too — CI export pipelines are headless. The + ## export plugin is inert outside exports: no server, no sockets. + _export_plugin = ExportPlugin.new() + add_export_plugin(_export_plugin) + + if _mcp_disabled_for_headless_launch(): + _headless_disabled = true + print("MCP | plugin disabled in headless mode") + return + + ## Self-update extracts over the live addon and doesn't prune files that + ## disappeared from the new ZIP. Remove obsolete Logger-loader quarantine + ## files/folders once so upgraders match a fresh install. + _cleanup_legacy_logger_scripts() + + ## Register port overrides before spawn so `http_port()` / `ws_port()` + ## return the user's configured values (if any) when `_start_server` + ## builds the CLI args. + ClientConfigurator.ensure_settings_registered() + _startup_trace_phase("settings_registered") + + ## With the startup walk's blocking port resolution deferred to a worker + ## (#678), the Connection below dials before `_set_resolved_ws_port` + ## publishes. Seed the pre-resolution port from the configured + ## EditorSettings value (a cheap main-thread read, not a blocking probe) + ## so the first dial honors a `godot_ai/ws_port` override — without this + ## it targeted the compile-time default and the override only took + ## effect on the 1s retry. + _resolved_ws_port = _startup_ws_port_seed( + _ws_port_resolution_published, + _resolved_ws_port, + ClientConfigurator.ws_port(), + ) + + ## #691: pre-warm the env snapshot on the main thread before any worker + ## exists, so worker-thread env reads (dock refresh/action workers, the + ## #678 startup walk's discovery worker) serve from the snapshot and can + ## never race the spawn window's setenv/unsetenv around + ## OS.create_process. + ClientConfigurator.warm_env_snapshot() + + _log_buffer = LogBuffer.new() + ## Apply the persisted dock "Log" toggle before anything logs through the + ## buffer. Without this the choice only took effect after a manual toggle + ## and reset to noisy on every editor restart (#626). + _log_buffer.enabled = McpSettings.mcp_logging_enabled() + ## #678: in the real editor, run the startup path's blocking probes and + ## kill-drain waits off the main thread so a contended port can't freeze + ## plugin init/reload. Set here (not _init) so test fixtures — which + ## extend this plugin but never enter the tree — keep the synchronous + ## default and can call-then-assert. + _lifecycle.defer_blocking_work = true + ## A completed self-update means the user's Update click already + ## authorized replacing the previous-version backend. Armed BEFORE the + ## startup walk (a peek, not a drain — `_flush_pending_self_update_telemetry` + ## below still owns the read-and-clear) so the walk can weak-proof-kill + ## the stale server an attach bridge kept alive, and bounded retries + ## absorb the bridge-respawn port race, instead of latching INCOMPATIBLE + ## and waiting for a manual recovery click. + if _pending_self_update_succeeded(): + _lifecycle.authorize_stale_recovery() + _start_server() + _startup_trace_phase("server_start") + + _game_log_buffer = GameLogBuffer.new() + _editor_log_buffer = EditorLogBuffer.new() + _surfaced_error_tracker = SurfacedErrorTracker.new(_editor_log_buffer, _game_log_buffer) + _attach_editor_logger() + _dispatcher = Dispatcher.new(_log_buffer, _surfaced_error_tracker) + _dispatcher.mcp_logging = _log_buffer.enabled + _startup_trace_phase("core_objects") + + _connection = Connection.new() + _connection.log_buffer = _log_buffer + _connection.surfaced_error_tracker = _surfaced_error_tracker + _connection.ws_port = _resolved_ws_port + ## Restore the token before the first connect: after an editor restart + ## the static is empty but the managed-server record still names the + ## token the running server was spawned with (#690). A fresh spawn later + ## overwrites both via _set_ws_auth_token. + if _ws_auth_token.is_empty(): + _ws_auth_token = str(_read_managed_server_record().get("ws_token", "")) + _connection.auth_token = _ws_auth_token + ## Pause-depth restore boundary (#712): the dispatcher rebalances any + ## pause_processing level a crashed handler leaked. + _dispatcher.pause_target = _connection + _connection.connect_blocked = _lifecycle.is_connection_blocked() + _connection.connect_block_reason = _lifecycle.get_status_dict().get("message", "") + if ( + not _lifecycle.is_connection_blocked() + and not ServerStateScript.is_terminal_diagnosis(_lifecycle.get_state()) + ): + _arm_server_version_check() + ## Replay the custom-tool catalog on (re)connect so tools registered + ## before the initial connection or during a disconnect window reach + ## the server — send_event silently drops while _connected is false. + _connection.connection_state_changed.connect(_on_connection_state_changed) + + _telemetry = Telemetry.new(_connection) + + _debugger_plugin = DebuggerPlugin.new(_log_buffer, _game_log_buffer, _editor_log_buffer, _surfaced_error_tracker) + _vision_routing = VisionRoutingScript.new() + _vision_routing.log_buffer = _log_buffer + _debugger_plugin.vision_routing = _vision_routing + add_debugger_plugin(_debugger_plugin) + _connection.debugger_plugin = _debugger_plugin + _ensure_game_helper_autoload() + + ## Lazy handler registration (#736): declare each handler's script path + ## and constructor args, then map every command to (handler_key, method). + ## The dispatcher load()s + constructs a handler at the first dispatch of + ## one of its commands and caches the instance, so this block is the + ## authoritative command list without pulling any handler script into the + ## boot-time compile closure. Constructor args are captured now (they are + ## all plugin-lifetime objects) and released by _dispatcher.clear() in + ## _exit_tree. + var undo := get_undo_redo() + _dispatcher.register_lazy_handler("editor", HANDLERS_DIR + "editor_handler.gd", [_log_buffer, _connection, _debugger_plugin, _game_log_buffer, _editor_log_buffer, null, _surfaced_error_tracker, _vision_routing]) + _dispatcher.register_lazy_handler("scene", HANDLERS_DIR + "scene_handler.gd", [_connection]) + _dispatcher.register_lazy_handler("node", HANDLERS_DIR + "node_handler.gd", [undo]) + _dispatcher.register_lazy_handler("project", HANDLERS_DIR + "project_handler.gd", [_connection, _debugger_plugin, _editor_log_buffer]) + _dispatcher.register_lazy_handler( + "client", + HANDLERS_DIR + "client_handler.gd", + [_connection, ClientConfigurator.capture_launch_context()], + ) + _dispatcher.register_lazy_handler("script", HANDLERS_DIR + "script_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("resource", HANDLERS_DIR + "resource_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("api", HANDLERS_DIR + "api_handler.gd", []) + _dispatcher.register_lazy_handler("filesystem", HANDLERS_DIR + "filesystem_handler.gd", [_connection]) + _dispatcher.register_lazy_handler("signal", HANDLERS_DIR + "signal_handler.gd", [undo]) + _dispatcher.register_lazy_handler("autoload", HANDLERS_DIR + "autoload_handler.gd", []) + _dispatcher.register_lazy_handler("input", HANDLERS_DIR + "input_handler.gd", []) + _dispatcher.register_lazy_handler("test", HANDLERS_DIR + "test_handler.gd", [undo, _log_buffer, _dispatcher, _connection]) + _dispatcher.register_lazy_handler("batch", HANDLERS_DIR + "batch_handler.gd", [_dispatcher, undo]) + _dispatcher.register_lazy_handler("ui", HANDLERS_DIR + "ui_handler.gd", [undo]) + _dispatcher.register_lazy_handler("theme", HANDLERS_DIR + "theme_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("animation", HANDLERS_DIR + "animation_handler.gd", [undo]) + _dispatcher.register_lazy_handler("material", HANDLERS_DIR + "material_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("particle", HANDLERS_DIR + "particle_handler.gd", [undo]) + _dispatcher.register_lazy_handler("camera", HANDLERS_DIR + "camera_handler.gd", [undo]) + _dispatcher.register_lazy_handler("audio", HANDLERS_DIR + "audio_handler.gd", [undo]) + _dispatcher.register_lazy_handler("physics_shape", HANDLERS_DIR + "physics_shape_handler.gd", [undo]) + _dispatcher.register_lazy_handler("environment", HANDLERS_DIR + "environment_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("texture", HANDLERS_DIR + "texture_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("curve", HANDLERS_DIR + "curve_handler.gd", [undo, _connection]) + _dispatcher.register_lazy_handler("control_draw_recipe", HANDLERS_DIR + "control_draw_recipe_handler.gd", [undo]) + _dispatcher.register_lazy_handler("tilemap", HANDLERS_DIR + "tilemap_handler.gd", [undo]) + _dispatcher.register_lazy_handler("tileset", HANDLERS_DIR + "tileset_handler.gd", []) + _dispatcher.register_lazy_handler("gridmap", HANDLERS_DIR + "gridmap_handler.gd", [undo]) + _dispatcher.register_lazy_handler("csg", HANDLERS_DIR + "csg_handler.gd", [undo]) + + _dispatcher.register_lazy("get_editor_state", "editor", &"get_editor_state") + _dispatcher.register_lazy("get_scene_tree", "scene", &"get_scene_tree") + _dispatcher.register_lazy("get_open_scenes", "scene", &"get_open_scenes") + _dispatcher.register_lazy("find_nodes", "scene", &"find_nodes") + _dispatcher.register_lazy("create_scene", "scene", &"create_scene") + _dispatcher.register_lazy("open_scene", "scene", &"open_scene") + _dispatcher.register_lazy("save_scene", "scene", &"save_scene") + _dispatcher.register_lazy("save_scene_as", "scene", &"save_scene_as") + _dispatcher.register_lazy("get_selection", "editor", &"get_selection") + _dispatcher.register_lazy("create_node", "node", &"create_node") + _dispatcher.register_lazy("delete_node", "node", &"delete_node") + _dispatcher.register_lazy("reparent_node", "node", &"reparent_node") + _dispatcher.register_lazy("set_property", "node", &"set_property") + _dispatcher.register_lazy("rename_node", "node", &"rename_node") + _dispatcher.register_lazy("duplicate_node", "node", &"duplicate_node") + _dispatcher.register_lazy("move_node", "node", &"move_node") + _dispatcher.register_lazy("add_to_group", "node", &"add_to_group") + _dispatcher.register_lazy("remove_from_group", "node", &"remove_from_group") + _dispatcher.register_lazy("set_selection", "node", &"set_selection") + _dispatcher.register_lazy("get_node_properties", "node", &"get_node_properties") + _dispatcher.register_lazy("get_children", "node", &"get_children") + _dispatcher.register_lazy("get_groups", "node", &"get_groups") + _dispatcher.register_lazy("get_logs", "editor", &"get_logs") + _dispatcher.register_lazy("clear_logs", "editor", &"clear_logs") + _dispatcher.register_lazy("take_screenshot", "editor", &"take_screenshot") + _dispatcher.register_lazy("get_performance_monitors", "editor", &"get_performance_monitors") + _dispatcher.register_lazy("reload_plugin", "editor", &"reload_plugin") + _dispatcher.register_lazy("quit_editor", "editor", &"quit_editor") + _dispatcher.register_lazy("game_eval", "editor", &"game_eval") + _dispatcher.register_lazy("game_command", "editor", &"game_command") + _dispatcher.register_lazy("get_project_setting", "project", &"get_project_setting") + _dispatcher.register_lazy("set_project_setting", "project", &"set_project_setting") + _dispatcher.register_lazy("run_project", "project", &"run_project") + _dispatcher.register_lazy("stop_project", "project", &"stop_project") + _dispatcher.register_lazy("search_filesystem", "project", &"search_filesystem") + _dispatcher.register_lazy("configure_client", "client", &"configure_client") + _dispatcher.register_lazy("remove_client", "client", &"remove_client") + _dispatcher.register_lazy("check_client_status", "client", &"check_client_status") + _dispatcher.register_lazy("create_script", "script", &"create_script") + _dispatcher.register_lazy("patch_script", "script", &"patch_script") + _dispatcher.register_lazy("read_script", "script", &"read_script") + _dispatcher.register_lazy("attach_script", "script", &"attach_script") + _dispatcher.register_lazy("detach_script", "script", &"detach_script") + _dispatcher.register_lazy("find_symbols", "script", &"find_symbols") + _dispatcher.register_lazy("search_resources", "resource", &"search_resources") + _dispatcher.register_lazy("load_resource", "resource", &"load_resource") + _dispatcher.register_lazy("assign_resource", "resource", &"assign_resource") + _dispatcher.register_lazy("create_resource", "resource", &"create_resource") + _dispatcher.register_lazy("get_resource_info", "resource", &"get_resource_info") + _dispatcher.register_lazy("get_class_info", "api", &"get_class_info") + _dispatcher.register_lazy("read_file", "filesystem", &"read_file") + _dispatcher.register_lazy("write_file", "filesystem", &"write_file") + _dispatcher.register_lazy("reimport", "filesystem", &"reimport") + _dispatcher.register_lazy("scan_filesystem", "filesystem", &"scan_filesystem") + _dispatcher.register_lazy("list_signals", "signal", &"list_signals") + _dispatcher.register_lazy("connect_signal", "signal", &"connect_signal") + _dispatcher.register_lazy("disconnect_signal", "signal", &"disconnect_signal") + _dispatcher.register_lazy("list_autoloads", "autoload", &"list_autoloads") + _dispatcher.register_lazy("add_autoload", "autoload", &"add_autoload") + _dispatcher.register_lazy("remove_autoload", "autoload", &"remove_autoload") + _dispatcher.register_lazy("list_actions", "input", &"list_actions") + _dispatcher.register_lazy("add_action", "input", &"add_action") + _dispatcher.register_lazy("ensure_action", "input", &"ensure_action") + _dispatcher.register_lazy("remove_action", "input", &"remove_action") + _dispatcher.register_lazy("bind_event", "input", &"bind_event") + _dispatcher.register_lazy("ensure_binding", "input", &"ensure_binding") + _dispatcher.register_lazy("run_tests", "test", &"run_tests") + _dispatcher.register_lazy("get_test_results", "test", &"get_test_results") + _dispatcher.register_lazy("batch_execute", "batch", &"batch_execute") + _dispatcher.register_lazy("set_anchor_preset", "ui", &"set_anchor_preset") + _dispatcher.register_lazy("set_text", "ui", &"set_text") + _dispatcher.register_lazy("build_layout", "ui", &"build_layout") + _dispatcher.register_lazy("create_theme", "theme", &"create_theme") + _dispatcher.register_lazy("theme_set_color", "theme", &"set_color") + _dispatcher.register_lazy("theme_set_constant", "theme", &"set_constant") + _dispatcher.register_lazy("theme_set_font_size", "theme", &"set_font_size") + _dispatcher.register_lazy("theme_set_stylebox_flat", "theme", &"set_stylebox_flat") + _dispatcher.register_lazy("apply_theme", "theme", &"apply_theme") + _dispatcher.register_lazy("animation_player_create", "animation", &"create_player") + _dispatcher.register_lazy("animation_create", "animation", &"create_animation") + _dispatcher.register_lazy("animation_add_property_track", "animation", &"add_property_track") + _dispatcher.register_lazy("animation_add_method_track", "animation", &"add_method_track") + _dispatcher.register_lazy("animation_set_autoplay", "animation", &"set_autoplay") + _dispatcher.register_lazy("animation_play", "animation", &"play") + _dispatcher.register_lazy("animation_stop", "animation", &"stop") + _dispatcher.register_lazy("animation_list", "animation", &"list_animations") + _dispatcher.register_lazy("animation_get", "animation", &"get_animation") + _dispatcher.register_lazy("animation_create_simple", "animation", &"create_simple") + _dispatcher.register_lazy("animation_delete", "animation", &"delete_animation") + _dispatcher.register_lazy("animation_validate", "animation", &"validate_animation") + _dispatcher.register_lazy("animation_preset_fade", "animation", &"preset_fade") + _dispatcher.register_lazy("animation_preset_slide", "animation", &"preset_slide") + _dispatcher.register_lazy("animation_preset_shake", "animation", &"preset_shake") + _dispatcher.register_lazy("animation_preset_pulse", "animation", &"preset_pulse") + _dispatcher.register_lazy("material_create", "material", &"create_material") + _dispatcher.register_lazy("material_set_param", "material", &"set_param") + _dispatcher.register_lazy("material_set_shader_param", "material", &"set_shader_param") + _dispatcher.register_lazy("material_get", "material", &"get_material") + _dispatcher.register_lazy("material_list", "material", &"list_materials") + _dispatcher.register_lazy("material_assign", "material", &"assign_material") + _dispatcher.register_lazy("material_apply_to_node", "material", &"apply_to_node") + _dispatcher.register_lazy("material_apply_preset", "material", &"apply_preset") + _dispatcher.register_lazy("particle_create", "particle", &"create_particle") + _dispatcher.register_lazy("particle_set_main", "particle", &"set_main") + _dispatcher.register_lazy("particle_set_process", "particle", &"set_process") + _dispatcher.register_lazy("particle_set_draw_pass", "particle", &"set_draw_pass") + _dispatcher.register_lazy("particle_restart", "particle", &"restart_particle") + _dispatcher.register_lazy("particle_get", "particle", &"get_particle") + _dispatcher.register_lazy("particle_apply_preset", "particle", &"apply_preset") + _dispatcher.register_lazy("camera_create", "camera", &"create_camera") + _dispatcher.register_lazy("camera_configure", "camera", &"configure") + _dispatcher.register_lazy("camera_set_limits_2d", "camera", &"set_limits_2d") + _dispatcher.register_lazy("camera_set_damping_2d", "camera", &"set_damping_2d") + _dispatcher.register_lazy("camera_follow_2d", "camera", &"follow_2d") + _dispatcher.register_lazy("camera_get", "camera", &"get_camera") + _dispatcher.register_lazy("camera_list", "camera", &"list_cameras") + _dispatcher.register_lazy("camera_apply_preset", "camera", &"apply_preset") + _dispatcher.register_lazy("audio_player_create", "audio", &"create_player") + _dispatcher.register_lazy("audio_player_set_stream", "audio", &"set_stream") + _dispatcher.register_lazy("audio_player_set_playback", "audio", &"set_playback") + _dispatcher.register_lazy("audio_play", "audio", &"play") + _dispatcher.register_lazy("audio_stop", "audio", &"stop") + _dispatcher.register_lazy("audio_list", "audio", &"list_streams") + _dispatcher.register_lazy("physics_shape_autofit", "physics_shape", &"autofit") + _dispatcher.register_lazy("environment_create", "environment", &"create_environment") + _dispatcher.register_lazy("gradient_texture_create", "texture", &"create_gradient_texture") + _dispatcher.register_lazy("noise_texture_create", "texture", &"create_noise_texture") + _dispatcher.register_lazy("curve_set_points", "curve", &"set_points") + _dispatcher.register_lazy("control_draw_recipe", "control_draw_recipe", &"control_draw_recipe") + _dispatcher.register_lazy("tilemap_set_cell", "tilemap", &"set_cell") + _dispatcher.register_lazy("tilemap_set_cells_rect", "tilemap", &"set_cells_rect") + _dispatcher.register_lazy("tilemap_clear", "tilemap", &"clear_layer") + _dispatcher.register_lazy("tilemap_get_cells", "tilemap", &"get_used_cells") + _dispatcher.register_lazy("tileset_get_atlas_tiles", "tileset", &"get_atlas_tiles") + _dispatcher.register_lazy("tileset_get_atlas_image", "tileset", &"get_atlas_image") + _dispatcher.register_lazy("gridmap_set_item", "gridmap", &"set_item") + _dispatcher.register_lazy("gridmap_fill", "gridmap", &"fill") + _dispatcher.register_lazy("gridmap_clear", "gridmap", &"clear_layer") + _dispatcher.register_lazy("gridmap_get_used_cells", "gridmap", &"get_used_cells") + _dispatcher.register_lazy("gridmap_list_library_items", "gridmap", &"list_library_items") + _dispatcher.register_lazy("csg_create", "csg", &"create") + _dispatcher.register_lazy("csg_set_operation", "csg", &"set_operation") + + _connection.dispatcher = _dispatcher + add_child(_connection) + _startup_trace_phase("handlers_registered") + + # Custom tool registry + _custom_tool_service_locator = McpServiceLocator.new() + _custom_tool_service_locator.setup(_connection, _log_buffer) + _custom_tool_registry = McpToolRegistry.new() + _custom_tool_registry.setup(_dispatcher, _custom_tool_service_locator) + _custom_tool_registry.tools_changed.connect(_on_custom_tools_changed) + _custom_tool_registry.mark_ready() + _startup_trace_phase("custom_tools_ready") + + # Dock panel + _dock = Dock.new() + _dock.vision_routing = _vision_routing + _dock.name = "Godot AI" + _dock.setup(_connection, _log_buffer, self) + add_control_to_dock(DOCK_SLOT_RIGHT_BL, _dock) + _startup_trace_phase("dock_attached") + + _log_buffer.log("plugin loaded") + if _telemetry != null: + _telemetry.record_dock_startup() + _flush_pending_self_update_telemetry() + _telemetry.flush_pending_plugin_reload() + ## The startup-trace 'done' line is stamped by _start_server after the + ## (possibly suspended) walk completes — not here (#682 review). + + +## Public wrapper around the dev-server-toggle telemetry emit. Lets the +## dock (or any other caller) record without reaching into ``_telemetry`` +## directly — keeps the plugin's internal field encapsulated. The dev +## server is a Python subprocess unrelated to the plugin's own +## lifecycle, so emission can be synchronous (no EditorSettings persist +## dance like ``plugin_reload`` / ``self_update``). +func record_dev_server_toggle(action: String) -> void: + if _telemetry == null: + return + _telemetry.record_dev_server_toggle(action) + + +## Non-draining read of the runner's pending self-update marker. Peeked +## before `_start_server` (the drain in `_flush_pending_self_update_telemetry` +## runs later, after the dock attaches) so the startup walk knows an update +## just completed. Only a `status == "success"` marker counts: a failed +## install left the OLD plugin version enabled, and killing a same-version +## backend is not this path's business. +func _pending_self_update_succeeded() -> bool: + var settings := EditorInterface.get_editor_settings() + if settings == null: + return false + var key := UPDATE_RELOAD_RUNNER_SCRIPT.PENDING_SELF_UPDATE_TELEMETRY_KEY + if not settings.has_setting(key): + return false + var raw := str(settings.get_setting(key)) + if raw.is_empty(): + return false + var parsed = JSON.parse_string(raw) + if typeof(parsed) != TYPE_DICTIONARY: + return false + return str(parsed.get("status", "")) == "success" + + +## Drain any self_update event written by `update_reload_runner` during the +## previous disable -> enable window. +func _flush_pending_self_update_telemetry() -> void: + var key := UPDATE_RELOAD_RUNNER_SCRIPT.PENDING_SELF_UPDATE_TELEMETRY_KEY + var parsed = Telemetry._drain_editor_setting_dict(key) + if parsed == null: + return + var status := str(parsed.get("status", "unknown")) + var error := str(parsed.get("error", "")) + ## Positional args: GDScript doesn't support keyword args in calls + ## (unlike Python). from/to versions ride the marker since the repin + ## gate landed; markers written by older runners simply lack them. + var from_version := str(parsed.get("from_version", "")) + var to_version := str(parsed.get("to_version", "")) + _telemetry.record_self_update(status, from_version, to_version, error) + ## After a successful update, previously-configured client entries still + ## pin the old server version; arm the dock's one-shot auto-repin so its + ## first healthy status sweep rewrites them without the user having to + ## click through the drift banner. The dock repins ONLY entries whose + ## sole drift is the old version pin — it needs `from_version` to render + ## that comparison, so a marker from an older runner (no version fields) + ## arms nothing and the drift banner stays the manual path. `has_method` + ## (not a typed call): the dock script is one of the files the update + ## just overwrote, and the untyped-reference convention applies across + ## that boundary. + if status == "success" and _dock != null and _dock.has_method("notify_self_update_success"): + _dock.notify_self_update_success(from_version) + + + + +func _exit_tree() -> void: + ## Registered before the headless guard in _enter_tree, so it must be + ## removed before the headless early-return here too. + if _export_plugin != null: + remove_export_plugin(_export_plugin) + _export_plugin = null + + if _headless_disabled: + _server_started_this_session = false + _headless_disabled = false + return + + if _custom_tool_registry != null: + _custom_tool_registry.clear() + _custom_tool_registry = null + + _custom_tool_service_locator = null + + ## Outer-to-inner teardown. Dispatcher Callables hold RefCounted handlers + ## alive past the point where Godot reloads their class_name scripts — the + ## first post-reload call into a typed-array-holding handler (e.g. + ## McpGameLogBuffer._storage) then SIGSEGVs against a stale class descriptor. + ## See issue #46. + + # Stop inbound work first so _process can't enqueue new commands or + # null-deref log_buffer on the next tick mid-teardown. + if _connection: + _connection.teardown() + + # Drop the dispatcher's Callables AND its lazily-constructed handler + # instances (#736: handlers live in the dispatcher's cache now). Handler + # destructors run here, while their scripts are still loaded. + if _dispatcher: + _dispatcher.clear() + if _vision_routing: + _vision_routing.shutdown() + _vision_routing = null + + if _dock: + remove_control_from_docks(_dock) + _dock.queue_free() + _dock = null + if _connection: + _connection.queue_free() + _connection = null + if _debugger_plugin: + remove_debugger_plugin(_debugger_plugin) + _debugger_plugin = null + + ## Detach the editor logger BEFORE nulling the buffer. After remove_logger + ## returns, Godot guarantees no further virtual calls — so the logger's + ## next access to `_buffer` (if any in flight) lands on a still-live + ## ref-counted buffer, not a freed one. + _detach_editor_logger() + + _dispatcher = null + _log_buffer = null + _game_log_buffer = null + _editor_log_buffer = null + _surfaced_error_tracker = null + + ## keep_server_on_exit (#800): the manager routes on the spawn-time + ## keep-alive flag (persisted in the managed-server record), NOT the + ## live setting — detach leaves the server for the next session (or a + ## same-session disable/enable cycle) to adopt. Explicit stops (dock + ## Restart, update reload) still kill via _stop_server. + _lifecycle.teardown_for_editor_exit() + ## Symmetric with prepare_for_update_reload: the static guard persists + ## across disable/enable within a single editor session, so the re-enabled + ## plugin instance's _start_server would short-circuit and never respawn. + ## Pre-#159 this was masked — the old kill path usually left Python alive + ## and the new instance adopted it on port 8000. Now that _stop_server is + ## deterministic, nothing is left to adopt and the reload hangs. + _server_started_this_session = false + print("MCP | plugin unloaded") + + +## Attach editor_logger.gd as a Godot logger so editor-process script +## errors (parse errors, @tool runtime errors, EditorPlugin errors, +## push_error/push_warning) flow into _editor_log_buffer for +## logs_read(source="editor"). +## +## Limitation called out in the issue: parse errors fired *before* the +## plugin's _enter_tree (e.g. during the editor's initial filesystem +## scan, or for scripts that fail on first project open) happen before +## add_logger is called and are not captured. There's no public API to +## drain the editor's already-emitted error history; rescanning the +## file would re-emit them but at the cost of disrupting the user's +## editing state, so we accept the gap. +func _attach_editor_logger() -> void: + _editor_logger = EditorLogger.new(_editor_log_buffer) + OS.add_logger(_editor_logger) + + +## Remove old Logger-quarantine artifacts left by extract-over-live +## self-update. Idempotent: existence-guarded, so it's a no-op on fresh +## installs and symlinked dev checkouts. +func _cleanup_legacy_logger_scripts() -> void: + var legacy_files := [ + "res://addons/godot_ai/runtime/logger_loader.gd", + "res://addons/godot_ai/runtime/logger_loader.gd.uid", + "res://addons/godot_ai/testing/script_error_capture_loader.gd", + "res://addons/godot_ai/testing/script_error_capture_loader.gd.uid", + ] + for res_path in legacy_files: + if FileAccess.file_exists(res_path): + DirAccess.remove_absolute(ProjectSettings.globalize_path(res_path)) + var legacy_dirs := [ + "res://addons/godot_ai/runtime/loggers", + "res://addons/godot_ai/testing/loggers", + ] + for res_path in legacy_dirs: + var absolute := ProjectSettings.globalize_path(res_path) + if DirAccess.dir_exists_absolute(absolute): + _remove_dir_recursive_absolute(absolute) + + +static func _remove_dir_recursive_absolute(path: String) -> void: + var dir := DirAccess.open(path) + if dir == null: + return + dir.list_dir_begin() + var name := dir.get_next() + while not name.is_empty(): + var child := path.path_join(name) + if dir.current_is_dir(): + _remove_dir_recursive_absolute(child) + else: + DirAccess.remove_absolute(child) + name = dir.get_next() + dir.list_dir_end() + DirAccess.remove_absolute(path) + + +func _detach_editor_logger() -> void: + if _editor_logger != null: + OS.remove_logger(_editor_logger) + _editor_logger = null + + +## Register the game-side autoload on plugin enable. Runs the helper inside +## the game process so the editor-side debugger plugin can request +## framebuffer captures over EngineDebugger messages. Removed on +## _disable_plugin so disabling the plugin leaves project.godot clean. +func _enable_plugin() -> void: + if _mcp_disabled_for_headless_launch(): + return + _ensure_game_helper_autoload() + + +static func _mcp_disabled_for_headless_launch() -> bool: + return _mcp_disabled_for_headless( + OS.get_cmdline_args(), + DisplayServer.get_name(), + OS.get_environment("GODOT_AI_ALLOW_HEADLESS") + ) + + +static func _mcp_disabled_for_headless(args: PackedStringArray, display_name: String, allow_value: String) -> bool: + if McpSettings.truthy(allow_value): + return false + return _args_request_headless(args) or display_name.to_lower() == "headless" + + +static func _args_request_headless(args: PackedStringArray) -> bool: + for i in range(args.size()): + var arg := args[i] + if arg == "--headless": + return true + if arg == "--display-driver" and i + 1 < args.size() and args[i + 1] == "headless": + return true + if arg.begins_with("--display-driver=") and arg.get_slice("=", 1) == "headless": + return true + return false + + + + +func _disable_plugin() -> void: + var key := "autoload/" + GAME_HELPER_AUTOLOAD_NAME + if not ProjectSettings.has_setting(key): + return + ProjectSettings.clear(key) + ProjectSettings.save() + + +func _ensure_game_helper_autoload() -> void: + ## Write the autoload directly to ProjectSettings and save immediately. + ## EditorPlugin.add_autoload_singleton only mutates in-memory settings — + ## the on-disk project.godot is only persisted when the editor saves + ## (e.g. on quit). CI spawns the game subprocess before any save fires, + ## so the child process never sees the autoload and the capture times + ## out. Mirror AutoloadHandler's pattern: set_setting + save(). + var key := "autoload/" + GAME_HELPER_AUTOLOAD_NAME + var value := "*" + GAME_HELPER_AUTOLOAD_PATH # "*" prefix = singleton + if ProjectSettings.get_setting(key, "") == value: + return ## already registered with the right target + ProjectSettings.set_setting(key, value) + ProjectSettings.set_initial_value(key, "") + ProjectSettings.set_as_basic(key, true) + var err := ProjectSettings.save() + if err != OK: + push_warning("MCP: failed to save project.godot after registering %s autoload (error %d)" + % [GAME_HELPER_AUTOLOAD_NAME, err]) + + +func _startup_trace_begin() -> void: + _startup_trace_enabled = ClientConfigurator.startup_trace_enabled() + if not _startup_trace_enabled: + return + _startup_trace_start_ms = Time.get_ticks_msec() + _startup_trace_last_ms = _startup_trace_start_ms + _startup_trace_netsh_start_count = WindowsPortReservation.netsh_query_count() + _startup_trace_counters.clear() + for counter in STARTUP_TRACE_COUNTER_NAMES: + _startup_trace_counters[counter] = 0 + print( + "MCP startup trace | begin platform=%s http_port=%d ws_port=%d" + % [ + OS.get_name(), + ClientConfigurator.http_port(), + ClientConfigurator.ws_port(), + ] + ) + + +func _startup_trace_count(counter: String, amount: int = 1) -> void: + if not _startup_trace_enabled: + return + _startup_trace_mutex.lock() + _startup_trace_counters[counter] = int(_startup_trace_counters.get(counter, 0)) + amount + _startup_trace_mutex.unlock() + + +func _startup_trace_phase(name: String) -> void: + if not _startup_trace_enabled: + return + var now := Time.get_ticks_msec() + print( + "MCP startup trace | phase=%s delta_ms=%d total_ms=%d" + % [name, now - _startup_trace_last_ms, now - _startup_trace_start_ms] + ) + _startup_trace_last_ms = now + + +func _startup_trace_finish(path: String) -> void: + if not _startup_trace_enabled: + return + var now := Time.get_ticks_msec() + ## Same lock as _startup_trace_count — a worker probe may still be + ## bumping counters while this reads/writes the shared dictionary. + _startup_trace_mutex.lock() + _startup_trace_counters["netsh"] = ( + WindowsPortReservation.netsh_query_count() - _startup_trace_netsh_start_count + ) + var counters_snapshot: Dictionary = _startup_trace_counters.duplicate() + _startup_trace_mutex.unlock() + print( + "MCP startup trace | done path=%s total_ms=%d counters=%s" + % [path, now - _startup_trace_start_ms, str(counters_snapshot)] + ) + + +func _start_server() -> void: + ## Fire-and-forget: the walk is a coroutine in production (#678). Its + ## completion continuation must NOT live in this method — a reload can + ## free this plugin while the walk is suspended, and resuming a freed + ## Node's coroutine errors out. The manager calls + ## `_finish_startup_trace_after_walk` on walk completion instead, + ## guarded by is_instance_valid. + _lifecycle.start_server() + + +## Called by the lifecycle manager when the (possibly suspended) startup +## walk completes — the point where the real startup outcome is known, so +## the trace 'done' line reports the true contended-port path and duration +## instead of a pre-walk placeholder (#682 review). +func _finish_startup_trace_after_walk() -> void: + var startup_path: String = str(_lifecycle.get_startup_path()) + _startup_trace_finish(startup_path if not startup_path.is_empty() else "loaded") + + +## Test-fixture shim — characterization tests in test_plugin_lifecycle +## reach for this instance method directly. Delegates to the manager's +## state-owning copy. +func _set_incompatible_server(live: Dictionary, expected_version: String, port: int) -> void: + _lifecycle._set_incompatible_server(live, expected_version, port) + + +## Static shim — kept on the plugin class because the characterization +## tests assert against `GodotAiPlugin._incompatible_server_message`. +## Implementation moved to ServerLifecycleManager. +static func _incompatible_server_message( + live: Dictionary, + expected_version: String, + port: int, + expected_ws_port: int +) -> String: + return ServerLifecycleManager._incompatible_server_message( + live, expected_version, port, expected_ws_port + ) + + +static func _server_version_compatibility( + actual_version: String, expected_version: String +) -> Dictionary: + return ServerLifecycleManager._server_version_compatibility( + actual_version, expected_version + ) + + +static func _server_status_compatibility( + actual_version: String, + expected_version: String, + actual_ws_port: int, + expected_ws_port: int, +) -> Dictionary: + return ServerLifecycleManager._server_status_compatibility( + actual_version, expected_version, actual_ws_port, expected_ws_port + ) + + +static func _managed_record_has_version_drift(record_version: String, current_version: String) -> bool: + return ServerLifecycleManager._managed_record_has_version_drift(record_version, current_version) + + +static func _probe_live_server_status(port: int, timeout_ms: int = SERVER_STATUS_PROBE_TIMEOUT_MS) -> Dictionary: + var result := { + "reachable": false, + "version": "", + "name": "", + "ws_port": 0, + "status_code": 0, + "error": "", + } + var client := HTTPClient.new() + var err := client.connect_to_host("127.0.0.1", port) + if err != OK: + result["error"] = "connect_%d" % err + return result + var deadline := Time.get_ticks_msec() + timeout_ms + while client.get_status() == HTTPClient.STATUS_RESOLVING or client.get_status() == HTTPClient.STATUS_CONNECTING: + client.poll() + if Time.get_ticks_msec() >= deadline: + result["error"] = "connect_timeout" + return result + OS.delay_msec(10) + if client.get_status() != HTTPClient.STATUS_CONNECTED: + result["error"] = "connect_status_%d" % client.get_status() + return result + err = client.request(HTTPClient.METHOD_GET, SERVER_STATUS_PATH, ["Accept: application/json"]) + if err != OK: + result["error"] = "request_%d" % err + return result + var body := PackedByteArray() + while true: + var status := client.get_status() + if status == HTTPClient.STATUS_REQUESTING: + client.poll() + elif status == HTTPClient.STATUS_BODY: + client.poll() + var chunk := client.read_response_body_chunk() + if chunk.size() > 0: + body.append_array(chunk) + elif status == HTTPClient.STATUS_CONNECTED: + break + else: + result["error"] = "response_status_%d" % status + return result + if Time.get_ticks_msec() >= deadline: + result["error"] = "response_timeout" + return result + OS.delay_msec(10) + var response_code := client.get_response_code() + result["status_code"] = response_code + if response_code != 200: + result["error"] = "http_%d" % response_code + return result + var parsed = JSON.parse_string(body.get_string_from_utf8()) + if not (parsed is Dictionary): + result["error"] = "invalid_json" + return result + result.merge(_project_status_payload(parsed), true) + return result + + +## Project a parsed `/godot-ai/status` body into the probe's result shape. +## +## Extracted from the probe so it can be tested against a real payload. The +## probe is a whitelist — a field the server publishes does not reach callers +## unless it is copied here — and that is silent: the consumer just sees a +## missing key. #824's lease check shipped reading `active_lease_count` while +## this projection dropped it, so the branch was dead on every platform, and +## the tests could not see it because they hand-built the result dict this +## function is supposed to produce. Add new fields here, and cover them with a +## projection test rather than a fabricated `live_status`. +static func _project_status_payload(parsed: Dictionary) -> Dictionary: + var projected := { + "reachable": true, + "name": str(parsed.get("name", "")), + "version": _extract_server_version(parsed), + "ws_port": int(parsed.get("ws_port", 0)), + ## `package_path` was added in v2.4.4 (#416) so the dock's + ## "Incompatible server" banner can name the source of a version + ## skew. Older servers omit it; treat the missing field as "". + "package_path": str(parsed.get("package_path", "")), + } + ## #824: advisory attach-lease count, consumed by teardown to decide + ## detach-vs-kill. Absent stays absent rather than defaulting to 0, so + ## `ServerLifecycleManager.active_lease_count` keeps distinguishing "backend + ## too old to publish this" from "backend reports zero leases" — both stop + ## the server, but only one of them is a compatibility statement. + ## Anything that is not a finite whole number is dropped, for the same + ## reason the value is clamped downstream: a malformed count must not read + ## as occupancy and keep a server alive. Godot parses every JSON number as + ## a float, so the whole-number test is what distinguishes a real count + ## from junk — truncating 1.5 to 1 would manufacture a held lease. + var raw: Variant = parsed.get("active_lease_count") + if raw is int or raw is float: + var numeric := float(raw) + if is_finite(numeric) and numeric == floor(numeric): + projected["active_lease_count"] = int(numeric) + return projected + + +func _probe_live_server_status_for_port(port: int) -> Dictionary: + _startup_trace_count("http_status_probe") + return _probe_live_server_status(port) + + +static func _extract_server_version(payload: Dictionary) -> String: + var version := str(payload.get("server_version", "")) + if version.is_empty(): + version = str(payload.get("version", "")) + return version + + +static func _live_status_identifies_godot_ai(live: Dictionary) -> bool: + return ServerLifecycleManager._live_status_identifies_godot_ai(live) + + +func _verified_status_version(live: Dictionary) -> String: + if not ServerLifecycleManager._live_status_identifies_godot_ai(live): + return "" + return str(live.get("version", "")) + + +func _verified_status_ws_port(live: Dictionary) -> int: + if not ServerLifecycleManager._live_status_identifies_godot_ai(live): + return 0 + return int(live.get("ws_port", 0)) + + +func _refresh_dock_client_statuses() -> bool: + if _dock == null: + return false + if not _dock.has_method("_refresh_all_client_statuses"): + return false + _dock.call("_refresh_all_client_statuses") + return true + + +## Test-fixture shim — characterization tests in test_plugin_lifecycle +## still drive the first-writer-wins terminal-diagnosis behaviour through +## this method. Delegates to the manager's `set_terminal_diagnosis` +## (which preserves the same first-writer-wins contract). +func _set_spawn_state(state: int) -> void: + _lifecycle.set_terminal_diagnosis(state) + + +## Arm the one-shot connection watcher. Called from `_start_server`'s +## FOREIGN_PORT branch: we flagged the diagnostic preemptively assuming +## the port holder doesn't speak MCP, but if it turns out to be another +## editor's server our WebSocket will open and we need to retract the +## diagnostic. +## +## We intentionally poll `_connection.is_connected` from `_process` +## instead of wiring a new signal on McpConnection. A signal added in the +## same release as a new consumer would be another shape-coupled update: +## old two-phase runners can parse the consumer while the McpConnection +## Script object still reflects v(N). Polling only reads `is_connected` +## (present on every shipped McpConnection), so old-runner upgrade windows +## do not depend on a same-release signal addition. +## +## The watch self-disarms after SPAWN_GRACE_MS so per-frame cost drops +## back to zero if it is ever armed by a legacy adoption path. +func _watch_for_adoption_confirmation() -> void: + _lifecycle.arm_adoption_watch() + _update_process_enabled() + + +func _arm_server_version_check() -> void: + ## `arm_version_check` resolves an empty expected via the plugin + ## version, so we can pass the raw field value through. + _lifecycle.arm_version_check(_connection, str(_lifecycle._server_expected_version)) + _update_process_enabled() + + +func _update_process_enabled() -> void: + if _lifecycle == null: + set_process(false) + return + set_process( + _lifecycle.get_adoption_watch_deadline_ms() > 0 + or _lifecycle.is_awaiting_server_version() + ) + + +func _process(_delta: float) -> void: + ## Guard: during script-reload / dual-plugin enable races `_lifecycle` + ## can be null while process is still armed — spam would otherwise flood + ## the Output dock every frame. + if _lifecycle == null: + set_process(false) + return + var now := Time.get_ticks_msec() + var version_check = _lifecycle.get_version_check() + if version_check != null: + version_check.tick(now) + _lifecycle.tick_adoption_watch(now) + _update_process_enabled() + + +## A WebSocket opening only proves the occupant speaks enough of the editor +## protocol to accept a session. Compatibility is decided by the server +## version in `handshake_ack`, so this only arms that check. +func _on_connection_established() -> void: + if _lifecycle.get_state() == ServerStateScript.FOREIGN_PORT: + _arm_server_version_check() + + +## Test-fixture shim — characterization tests poke the verified path +## directly. Delegates to the version-check seam; the manager resolves +## an empty expected version via `_resolve_expected_version`. +func _on_server_version_verified(version: String) -> void: + _lifecycle.handle_server_version_verified( + str(_lifecycle._server_expected_version), version + ) + _update_process_enabled() + + +## Test-fixture shim — same shape as `_on_server_version_verified`. +func _on_server_version_unverified() -> void: + _lifecycle.handle_server_version_unverified( + str(_lifecycle._server_expected_version) + ) + _update_process_enabled() + + +## Start a 1s-tick timer that watches the spawned server through its cold-start +## window, then for SERVER_WATCH_MS after pid-file publication. If the process +## dies inside the active window we drain the captured pipes and mark the server +## as crashed so the dock can surface what went wrong. After the window expires +## we close the pipes so they don't pin file descriptors or fill their kernel +## buffers. See #146 and #896. +func _start_server_watch() -> void: + _stop_server_watch() + _server_watch_timer = Timer.new() + _server_watch_timer.wait_time = 1.0 + _server_watch_timer.one_shot = false + _server_watch_timer.timeout.connect(_check_server_health) + add_child(_server_watch_timer) + _server_watch_timer.start() + + +func _stop_server_watch() -> void: + if _server_watch_timer != null: + _server_watch_timer.stop() + _server_watch_timer.queue_free() + _server_watch_timer = null + + +func _check_server_health() -> void: + _lifecycle.check_server_health() + + +## True when the first spawn looks like a stale-uvx-index failure and we +## haven't already retried. Fail signal: launcher process already declared +## dead by the caller, pid-file was never written (Python never got to +## argparse), and we're on the uvx tier (the only tier where `--refresh` +## means anything). Bug #172 — after a fresh PyPI publish, uvx's local +## index metadata keeps saying the new version doesn't exist for ~10 min, +## which cascaded into an infinite reconnect loop pre-#171. Retry-at-spawn +## catches every entry path (Update, Reload Plugin, Reconnect, editor +## restart, crash recovery) — unlike the older Update-only precheck. +func _should_retry_with_refresh() -> bool: + return _retry_with_refresh_allowed( + _lifecycle._refresh_retried, + ClientConfigurator.get_server_launch_mode(), + _read_pid_file(), + ) + + +## Pure decision helper — environment-state readers stay in the instance +## method above, the logic lives here so tests can drive the three inputs +## directly without spoofing static caches or pid-files on disk. +static func _retry_with_refresh_allowed(already_retried: bool, launch_mode: String, pid_from_file: int) -> bool: + return ( + not already_retried + and launch_mode == "uvx" + and pid_from_file == 0 + ) + + +func _respawn_with_refresh() -> void: + _lifecycle.respawn_with_refresh() + + +## Snapshot of the server-spawn outcome for the dock. +## +## `state` is one of the `McpServerState.*` int constants; the dock owns +## the UI copy per state via its own `_crash_body_for_state`. `exit_ms` +## is only meaningful for `CRASHED`. +func get_server_status() -> Dictionary: + return _lifecycle.get_status_dict() + + +## Diagnostic accessor for the dock's ownership label. Positive = a PID this +## plugin instance spawned (or re-acquired via the managed record); -1 = an +## adopted external/attach-owned backend. Display only — adoption transfers +## end-of-life responsibility, so this value is never kill proof (#669). +func get_server_pid() -> int: + return _lifecycle.get_server_pid() + + +func get_resolved_ws_port() -> int: + return _resolved_ws_port + + +func _set_resolved_ws_port(port: int) -> void: + _ws_port_resolution_published = true + _resolved_ws_port = port + if _connection != null: + _connection.ws_port = port + + +## Pure decision helper — environment-state reads (the published flag, the +## EditorSettings port) stay in `_enter_tree`; the logic lives here so tests +## can drive the three inputs directly without mutating the shared statics. +static func _startup_ws_port_seed( + resolution_published: bool, + session_ws_port: int, + configured_ws_port: int +) -> int: + return session_ws_port if resolution_published else configured_ws_port + + +func _resolve_ws_port() -> int: + return PortResolver.resolve_ws_port( + ClientConfigurator.ws_port(), + ClientConfigurator.MAX_PORT, + _log_buffer, + ) + + +## Test-compat shim — characterization tests call this static directly. +static func _resolved_ws_port_for_existing_server( + record_ws_port: int, + record_version: String, + current_version: String, + fresh_resolved: int +) -> int: + return PortResolver.resolved_ws_port_for_existing_server( + record_ws_port, + record_version, + current_version, + fresh_resolved, + ) + + +static func _resolve_ws_port_from_output( + configured_port: int, + netsh_output: String, + span: int = 2048 +) -> int: + return PortResolver.resolve_ws_port_from_output( + configured_port, + netsh_output, + ClientConfigurator.MAX_PORT, + span, + ) + + +## Plugin-level shim around the resolver — keeps the startup-trace +## counter wiring and the `_ProofPlugin` override hook on the plugin. +## The scrape takes `_startup_trace_count` directly so the counter names +## track the scraper that actually ran (Windows can fall through netstat +## → PowerShell; the fallback used to hide under the `netstat` count). +func _is_port_in_use(port: int) -> bool: + if PortResolver.can_bind_local_port(port): + ## POSIX can still have an IPv6 wildcard listener on this port + ## even when an IPv4 loopback bind succeeds. Confirm through + ## lsof so startup and kill-path discovery agree. + if OS.get_name() != "Windows": + return PortResolver.is_port_in_use_via_scrape(port, _startup_trace_count) + return false + return PortResolver.is_port_in_use_via_scrape(port, _startup_trace_count) + + +## Pass `_startup_trace_count` so the resolver bumps the right counter +## per scraper that actually ran (Windows can fall through netstat → +## PowerShell — counting both unconditionally would over-report). +func _find_pid_on_port(port: int) -> int: + return PortResolver.find_pid_on_port(port, _startup_trace_count) + + +func _find_all_pids_on_port(port: int) -> Array[int]: + return PortResolver.find_all_pids_on_port(port, _startup_trace_count) + + +static func _execute_windows_powershell(script: String, output: Array) -> int: + return PortResolver.execute_windows_powershell(script, output) + + +static func _windows_listener_pids_from_execute_result(exit_code: int, output: Array) -> Array[int]: + return PortResolver.windows_listener_pids_from_execute_result(exit_code, output) + + +static func _windows_listener_execute_result_in_use(exit_code: int, output: Array) -> bool: + return PortResolver.windows_listener_execute_result_in_use(exit_code, output) + + +static func _parse_lsof_pids(raw: String) -> Array[int]: + return PortResolver.parse_lsof_pids(raw) + + +static func _parse_pid_lines(raw: String) -> Array[int]: + return PortResolver.parse_pid_lines(raw) + + +## Find the managed server PID deterministically: prefer the pid-file +## the Python server writes on startup (see runtime_info.py), fall back +## to scraping `netstat -ano` / `lsof` only when the file is missing or +## stale. This is the replacement for raw port-scraping: on Windows the +## uvx launcher PID doesn't cover the Python child, and netstat parsing +## is fragile. +## +## Returns 0 when no server can be identified. +func _find_managed_pid(port: int) -> int: + var pid := _read_pid_file() + if pid > 0 and _pid_alive(pid): + return pid + return _find_pid_on_port(port) + + +## `live` is the result of a prior `_probe_live_server_status_for_port` +## call that the caller already has on hand. When non-empty it short- +## circuits the internal probe at the bottom of this helper, so a single +## `_start_server` invocation that probes once at the top can thread the +## same snapshot through compatibility check + recovery without paying +## for a second ~500 ms localhost HTTPClient poll loop. Default `{}` +## preserves the historical behavior for callers outside the spawn flow +## (`can_recover_incompatible_server`, the dock's UI buttons), where a +## fresh probe is the right thing. +## `record_override`: a managed-server record snapshot the caller already +## read. Non-empty skips the internal `_read_managed_server_record()` — +## required when this helper runs on a worker thread (#678), because the +## record lives in EditorSettings, which is main-thread-only. `{}` keeps +## the historical read-it-here behavior for synchronous callers +## (`_read_managed_server_record` never returns a bare `{}`, so the +## sentinel is unambiguous). +func _evaluate_strong_port_occupant_proof(port: int, live: Dictionary = {}, record_override: Dictionary = {}) -> Dictionary: + var result := {"proof": "", "pids": []} + var listener_pids := _find_all_pids_on_port(port) + if listener_pids.is_empty(): + return result + + var record: Dictionary = record_override if not record_override.is_empty() else _read_managed_server_record() + var record_pid := int(record.get("pid", 0)) + var record_version := str(record.get("version", "")) + + if record_pid > 1 and record_pid != OS.get_process_id(): + ## Brand-verify the recorded PID before trusting it as a kill target. + ## A recorded PID can outlive the server it named and be recycled by + ## the kernel for an unrelated process that happens to bind the same + ## port — without the cmdline brand gate (the same one the + ## `pidfile_listener` branch enforces) that process could be killed. + ## See #525. + if ( + listener_pids.has(record_pid) + and _pid_alive_for_proof(record_pid) + and _pid_cmdline_is_godot_ai_for_proof(record_pid) + ): + return {"proof": "managed_record", "pids": [record_pid]} + + var legacy_targets := _legacy_pidfile_kill_targets(port, listener_pids) + if not legacy_targets.is_empty(): + return {"proof": "pidfile_listener", "pids": legacy_targets} + + var current_live: Dictionary = live if not live.is_empty() else _probe_live_server_status_for_port(port) + if ( + _live_status_identifies_godot_ai(current_live) + and not record_version.is_empty() + and str(current_live.get("version", "")) == record_version + ): + ## Brand-check every listener before returning it as a kill target + ## (#686): the /godot-ai/status match proves *a* godot-ai server owns + ## the port, but `listener_pids` is a raw scrape that can include an + ## unrelated process sharing the port number (e.g. a ::1-only + ## listener lsof reports alongside our IPv4 one). The other two tiers + ## brand-check every target (#525); this tier feeds the fully + ## automatic start_server drift-kill path, so it must too. + var branded_listeners: Array[int] = [] + for pid in listener_pids: + var listener_pid := int(pid) + if _pid_cmdline_is_godot_ai_for_proof(listener_pid): + branded_listeners.append(listener_pid) + if not branded_listeners.is_empty(): + return {"proof": "status_matches_record", "pids": branded_listeners} + + return result + + +## See `_evaluate_strong_port_occupant_proof` for the `live` and +## `record_override` contracts. Threads both through the strong-proof +## delegate so neither helper probes when the caller already knows the +## port-owner status, and so callers running this on a worker thread +## (#712) can inject the EditorSettings record read on the main thread. +func _evaluate_recovery_port_occupant_proof( + port: int, live: Dictionary = {}, record_override: Dictionary = {} +) -> Dictionary: + var proof := _evaluate_strong_port_occupant_proof(port, live, record_override) + if not str(proof.get("proof", "")).is_empty(): + return proof + + var current_live: Dictionary = live if not live.is_empty() else _probe_live_server_status_for_port(port) + if _live_status_identifies_godot_ai(current_live): + return {"proof": "status_name", "pids": _find_all_pids_on_port(port)} + + return {"proof": "", "pids": []} + + +## Seam over the static pre-warm so lifecycle recovery flows can fire it +## through the host (`_host._prewarm_server_package(...)`) and test stubs +## can record the call instead of spawning a real uvx process. Worker-safe: +## the static touches only CliFinder (mutex-guarded) and OS.create_process. +func _prewarm_server_package(version: String) -> int: + return ClientConfigurator.prewarm_server_package(version) + + +func _recover_strong_port_occupant(port: int, wait_s: float, pre_kill_live: Dictionary = {}) -> bool: + ## `await` because the manager method is a coroutine in production + ## (#678); with `defer_blocking_work` off it completes synchronously + ## and this await is a pass-through. + return await _lifecycle.recover_strong_port_occupant(port, wait_s, pre_kill_live) + + +func _legacy_pidfile_kill_targets(_port: int, listener_pids: Array[int]) -> Array[int]: + var targets: Array[int] = [] + var pidfile_pid := _read_pid_file_for_proof() + if pidfile_pid <= 1 or pidfile_pid == OS.get_process_id(): + return targets + ## An alive, branded pid-file PID is sufficient ownership proof. Under + ## `uvicorn --reload` the reloader writes the pid-file but a child worker + ## binds the port, so `listener_pids` never contains the reloader PID. + ## Requiring `listener_pids.has(pidfile_pid)` here used to silently skip + ## the kill path for the entire reload-shaped server family. The branded + ## listener loop below still does the per-PID brand check so we never + ## kill an unrelated process that happens to share the port. + if not _pid_alive_for_proof(pidfile_pid) or not _pid_cmdline_is_godot_ai_for_proof(pidfile_pid): + return targets + + for pid in listener_pids: + if pid <= 1 or pid == OS.get_process_id(): + continue + ## Reuse the brand result already proven above when this listener is + ## the same PID as the pidfile — saves a parent-chain walk and a + ## shell-out (PowerShell on Windows, /proc on Linux, ps on macOS) per + ## startup proof evaluation. + if pid == pidfile_pid or _pid_cmdline_is_godot_ai_for_proof(pid): + targets.append(pid) + ## Also kill the reloader/launcher itself when it isn't already a listener. + ## Without this, `--reload` workers would be killed but their parent would + ## immediately respawn a replacement and the port would never free. + if not targets.has(pidfile_pid): + targets.append(pidfile_pid) + return targets + + +func _read_pid_file_for_proof() -> int: + return _read_pid_file() + + +func _pid_alive_for_proof(pid: int) -> bool: + return _pid_alive(pid) + + +func _pid_cmdline_is_godot_ai_for_proof(pid: int) -> bool: + return _pid_cmdline_is_godot_ai(pid) + + +static func _parse_windows_netstat_pid(stdout: String, port: int) -> int: + return PortResolver.parse_windows_netstat_pid(stdout, port) + + +static func _parse_windows_netstat_pids(stdout: String, port: int) -> Array[int]: + return PortResolver.parse_windows_netstat_pids(stdout, port) + + +static func _parse_windows_netstat_listening(stdout: String, port: int) -> bool: + return PortResolver.parse_windows_netstat_listening(stdout, port) + + +static func _split_on_whitespace(s: String) -> PackedStringArray: + return PortResolver.split_on_whitespace(s) + + +static func _read_pid_file() -> int: + return PortResolver.read_pid_file() + + +static func _clear_pid_file() -> void: + PortResolver.clear_pid_file() + + +func _stop_server() -> void: + _lifecycle.stop_server() + + + + +## Clear the managed-server record and pid-file only if `port` is free. +## Returns true when state was cleared. Extracted from `_stop_server` so +## the "preserve on failed kill" contract is independently testable. +func _finalize_stop_if_port_free(port: int) -> bool: + if _is_port_in_use(port): + return false + _clear_managed_server_record() + _clear_pid_file() + return true + + +## Shared tail of the server CLI: transport, ports, and `--pid-file`. Both +## the initial spawn in `_start_server` and the `--refresh` retry in +## `_respawn_with_refresh` go through here so a new flag added in one place +## can't silently drop out of the other. +static func _build_server_flags(port: int, ws_port: int) -> Array[String]: + var flags: Array[String] = [] + flags.assign([ + "--transport", "streamable-http", + "--port", str(port), + "--ws-port", str(ws_port), + "--pid-file", ProjectSettings.globalize_path(SERVER_PID_FILE), + ]) + ## Append `--exclude-domains` only when the user has actually picked at + ## least one domain to drop. Skipping the empty case keeps spawns + ## compatible with older (pre-1.4.2) servers that don't know the flag — + ## relevant during staggered plugin/server upgrades in user-mode installs. + var excluded := ClientConfigurator.excluded_domains() + if not excluded.is_empty(): + flags.append("--exclude-domains") + flags.append(excluded) + ## LAN opt-in (#507, server core #421): pass `--allow-host` only when the + ## developer-mode Settings tab named at least one CIDR / bare IP. Skipping + ## the empty case keeps the default spawn byte-for-byte identical and + ## compatible with older servers that don't know the flag — same pattern + ## as `--exclude-domains` above. + var allow_hosts := ClientConfigurator.allow_hosts() + if not allow_hosts.is_empty(): + flags.append("--allow-host") + flags.append(allow_hosts) + return flags + + +## Returns true only when we can prove `pid`'s command line carries the +## `godot-ai` brand AND a server flag (`--pid-file` / `--transport`). Used by +## automatic kill paths (`_legacy_pidfile_kill_targets`) so a stale pidfile +## whose PID has been recycled by an unrelated listener can't hand us a +## kill target. If the OS lookup fails or returns an empty cmdline we +## conservatively return false — better to surface incompatible-server and +## let the user click Restart than to kill the wrong process. +func _pid_cmdline_is_godot_ai(pid: int) -> bool: + ## Walks up the parent chain so a uvicorn `--reload` worker whose + ## cmdline is just `multiprocessing.spawn` still matches when its + ## parent reloader carries the godot_ai brand. Bound the walk so a + ## hypothetical loop or runaway PPID can't stall the editor. + var current := pid + for _i in range(5): + if current <= 1: + return false + var cmd := "" + if OS.get_name() == "Windows": + cmd = _windows_pid_commandline(current) + else: + cmd = _posix_pid_commandline(current) + if _commandline_is_godot_ai_server(cmd): + return true + current = _pid_parent(current) + return false + + +func _pid_parent(pid: int) -> int: + if pid <= 1: + return 0 + if OS.get_name() == "Windows": + var output: Array = [] + var script := ( + "Get-CimInstance Win32_Process -Filter 'ProcessId = %d' | " + + "Select-Object -ExpandProperty ParentProcessId" + ) % pid + _startup_trace_count("powershell") + if _execute_windows_powershell(script, output) != 0 or output.is_empty(): + return 0 + return int(str(output[0]).strip_edges()) + var output_posix: Array = [] + if OS.execute("ps", ["-o", "ppid=", "-p", str(pid)], output_posix, true) != 0 or output_posix.is_empty(): + return 0 + return int(str(output_posix[0]).strip_edges()) + + +static func _commandline_is_godot_ai_server(cmd: String) -> bool: + if cmd.is_empty(): + return false + var lower := cmd.to_lower() + ## The server is invoked with `--pid-file /godot_ai_server.pid`, + ## so the path itself contains "godot_ai". A naive substring brand + ## search would falsely match an unrelated process whose cmdline + ## happens to reference a similarly-named pidfile path. Strip the + ## value (but leave the bare flag for the has_flag check) before + ## brand matching. + var brand_search := _strip_pidfile_value(lower) + var has_brand := brand_search.find("godot-ai") >= 0 or brand_search.find("godot_ai") >= 0 + var has_flag := lower.find("--pid-file") >= 0 or lower.find("--transport") >= 0 + return has_brand and has_flag + + +static func _strip_pidfile_value(cmd: String) -> String: + var rx := RegEx.new() + ## Match `--pid-file=` and `--pid-file `; keep the bare + ## flag so the flag-presence check still succeeds for a real server. + if rx.compile("--pid-file(?:=|\\s+)\\S+") != OK: + return cmd + return rx.sub(cmd, "--pid-file ", true) + + +func _windows_pid_commandline(pid: int) -> String: + var output: Array = [] + var script := ( + "Get-CimInstance Win32_Process -Filter 'ProcessId = %d' | " + + "Select-Object -ExpandProperty CommandLine" + ) % pid + _startup_trace_count("powershell") + var exit_code := _execute_windows_powershell(script, output) + if exit_code != 0 or output.is_empty(): + return "" + return str(output[0]) + + +## POSIX command-line lookup. Linux exposes `/proc//cmdline` as +## NUL-separated argv — read it directly so we avoid a `ps` fork on Linux +## and get the full argv rather than the truncated/quoted form some `ps` +## builds emit. Falls back to `ps -ww -p -o args=` on macOS / *BSD, +## which lack a Linux-style `/proc//cmdline`. Returns "" on failure +## so callers conservatively reject the PID rather than killing it blind. +func _posix_pid_commandline(pid: int) -> String: + var proc_path := "/proc/%d/cmdline" % pid + if FileAccess.file_exists(proc_path): + var f := FileAccess.open(proc_path, FileAccess.READ) + if f != null: + ## procfs pseudo-files report length 0 (the kernel generates + ## content on read). `get_length()` therefore returns 0 and + ## `get_buffer(0)` reads nothing. Read in chunks until EOF + ## instead. Cap at ARG_MAX-class bound so a hypothetically + ## misbehaving file can never stall the editor frame. + var bytes := PackedByteArray() + var max_bytes := 1 << 20 # 1 MiB + while bytes.size() < max_bytes: + var chunk := f.get_buffer(4096) + if chunk.is_empty(): + break + bytes.append_array(chunk) + if f.eof_reached(): + break + f.close() + ## /proc cmdline is NUL-separated argv; convert NULs to spaces + ## so the substring fingerprint matches the same way it does on + ## the Windows path. Empty (kernel threads, exited processes) + ## bubbles up as "" via the strip below. + for i in range(bytes.size()): + if bytes[i] == 0: + bytes[i] = 0x20 + return bytes.get_string_from_utf8().strip_edges() + ## `-ww` removes ps's column-width truncation so trailing flags like + ## --pid-file / --transport aren't dropped from the args= field. + ## Both procps (Linux) and BSD ps (macOS / *BSD) accept the + ## double-w form. + var output: Array = [] + var exit_code := OS.execute("ps", ["-ww", "-p", str(pid), "-o", "args="], output, true) + if exit_code != 0 or output.is_empty(): + return "" + return str(output[0]).strip_edges() + + +## True if the given PID corresponds to a live (non-zombie) process. +## POSIX uses `ps -o stat=` (see inline comment for the zombie rationale); +## Windows uses `tasklist`. Called by `_start_server` to distinguish a live +## managed server that outlived its editor from a stale EditorSettings +## record, and by `_check_server_health` to detect a fast-failing launcher. +static func _pid_alive(pid: int) -> bool: + return PortResolver.pid_alive(pid) + + +## Calls `_is_port_in_use` (not `PortResolver.wait_for_port_free`) so +## `_ProofPlugin` overrides keep driving the loop. +func _wait_for_port_free(port: int, timeout_s: float) -> void: + var deadline := Time.get_ticks_msec() + int(timeout_s * 1000.0) + while _is_port_in_use(port): + if Time.get_ticks_msec() >= deadline: + push_warning("MCP | port %d still in use after %.1fs — proceeding anyway" % [port, timeout_s]) + return + OS.delay_msec(100) + + +func _read_managed_server_record() -> Dictionary: + var es := EditorInterface.get_editor_settings() + if es == null: + return {"pid": 0, "version": "", "ws_port": 0, "ws_token": "", "keep_alive": false} + var pid: int = 0 + if es.has_setting(MANAGED_SERVER_PID_SETTING): + pid = int(es.get_setting(MANAGED_SERVER_PID_SETTING)) + var version: String = "" + if es.has_setting(MANAGED_SERVER_VERSION_SETTING): + version = str(es.get_setting(MANAGED_SERVER_VERSION_SETTING)) + var ws_port: int = 0 + if es.has_setting(MANAGED_SERVER_WS_PORT_SETTING): + ws_port = int(es.get_setting(MANAGED_SERVER_WS_PORT_SETTING)) + var ws_token: String = "" + if es.has_setting(MANAGED_SERVER_WS_TOKEN_SETTING): + ws_token = str(es.get_setting(MANAGED_SERVER_WS_TOKEN_SETTING)) + var keep_alive := false + if es.has_setting(MANAGED_SERVER_KEEP_ALIVE_SETTING): + keep_alive = bool(es.get_setting(MANAGED_SERVER_KEEP_ALIVE_SETTING)) + return { + "pid": pid, + "version": version, + "ws_port": ws_port, + "ws_token": ws_token, + "keep_alive": keep_alive, + } + + +func _write_managed_server_record(pid: int, version: String, keep_alive: bool = false) -> void: + var es := EditorInterface.get_editor_settings() + if es == null: + return + es.set_setting(MANAGED_SERVER_PID_SETTING, pid) + es.set_setting(MANAGED_SERVER_VERSION_SETTING, version) + es.set_setting(MANAGED_SERVER_WS_PORT_SETTING, _resolved_ws_port) + es.set_setting(MANAGED_SERVER_WS_TOKEN_SETTING, _ws_auth_token) + es.set_setting(MANAGED_SERVER_KEEP_ALIVE_SETTING, keep_alive) + + +## Keep the in-memory token, the connection's handshake field, and (via the +## next _write_managed_server_record) the persisted record in one place so +## the three can't drift. Empty token = "send no auth_token field". +func _set_ws_auth_token(token: String) -> void: + _ws_auth_token = token + if _connection != null: + _connection.auth_token = token + + +func _clear_managed_server_record() -> void: + ## Drop the in-memory token together with the persisted one: a cleared + ## record means "no managed server", and a surviving static would make + ## the next handshake send a stale token — the exact present-but-wrong + ## shape a newer spawned server rejects with 4003. (Runs before the + ## es == null early return on purpose: the in-memory scrub must not + ## depend on EditorSettings being available.) + _set_ws_auth_token("") + var es := EditorInterface.get_editor_settings() + if es == null: + return + if es.has_setting(MANAGED_SERVER_PID_SETTING): + es.set_setting(MANAGED_SERVER_PID_SETTING, 0) + if es.has_setting(MANAGED_SERVER_VERSION_SETTING): + es.set_setting(MANAGED_SERVER_VERSION_SETTING, "") + if es.has_setting(MANAGED_SERVER_WS_PORT_SETTING): + es.set_setting(MANAGED_SERVER_WS_PORT_SETTING, 0) + if es.has_setting(MANAGED_SERVER_WS_TOKEN_SETTING): + es.set_setting(MANAGED_SERVER_WS_TOKEN_SETTING, "") + if es.has_setting(MANAGED_SERVER_KEEP_ALIVE_SETTING): + es.set_setting(MANAGED_SERVER_KEEP_ALIVE_SETTING, false) + + +func prepare_for_update_reload() -> void: + if _dispatcher != null: + # Stop accepting handler work and hand any live status worker to its + # frame-polled teardown coroutine. _exit_tree() calls clear() again; the + # second call is intentionally inert because the caches are empty. + _dispatcher.clear() + _lifecycle.prepare_for_update_reload() + + +func _adopt_compatible_server( + record_version: String, + current_version: String, + owner: int, + record_owns_listener: bool = false +) -> String: + return _lifecycle.adopt_compatible_server( + record_version, + current_version, + owner, + record_owns_listener + ) + + +static func _compatible_adoption_log_message( + owner_label: String, + owned_pid: int, + observed_owner_pid: int, + live_version: String, + live_ws_port: int, + current_version: String +) -> String: + if owner_label == "managed": + return "MCP | adopted managed server (PID %d, live v%s, WS %d, plugin v%s)" % [ + owned_pid, + live_version, + live_ws_port, + current_version + ] + return "MCP | adopted external server owner_pid=%d (live v%s, WS %d, plugin v%s)" % [ + observed_owner_pid, + live_version, + live_ws_port, + current_version + ] + + +## Hand the self-update over to a tiny runner that is not owned by this +## EditorPlugin. The runner keeps the editor process alive, but disables this +## plugin before extracting/scanning the new scripts so every plugin-owned +## instance tears down on pre-update bytecode and pre-update field storage. +func install_downloaded_update(zip_path: String, temp_dir: String, source_dock: Control) -> void: + prepare_for_update_reload() + + var detached_dock = null + if _dock != null and is_instance_valid(_dock): + detached_dock = _dock + remove_control_from_docks(_dock) + _dock = null + elif source_dock != null and is_instance_valid(source_dock): + detached_dock = source_dock + remove_control_from_docks(source_dock) + + var runner = UPDATE_RELOAD_RUNNER_SCRIPT.new() + var parent: Node = EditorInterface.get_base_control() + if parent == null: + parent = get_tree().root + parent.add_child(runner) + runner.start(zip_path, temp_dir, detached_dock) + + +func can_recover_incompatible_server() -> bool: + return _lifecycle.can_recover_incompatible_server() + + +func _resume_connection_after_recovery() -> void: + if _connection == null: + return + var state: int = _lifecycle.get_state() + if ( + _lifecycle.is_connection_blocked() + or ( + state != ServerStateScript.SPAWNING + and state != ServerStateScript.READY + ) + ): + return + _connection.connect_blocked = false + _connection.connect_block_reason = "" + _connection.server_version = "" + _connection.set_process(true) + _arm_server_version_check() + + +func recover_incompatible_server(user_initiated: bool = true, stale_version: String = "") -> bool: + ## A user's click (the dock's Restart) authorizes the bounded + ## stale-occupant retry for this episode, so a bridge respawning the old + ## version and winning the post-kill bind race gets re-killed + ## automatically instead of dead-ending the click in a terminal state. + ## The automatic triggers (post-update handshake mismatch, fast-exit + ## re-walk) call with `user_initiated=false` and only SPEND from the + ## already-authorized budget — re-arming there would unbound the + ## kill/respawn loop against a persistent respawner. + if user_initiated: + _lifecycle.authorize_stale_recovery() + ## `await` because the manager's recovery is a coroutine in production + ## (#678): `_resume_connection_after_recovery` gates on the post-walk + ## state, so it must not run until the respawn walk has completed. With + ## `defer_blocking_work` off this completes synchronously. + if not await _lifecycle.recover_incompatible_server(stale_version): + return false + _resume_connection_after_recovery() + return true + + +## Kill whichever process is holding `http_port()` right now — by resolving +## the port-owning PID via pid-file / netstat / lsof, independent of whether +## we ever set the manager's `_server_pid` — then clear ownership state +## and respawn via the lifecycle manager. The dock's version-mismatch +## banner wires here when the plugin adopted a foreign server whose +## `server_version` drifts from the current plugin version. +func force_restart_server() -> void: + _lifecycle.force_restart_server() + + +## Single entry point for the dock's primary "Restart Dev Server" button. +## The user clicking Restart is explicit consent to take over the HTTP port, +## so this is aggressive: any PID holding the port gets killed (managed, +## branded-dev, or orphan multiprocessing.spawn workers whose parent died +## so brand detection misses them). After the port frees we spawn a fresh +## --reload dev server. Returns true if a kill happened, false if the port +## was already free and we just spawned. +func force_restart_or_start_dev_server() -> bool: + var port := ClientConfigurator.http_port() + var killed := false + if has_managed_server(): + _lifecycle.reset_for_force_restart() + if _is_port_in_use(port): + _kill_processes_and_windows_spawn_children(_find_all_pids_on_port(port)) + killed = true + if killed: + ## OS.kill returns synchronously but uvicorn's listener can take + ## longer to release the port. Without this wait, start_dev_server's + ## fixed 500ms timer races the old shutdown and the new --reload + ## spawn fails to bind. + _wait_for_port_free(port, 5.0) + start_dev_server() + return killed + + +func start_dev_server() -> void: + ## Start a dev server with --reload that survives plugin reloads. + ## Kills any managed server first, waits for the port to free, then spawns. + ## + ## PYTHONPATH handling: when `res://` sits inside a checkout that owns a + ## `src/godot_ai/` (root repo or a git worktree), prepend that `src/` to + ## PYTHONPATH so `import godot_ai` and uvicorn's `reload_dirs` both pick + ## up *this* tree's source rather than the root repo's editable install. + ## On the root repo the path matches the installed package, so this is a + ## no-op; in a worktree it's what makes `--reload` actually watch the + ## worktree's Python. See #84. + _stop_server() + get_tree().create_timer(0.5).timeout.connect(func(): + var server_cmd := ClientConfigurator.get_server_command() + if server_cmd.is_empty(): + push_warning("MCP | could not find server command for dev server") + return + + var cmd: String = server_cmd[0] + _set_resolved_ws_port(_resolve_ws_port()) + var inner_args: Array[String] = [] + inner_args.assign(server_cmd.slice(1)) + inner_args.append_array([ + "--transport", "streamable-http", + "--port", str(ClientConfigurator.http_port()), + "--ws-port", str(_resolved_ws_port), + "--reload", + ]) + + var worktree_src := ClientConfigurator.find_worktree_src_dir(ProjectSettings.globalize_path("res://")) + var prev_pythonpath := OS.get_environment("PYTHONPATH") + if not worktree_src.is_empty(): + var sep := ";" if OS.get_name() == "Windows" else ":" + var new_pp := worktree_src if prev_pythonpath.is_empty() else worktree_src + sep + prev_pythonpath + OS.set_environment("PYTHONPATH", new_pp) + + var injected_telemetry: bool = _lifecycle._inject_telemetry_env() + var pid := OS.create_process(cmd, inner_args) + if injected_telemetry: + OS.unset_environment("GODOT_AI_DISABLE_TELEMETRY") + + ## Restore PYTHONPATH immediately — the spawned child has already + ## copied the env, so the editor's own process state returns to + ## baseline. Leaving it set would leak to any later OS.create_process + ## from unrelated paths. + if not worktree_src.is_empty(): + if prev_pythonpath.is_empty(): + OS.unset_environment("PYTHONPATH") + else: + OS.set_environment("PYTHONPATH", prev_pythonpath) + + if pid > 0: + ## Match `server_lifecycle.gd::start_server`'s log wording — + ## "prefix" since we prepended to any pre-existing PYTHONPATH, + ## not replaced it. See #429 review. + var suffix := " (PYTHONPATH prefix=%s)" % worktree_src if not worktree_src.is_empty() else "" + print("MCP | started dev server with --reload (PID %d): %s %s%s" % [pid, cmd, " ".join(inner_args), suffix]) + else: + push_warning("MCP | failed to start dev server") + ) + + +func stop_dev_server() -> void: + ## Stop any server running on the HTTP port (by port, not PID). + ## Used for dev servers whose PID we don't track across reloads. + if _lifecycle.get_server_pid() > 0: + # We have a managed server — use normal stop + _stop_server() + return + ## A suspended startup walk holds pre-kill probe results; without this + ## it can resume against the listener we are about to kill and adopt a + ## dead server. + _lifecycle._invalidate_async_startup() + var port := ClientConfigurator.http_port() + var candidates: Array[int] = [] + for pid in _find_all_pids_on_port(port): + var candidate := int(pid) + if _pid_cmdline_is_godot_ai(candidate): + candidates.append(candidate) + var killed := _kill_processes_and_windows_spawn_children(candidates) + if not killed.is_empty(): + print("MCP | stopped dev server on port %d" % port) + + +## `verify_brand`: re-check `pid_alive` + the godot-ai cmdline brand +## immediately before the kill (#686). Pass true when the proof that +## nominated `pids` was evaluated in an earlier scheduling window (e.g. +## `recover_strong_port_occupant`'s proof runs in one `_run_blocking` task +## and the kill in a second, with main-thread frames in between) — a branded +## target that exits in that gap can have its PID recycled to an innocent +## process. Default false preserves the intentionally-unbranded call sites +## (the dock's explicit-consent Restart button, orphan spawn workers whose +## parent died so brand detection misses them). +func _kill_processes_and_windows_spawn_children(pids: Array[int], verify_brand: bool = false) -> Array[int]: + var unique: Array[int] = [] + for pid in pids: + if pid <= 0 or unique.has(pid): + continue + if verify_brand and not (_pid_alive_for_proof(pid) and _pid_cmdline_is_godot_ai_for_proof(pid)): + continue + unique.append(pid) + if OS.get_name() == "Windows": + for child_pid in _find_windows_spawn_children(unique): + if not unique.has(child_pid): + unique.append(child_pid) + var killed: Array[int] = [] + for pid in unique: + if OS.get_name() == "Windows": + var output: Array = [] + var exit_code := OS.execute("taskkill", ["/PID", str(pid), "/T", "/F"], output, true) + if exit_code == 0 or not _pid_alive(pid): + killed.append(pid) + else: + ## Mirror the Windows branch: only report the PID as killed if + ## the kill succeeded or the process is verifiably gone. + if OS.kill(pid) == OK or not _pid_alive(pid): + killed.append(pid) + return killed + + +func _find_windows_spawn_children(parent_pids: Array[int]) -> Array[int]: + if parent_pids.is_empty(): + var empty: Array[int] = [] + return empty + var found: Array[int] = [] + for parent_pid in parent_pids: + var output: Array = [] + var script := ( + "Get-CimInstance Win32_Process | " + + "Where-Object { $_.CommandLine -like '*spawn_main(parent_pid=%d*' } | " + + "ForEach-Object { $_.ProcessId }" + ) % parent_pid + _startup_trace_count("powershell") + var exit_code := _execute_windows_powershell(script, output) + if exit_code != 0 or output.is_empty(): + continue + for pid in _parse_pid_lines(str(output[0])): + if not found.has(pid): + found.append(pid) + return found + + +func is_dev_server_running() -> bool: + ## Returns true if a branded dev server is running on the HTTP port + ## that we didn't start as managed. + if _lifecycle.get_server_pid() > 0: + return false + for pid in _find_all_pids_on_port(ClientConfigurator.http_port()): + if _pid_cmdline_is_godot_ai(int(pid)): + return true + return false + + +func has_managed_server() -> bool: + ## Returns true if the plugin is currently managing a server process it spawned. + return _lifecycle.has_managed_server() + + +func can_restart_managed_server() -> bool: + ## Restart is allowed only when we have ownership proof. A live PID + ## means this plugin spawned/adopted a managed server; a non-empty + ## managed record is the cross-session proof used by the drift branch. + return _lifecycle.can_restart_managed_server() + + +func _on_custom_tools_changed() -> void: + if _connection == null: + push_warning("MCP | connection isn't established") + return + var tool_list: Array[Dictionary] = [] + ## Send all definitions plus their state: the server hides disabled tools + ## from fresh tools/list responses but retains a callable tombstone so a + ## client using a cached promoted name receives CUSTOM_TOOL_DISABLED. + for spec in _custom_tool_registry.all(): + tool_list.append({ + "name": spec.name, + "description": spec.description, + "params_schema": spec.params_schema, + "source": spec.source, + "deferred": spec.deferred, + "timeout_ms": spec.timeout_ms, + "requires_writable": spec.requires_writable, + "undoable": spec.undoable, + "promoted": spec.promoted, + "enabled": _custom_tool_registry.is_tool_enabled(spec.name) + }) + _connection.send_event("custom_tools_changed", {"tools": tool_list}) + + +## On (re)connect, replay the current custom-tool catalog so tools +## registered before the initial connection or during a disconnect +## window reach the server. send_event silently drops while +## _connected is false (connection.gd::_send_json), so without this +## replay those tools only surface on the next registry mutation. +func _on_connection_state_changed(is_open: bool) -> void: + if is_open and _custom_tool_registry != null: + _on_custom_tools_changed() diff --git a/addons/godot_ai/plugin.gd.uid b/addons/godot_ai/plugin.gd.uid new file mode 100644 index 0000000..4c550dd --- /dev/null +++ b/addons/godot_ai/plugin.gd.uid @@ -0,0 +1 @@ +uid://d3ui3yx6vdigl diff --git a/addons/godot_ai/runtime/draw_recipe.gd b/addons/godot_ai/runtime/draw_recipe.gd new file mode 100644 index 0000000..8204bd7 --- /dev/null +++ b/addons/godot_ai/runtime/draw_recipe.gd @@ -0,0 +1,86 @@ +@tool +extends Control + +## Runtime helper attached by control_draw_recipe. +## Reads an array of op dicts from node metadata under key "_ops" and dispatches +## each to a CanvasItem draw call in _draw(). The ops list is set by the handler +## via set_meta; this script is deterministic — re-setting meta + queue_redraw +## is enough to update the visuals. + +const META_KEY := "_ops" + + +func _ready() -> void: + queue_redraw() + + +func _draw() -> void: + if not has_meta(META_KEY): + return + var ops: Variant = get_meta(META_KEY) + if typeof(ops) != TYPE_ARRAY: + return + for op in ops: + if typeof(op) != TYPE_DICTIONARY: + continue + match op.get("draw", ""): + "line": + draw_line( + op.from, + op.to, + op.color, + float(op.get("width", 1.0)), + bool(op.get("antialiased", false)) + ) + "rect": + # Godot warns if `width` is passed when `filled` is true — + # width has no effect on filled rects. Split the call so we + # only pass width when stroking an outline. + var filled := bool(op.get("filled", true)) + if filled: + draw_rect(op.rect, op.color, true) + else: + draw_rect( + op.rect, + op.color, + false, + float(op.get("width", 1.0)) + ) + "arc": + draw_arc( + op.center, + float(op.radius), + float(op.start_angle), + float(op.end_angle), + int(op.get("point_count", 32)), + op.color, + float(op.get("width", 1.0)), + bool(op.get("antialiased", false)) + ) + "circle": + draw_circle(op.center, float(op.radius), op.color) + "polyline": + draw_polyline( + op.points, + op.color, + float(op.get("width", 1.0)), + bool(op.get("antialiased", false)) + ) + "polygon": + var colors: PackedColorArray = ( + op.colors if op.has("colors") else PackedColorArray([op.color]) + ) + draw_polygon(op.points, colors) + "string": + var font: Font = get_theme_default_font() + if font == null: + continue + draw_string( + font, + op.position, + str(op.text), + int(op.get("align", HORIZONTAL_ALIGNMENT_LEFT)), + float(op.get("max_width", -1.0)), + int(op.get("font_size", 16)), + op.color + ) diff --git a/addons/godot_ai/runtime/draw_recipe.gd.uid b/addons/godot_ai/runtime/draw_recipe.gd.uid new file mode 100644 index 0000000..5de2df2 --- /dev/null +++ b/addons/godot_ai/runtime/draw_recipe.gd.uid @@ -0,0 +1 @@ +uid://da3fqfqv6gtgm diff --git a/addons/godot_ai/runtime/editor_logger.gd b/addons/godot_ai/runtime/editor_logger.gd new file mode 100644 index 0000000..2d19daa --- /dev/null +++ b/addons/godot_ai/runtime/editor_logger.gd @@ -0,0 +1,139 @@ +@tool +extends Logger + +## Editor-process Logger subclass. +## +## NOTE: deliberately no `class_name`. Registered from plugin.gd::_enter_tree +## so we can intercept editor-process script errors — parse errors, @tool +## runtime errors, EditorPlugin errors, push_error/push_warning — and surface +## them via `logs_read(source="editor")`. Without this, the LLM sees nothing +## in `logs_read` while the same errors show in red lines in Godot's Output +## panel. +## +## Why only `_log_error` and not `_log_message`: +## `_log_message(msg, error)` covers print() and printerr(), which is the +## firehose path — running editors print thousands of internal info lines +## a session. The issue (#231) explicitly asks to filter so the buffer +## isn't drowned. Errors and warnings flow through `_log_error` (parse +## errors, push_error/push_warning, runtime errors), which is what +## debugging callers actually need. If we discover @tool printerr() is a +## valuable source later, _log_message can be added behind the same filter. +## +## Logger virtuals can be called from any thread (e.g. async script +## loaders push parse errors off the main thread). McpEditorLogBuffer is +## mutex-protected so we can append directly without an intermediate queue. + +const ADDON_PATH_MARKER := "/addons/godot_ai/" + +## Resolve McpLogBacktrace by path, not by the `McpLogBacktrace` class_name. +## A bare class_name reference depends on the global class-name table being populated +## at compile time, which isn't guaranteed on a cold editor enable mid-scan. +## `const preload` resolves at compile time independent of the registry — +## matches game_logger.gd's deliberate choice for the same reason. +const _LogBacktrace := preload("res://addons/godot_ai/utils/log_backtrace.gd") + +## Constructor-injected so the hot path doesn't need a per-call null check. +var _buffer + + +func _init(buffer = null) -> void: + _buffer = buffer + + +func _log_error( + function: String, + file: String, + line: int, + code: String, + rationale: String, + _editor_notify: bool, + error_type: int, + script_backtraces: Array, +) -> void: + if _buffer == null: + return + ## Cheap reject for the firehose: when `file` is already non-user (the + ## bulk of editor-internal C++ chatter), there's no backtrace to remap + ## from, and the message doesn't name a project resource, the resolved + ## path can only stay non-user — drop without paying for resolve_error's + ## call frame + dict allocation. + var message := rationale if not rationale.is_empty() else code + var message_res_path := _extract_user_res_path(message) + if not _is_user_script(file) and script_backtraces.is_empty() and message_res_path.is_empty(): + return + var resolved := _LogBacktrace.resolve_error( + function, file, line, code, rationale, error_type, script_backtraces, + ) + if not _is_user_script(resolved.path): + if message_res_path.is_empty(): + return + resolved.path = message_res_path + resolved.line = 0 + resolved.function = function + _update_resolved_details(resolved) + if _is_in_godot_ai_addon(resolved.path): + return + if not message_res_path.is_empty() and _is_in_godot_ai_addon(message_res_path): + return + var details: Dictionary = resolved.get("details", {}) + _buffer.append(resolved.level, resolved.message, resolved.path, resolved.line, resolved.function, details) + + +static func _update_resolved_details(resolved: Dictionary) -> void: + var details: Dictionary = resolved.get("details", {}) + if details.is_empty(): + return + details["resolved"] = { + "path": resolved.get("path", ""), + "line": resolved.get("line", 0), + "function": resolved.get("function", ""), + } + resolved["details"] = details + + +## Predicate broken out so tests can drive the path-filter logic without +## constructing real Logger calls. +static func _is_user_script(path: String) -> bool: + if path.is_empty(): + return false + ## Match .gd / .cs (case-insensitively to handle .GD on case-insensitive + ## filesystems). C# scripts compile elsewhere but the parser path can + ## still surface .cs files for assembly load failures. + var lower := path.to_lower() + return lower.ends_with(".gd") or lower.ends_with(".cs") + + +## Path-substring check works for both `res://addons/godot_ai/foo.gd` and +## globalized absolute paths (`/Users/.../addons/godot_ai/foo.gd`) that +## Godot can also report depending on where the error originated. +static func _is_in_godot_ai_addon(path: String) -> bool: + if path.begins_with("res://addons/godot_ai/"): + return true + return path.find(ADDON_PATH_MARKER) >= 0 + + +## Some engine-origin errors have no ScriptBacktrace even though they are +## project-relevant, notably ResourceLoader failures: +## `Failed loading resource: res://does/not/exist.tres.`. Capture these by +## extracting a named `res://` path from the message while keeping editor +## internals and this addon's own resources filtered. +static func _extract_user_res_path(message: String) -> String: + var start := message.find("res://") + if start < 0: + return "" + var end := message.length() + var quote_end := message.find("'", start) + if quote_end >= 0: + end = mini(end, quote_end) + quote_end = message.find("\"", start) + if quote_end >= 0: + end = mini(end, quote_end) + quote_end = message.find("`", start) + if quote_end >= 0: + end = mini(end, quote_end) + var path := message.substr(start, end - start).strip_edges() + while not path.is_empty() and path.substr(path.length() - 1, 1) in [".", ",", ";", ":", ")"]: + path = path.substr(0, path.length() - 1) + if path.is_empty() or _is_in_godot_ai_addon(path): + return "" + return path diff --git a/addons/godot_ai/runtime/editor_logger.gd.uid b/addons/godot_ai/runtime/editor_logger.gd.uid new file mode 100644 index 0000000..9db6035 --- /dev/null +++ b/addons/godot_ai/runtime/editor_logger.gd.uid @@ -0,0 +1 @@ +uid://cxfregddqj5b8 diff --git a/addons/godot_ai/runtime/game_helper.gd b/addons/godot_ai/runtime/game_helper.gd new file mode 100644 index 0000000..ff4fb4e --- /dev/null +++ b/addons/godot_ai/runtime/game_helper.gd @@ -0,0 +1,1317 @@ +extends Node + +## Godot AI MCP — game-process helper. +## +## Registered as an autoload by plugin.gd when the Godot AI plugin is enabled. +## Runs in the running game process (separate from the editor) so the plugin +## can request the game's framebuffer over the editor-debugger channel. +## +## The editor never has direct access to the game's pixels: even when "Embed +## Game Mode" is on, the game is still a separate OS child process whose +## window is reparented into the editor via Win32 SetParent / X11 +## XReparentWindow / macOS remote layer (Godot PR godotengine/godot#99010). +## So viewport-texture capture on the editor side never contains game pixels. +## This autoload solves that by replying to "mcp:take_screenshot" debug +## messages with a PNG of Viewport.get_texture() from inside the game. +## +## No-ops in the editor (Engine.is_editor_hint) and silently sits idle +## when the debugger channel is inactive (e.g. exported release builds) +## — register_message_capture is safe to call either way, it's +## send_message that requires an active channel. + +const CAPTURE_PREFIX := "mcp" +## Cap per-frame flush so a runaway print loop can't blow the debugger's +## packet budget in a single send. Surplus stays queued for the next frame. +const FLUSH_BATCH_LIMIT := 200 +## How long take_screenshot waits for the game's first real presentation +## before reading the viewport texture back. The "mcp" capture registers in +## this autoload's _ready(), which runs BEFORE the main scene enters the tree +## and before the renderer has presented anything — so a request arriving +## right after mcp:hello would otherwise read back the clear-color +## framebuffer (observed as a uniform RGB(77,77,77) PNG on GitHub's +## GPU-less paravirtualized macOS runners, where the first present lags +## seconds behind boot). MUST stay below the editor-side reply timer +## (DEFAULT_TIMEOUT_SEC = 8.0 in debugger/mcp_debugger_plugin.gd) so a +## game that genuinely can't render falls through to the existing +## texture/image error replies before the editor gives up with its +## generic timeout. +const FIRST_FRAME_WAIT_SEC := 6.0 +## #777: how long the main loop can go without ticking _process before +## _handle_take_screenshot treats it as frozen and commits a synchronous +## stale-frame capture instead of awaiting frames that will never come. +## A backgrounded/minimized play-in-editor game stops iterating its main +## loop entirely, so any real threshold works; 1s keeps a merely-slow game +## (heavy frame, low FPS) on the fresh-frame await path. +const MAIN_LOOP_STALL_MSEC := 1000 +## How long frames_drawn can stay flat before _handle_take_screenshot treats +## rendering as suppressed and commits the synchronous stale-frame capture. +## On Windows, minimizing the game window freezes frame presentation but NOT +## the main loop — _process keeps ticking, so the MAIN_LOOP_STALL_MSEC beacon +## never trips and every capture used to burn the full FIRST_FRAME_WAIT_SEC +## await before replying stale (issue #794 smoke, item 1b). Larger than the +## loop threshold so a heavy-but-rendering game (~1 FPS frame gaps) stays on +## the fresh-frame await path; a sub-0.7 FPS game that trips this still gets +## an honestly stale-flagged image immediately instead of a 6s wait. +const RENDER_STALL_MSEC := 1500 + +const GameLogger := preload("res://addons/godot_ai/runtime/game_logger.gd") +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") +## Shared with the editor-side copy in editor_handler.gd (#716). Preload by +## path, not class_name: this autoload runs in the game process and must not +## depend on the editor's global-class cache being warm. +const ScreenshotEncode := preload("res://addons/godot_ai/utils/screenshot_encode.gd") + +var _registered := false +## Captures game-process print, warning, and error output for the editor. +var _logger: Logger +var _logger_attached := false +## Entries drained from the logger but not yet sent over the debugger +## channel. Holds the tail of one drain() so we can bleed it out across +## frames at FLUSH_BATCH_LIMIT per frame rather than blasting the whole +## queue in a single _process tick. +var _pending_outbound: Array = [] +## #490: in-flight evals, keyed by request_id (multiple deferred game_evals +## can run at once). Each entry: {node:Node, token:String, baseline:int}. +## `token` names this eval's unique wrapper function so a runtime error is +## attributed only to the eval that actually raised it — not an unrelated +## background game error, and not a sibling overlapping eval. `baseline` is the +## logger's script-error seq just before this eval ran. The editor's eval_check +## probe (and #488's in-flight poll loop, when the game is focused) consult +## these to report a runtime error that aborted execute() before the reply. +var _inflight_evals: Dictionary = {} +var _eval_token_counter: int = 0 +## #777: last time _process ran, in ticks msec. The debugger message capture +## stays live while a backgrounded game's main loop is frozen, so this is how +## _handle_take_screenshot (running inside that capture) detects the freeze +## synchronously. -1 until the first tick. +var _last_loop_tick_msec: int = -1 +## Rendering-freeze beacon for the Windows-minimize state (#794 smoke, 1b): +## the frames_drawn value last observed in _process, and when it last +## advanced. -1 until the first observed advance, so a booting or +## render-less game (frames_drawn stuck at 0) can never read as +## render-stalled and keeps the fresh-frame await path's error replies. +var _last_frames_drawn_seen: int = -1 +var _last_frames_advance_msec: int = -1 +## #859: test/diagnostic seam for the synchronous eval liveness reply. The +## debugger capture remains callable while the game loop is parked, so the +## reply reports whether the _process beacon is actually advancing rather +## than merely proving that the capture was registered once. +var _last_eval_liveness_reply: Dictionary = {} + + +func _ready() -> void: + ## Only run in the game process, not in the editor. Use is_editor_hint + ## — NOT OS.has_feature("editor"), which is a BUILD-config check + ## (TOOLS_ENABLED) and returns true in the game subprocess too because + ## the game is spawned with the same editor binary. is_editor_hint is + ## the runtime-context check: true only inside the editor GUI, false + ## in play-from-editor. The earlier has_feature check was causing us + ## to skip registration in the game and time out every capture. + if Engine.is_editor_hint(): + return + ## Keep ticking while the tree is paused: _process both ferries game logs + ## and timestamps main-loop liveness for the stalled-loop screenshot + ## fallback (#777). A paused game still iterates its loop and renders, and + ## must not be misread as frozen. + process_mode = Node.PROCESS_MODE_ALWAYS + ## register_message_capture is safe to call before the debugger + ## handshake completes; the capture sits until a message arrives. + EngineDebugger.register_message_capture(CAPTURE_PREFIX, _on_debug_message) + _registered = true + ## Capture print() / printerr() / push_error() / push_warning() and + ## ferry them to the editor in mcp:log_batch messages flushed from + ## _process. + _logger = GameLogger.new() + OS.add_logger(_logger) + _logger_attached = true + ## Routed to the editor's Output panel via Godot's remote-stdout + ## forwarder — handy when diagnosing why capture timed out. + print("[godot_ai game_helper] registered mcp capture (debugger active=%s, logger=%s)" + % [EngineDebugger.is_active(), _logger_attached]) + ## Boot beacon so the editor side can confirm the autoload ran even + ## if no screenshot was ever requested. + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:hello", []) + + +func _process(_delta: float) -> void: + ## #777: liveness beacon for _handle_take_screenshot's stalled-loop check. + ## Recorded before the early returns below so the signal stays truthful + ## even when the logger or debugger channel is unavailable. + _last_loop_tick_msec = Time.get_ticks_msec() + ## Rendering beacon: on Windows a minimized game keeps ticking _process + ## while presentation stops, so frames_drawn stagnation — not loop + ## silence — is the observable freeze signal there (#794 smoke, 1b). + var frames_now := Engine.get_frames_drawn() + if frames_now != _last_frames_drawn_seen: + _last_frames_drawn_seen = frames_now + _last_frames_advance_msec = _last_loop_tick_msec + ## Drain the logger queue on the main thread (Logger virtuals can fire + ## from any thread; EngineDebugger.send_message is only safe from main). + ## Send at most one FLUSH_BATCH_LIMIT-sized batch per frame so a runaway + ## print loop can't stall the game by shoving thousands of entries + ## through the debugger packet path in a single tick. Surplus stays in + ## `_pending_outbound` and bleeds out across subsequent frames. + if not _logger_attached or _logger == null: + return + if not EngineDebugger.is_active(): + return + if _pending_outbound.is_empty(): + if not _logger.has_pending(): + return + _pending_outbound = _logger.drain() + var batch := _pending_outbound.slice(0, FLUSH_BATCH_LIMIT) + _pending_outbound = _pending_outbound.slice(FLUSH_BATCH_LIMIT) + EngineDebugger.send_message("mcp:log_batch", [batch]) + + +func _exit_tree() -> void: + if _registered: + EngineDebugger.unregister_message_capture(CAPTURE_PREFIX) + _registered = false + if _logger_attached and _logger != null: + OS.remove_logger(_logger) + _logger_attached = false + _logger = null + + +## Dispatched for messages prefixed "mcp:" on the debugger channel. +## Godot passes the full message ("mcp:take_screenshot") to the capture +## callable; trim defensively so tests can still call the helper with either +## form. +func _on_debug_message(message: String, data: Array) -> bool: + var action := message.trim_prefix("mcp:") + match action: + "take_screenshot": + _handle_take_screenshot(data) + return true + "eval_liveness": + _reply_eval_liveness(data) + return true + "eval": + _handle_eval(data) + return true + "eval_check": + _handle_eval_check(data) + return true + "game_command": + _handle_game_command(data) + return true + return false + + +## #859: answer from the debugger capture without awaiting a game frame. The +## capture can still run while a backgrounded/frozen game's main loop cannot, +## so the _process beacon is the liveness signal that matters for game_eval. +func _reply_eval_liveness(data: Array) -> void: + var request_id: String = data[0] if data.size() > 0 else "" + var loop_live := not _main_loop_appears_stalled() + _last_eval_liveness_reply = {"request_id": request_id, "loop_live": loop_live} + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:eval_liveness_response", [request_id, loop_live]) + + +func _handle_take_screenshot(data: Array) -> void: + var request_id: String = data[0] if data.size() > 0 else "" + var max_resolution: int = int(data[1]) if data.size() > 1 else 0 + + var tree := get_tree() + var viewport := tree.root if tree != null else null + if viewport == null: + _reply_error(request_id, "No game root viewport available") + return + + ## #777: this function runs inside the debugger message capture, which + ## stays live even when a backgrounded/minimized play-in-editor game has + ## frozen its main loop. In that state awaiting `process_frame` parks + ## this coroutine forever — no reply is ever sent, and the game side + ## cannot self-timeout because timers need the same frozen loop. Commit a + ## synchronous capture of the last rendered frame instead: stale, but a + ## real image, flagged as such in the reply. Only fall through to the + ## fresh-frame awaits when the loop is demonstrably alive. + if _should_capture_stale_sync( + _main_loop_appears_stalled(), + _rendering_appears_stalled(), + tree.current_scene != null, + Engine.get_frames_drawn() + ): + _capture_and_reply(request_id, viewport, max_resolution, Engine.get_frames_drawn()) + return + + ## Wait (bounded — see FIRST_FRAME_WAIT_SEC) until the main scene is in + ## the tree and at least one frame has been drawn after this request, so + ## the readback never precedes the first real present. Past the deadline, + ## fall through anyway: current_scene stays null under a custom main + ## loop, and frames_drawn never advances in a render-less game — both + ## are handled by the texture/image error replies below. + var deadline := Time.get_ticks_msec() + int(FIRST_FRAME_WAIT_SEC * 1000.0) + while tree.current_scene == null and Time.get_ticks_msec() < deadline: + await tree.process_frame + var frames_at_request := Engine.get_frames_drawn() + while Engine.get_frames_drawn() <= frames_at_request and Time.get_ticks_msec() < deadline: + await tree.process_frame + + _capture_and_reply(request_id, viewport, max_resolution, frames_at_request) + + +## #777: pure decision for the synchronous stale-frame path. Sync capture is +## only worth committing when awaiting can't produce a fresh frame — the main +## loop is frozen (macOS/suspend), or the loop still ticks but presentation +## is suppressed (Windows minimize, #794 smoke 1b) — AND the viewport +## plausibly holds a real frame: the main scene is in the tree and at least +## one frame was presented. Without those, the stale readback would be the +## boot clear-color framebuffer — worse than the honest timeout. +static func _should_capture_stale_sync( + loop_stalled: bool, render_stalled: bool, has_current_scene: bool, frames_drawn: int +) -> bool: + return (loop_stalled or render_stalled) and has_current_scene and frames_drawn > 0 + + +## #777: true when _process hasn't ticked within MAIN_LOOP_STALL_MSEC — +## i.e. the main loop is frozen (backgrounded window) or has never run. +func _main_loop_appears_stalled() -> bool: + ## The hello→probe round trip normally follows at least one _process tick. + ## Treat the never-ticked sentinel as stalled defensively rather than + ## dispatching an eval into a game whose main loop has not started. + if _last_loop_tick_msec < 0: + return true + return Time.get_ticks_msec() - _last_loop_tick_msec > MAIN_LOOP_STALL_MSEC + + +## True when frames_drawn has sat flat past RENDER_STALL_MSEC while _process +## kept ticking — Windows minimize suppresses presentation without freezing +## the loop, so the loop beacon alone misses it (#794 smoke, 1b). False until +## the first observed frame advance: a game that has never presented has no +## trustworthy frame to return, and must fall through to the await path's +## texture/image error replies instead. +func _rendering_appears_stalled() -> bool: + if _last_frames_advance_msec < 0: + return false + return Time.get_ticks_msec() - _last_frames_advance_msec > RENDER_STALL_MSEC + + +## Read back the viewport texture and reply — fully synchronous, so it is +## safe to call from the debugger capture while the main loop is frozen. +## `frames_at_request` is Engine.get_frames_drawn() at request receipt: if no +## further frame was drawn by capture time, the image predates the request +## and the reply is flagged stale. +func _capture_and_reply( + request_id: String, viewport: Viewport, max_resolution: int, frames_at_request: int +) -> void: + var texture := viewport.get_texture() + if texture == null: + _reply_error(request_id, "Root viewport has no texture (headless?)") + return + + var image := texture.get_image() + if image == null or image.is_empty(): + _reply_error(request_id, "Captured an empty image from game viewport") + return + + var encoded: Dictionary = ScreenshotEncode.downscale_and_encode(image, max_resolution) + var frames_drawn := Engine.get_frames_drawn() + var stale := frames_drawn <= frames_at_request + + _last_screenshot_reply = { + "kind": "response", + "request_id": request_id, + "frames_drawn": frames_drawn, + "stale": stale, + "width": encoded.width, + "height": encoded.height, + } + if EngineDebugger.is_active(): + ## Fields 7+8 are new in #777; older editors read the first six and + ## ignore the rest. + EngineDebugger.send_message("mcp:screenshot_response", [ + request_id, + encoded.base64, + encoded.width, + encoded.height, + encoded.original_width, + encoded.original_height, + frames_drawn, + stale, + ]) + + +## Testing seam: the last screenshot reply (response or error), recorded +## before hitting the EngineDebugger channel (inactive in the editor-side +## test harness). Mirrors _last_eval_reply. +var _last_screenshot_reply: Dictionary = {} + + +func _reply_error(request_id: String, message: String) -> void: + _last_screenshot_reply = {"kind": "error", "request_id": request_id, "message": message} + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:screenshot_error", [request_id, message]) + + +## --- game_command: curated runtime inspection and input --- + +func _handle_game_command(data: Array) -> void: + var request_id: String = data[0] if data.size() > 0 else "" + var op: String = data[1] if data.size() > 1 else "" + var params_json: String = data[2] if data.size() > 2 else "{}" + + if request_id.is_empty(): + return + if op.is_empty(): + _reply_game_command_error(request_id, "No op provided") + return + + var json := JSON.new() + var parse_err := json.parse(params_json) + if parse_err != OK or not (json.data is Dictionary): + _reply_game_command_error(request_id, "Invalid params JSON") + return + + var result: Dictionary + match op: + "get_scene_tree": + result = _game_get_scene_tree(json.data) + "get_node_info": + result = _game_get_node_info(json.data) + "get_ui_elements": + result = _game_get_ui_elements(json.data) + "input_key": + result = _game_input_key(json.data) + "input_mouse": + result = _game_input_mouse(json.data) + "input_gamepad": + result = _game_input_gamepad(json.data) + "input_action": + result = _game_input_action(json.data) + "input_state": + result = _game_input_state(json.data) + "input_sequence": + ## Async: steps frames and replies itself (deferred), so bail out + ## before the synchronous send below — same shape as the eval and + ## screenshot capture paths. + _run_input_sequence(request_id, json.data) + return + _: + _reply_game_command_error(request_id, "Unknown game op: %s" % op) + return + + result["source"] = "game" + result["op"] = op + EngineDebugger.send_message("mcp:game_command_response", + [request_id, JSON.stringify(_variant_to_json(result))]) + + +func _reply_game_command_error(request_id: String, message: String) -> void: + EngineDebugger.send_message("mcp:game_command_error", [request_id, message]) + + +func _game_get_scene_tree(params: Dictionary) -> Dictionary: + var depth := maxi(0, int(params.get("depth", 10))) + var root := _resolve_runtime_node(str(params.get("root_path", ""))) + if root == null: + return {"root": "", "nodes": [], "total_count": 0, "not_found": params.get("root_path", "")} + + var nodes: Array[Dictionary] = [] + _collect_runtime_nodes(root, 0, depth, nodes) + return { + "root": _runtime_path(root), + "nodes": nodes, + "total_count": nodes.size(), + } + + +func _collect_runtime_nodes(node: Node, current_depth: int, max_depth: int, out: Array[Dictionary]) -> void: + out.append({ + "name": node.name, + "type": node.get_class(), + "path": _runtime_path(node), + "children_count": node.get_child_count(), + }) + if current_depth >= max_depth: + return + for child in node.get_children(): + if child is Node: + _collect_runtime_nodes(child, current_depth + 1, max_depth, out) + + +func _game_get_node_info(params: Dictionary) -> Dictionary: + var path := str(params.get("path", "")) + var node := _resolve_runtime_node(path) + if node == null: + return {"path": path, "found": false} + + var info := { + "path": _runtime_path(node), + "name": node.name, + "type": node.get_class(), + "children_count": node.get_child_count(), + "groups": node.get_groups(), + "found": true, + } + if bool(params.get("include_properties", true)): + info["properties"] = _runtime_node_properties(node) + return info + + +func _game_get_ui_elements(params: Dictionary) -> Dictionary: + var max_depth := maxi(0, int(params.get("max_depth", 10))) + var include_hidden := bool(params.get("include_hidden", false)) + var include_disabled := bool(params.get("include_disabled", true)) + var root_path := str(params.get("root_path", "")) + var root := _resolve_runtime_node(root_path) + if root == null: + return {"root": "", "elements": [], "total_count": 0, "not_found": root_path} + + var elements: Array[Dictionary] = [] + _collect_ui_elements(root, 0, max_depth, include_hidden, include_disabled, elements) + return { + "root": _runtime_path(root), + "elements": elements, + "total_count": elements.size(), + } + + +func _collect_ui_elements( + node: Node, + current_depth: int, + max_depth: int, + include_hidden: bool, + include_disabled: bool, + out: Array[Dictionary] +) -> void: + if node is Control: + var control := node as Control + var visible := _control_visible_in_tree(control) + var disabled := _control_disabled(control) + if (include_hidden or visible) and (include_disabled or not disabled): + out.append(_ui_element_info(control, visible, disabled)) + + if current_depth >= max_depth: + return + for child in node.get_children(): + if child is Node: + _collect_ui_elements( + child, + current_depth + 1, + max_depth, + include_hidden, + include_disabled, + out + ) + + +func _ui_element_info(control: Control, visible: bool, disabled: bool) -> Dictionary: + var info := { + "path": _runtime_path(control), + "name": control.name, + "type": control.get_class(), + "visible": visible, + "disabled": disabled, + "rect": _variant_to_json(control.get_rect()), + "global_rect": _variant_to_json(control.get_global_rect()), + } + if _object_has_property(control, "text"): + info["text"] = str(control.get("text")) + return info + + +func _control_disabled(control: Control) -> bool: + if _object_has_property(control, "disabled"): + return bool(control.get("disabled")) + return false + + +func _control_visible_in_tree(control: Control) -> bool: + if not control.visible: + return false + var parent := control.get_parent() + while parent != null: + if parent is CanvasItem and not (parent as CanvasItem).visible: + return false + parent = parent.get_parent() + if Engine.is_editor_hint(): + return true + return control.is_visible_in_tree() + + +static var _property_name_cache: Dictionary = {} + + +func _object_has_property(obj: Object, property_name: String) -> bool: + var key := _property_cache_key(obj) + if not _property_name_cache.has(key): + var names := {} + for prop in obj.get_property_list(): + names[str(prop.get("name", ""))] = true + _property_name_cache[key] = names + return (_property_name_cache[key] as Dictionary).has(property_name) + + +func _property_cache_key(obj: Object) -> String: + var script = obj.get_script() + if script == null: + return obj.get_class() + var script_id := str(script.get_instance_id()) + if not script.resource_path.is_empty(): + script_id = script.resource_path + return "%s:%s" % [obj.get_class(), script_id] + + +func _runtime_node_properties(node: Node) -> Dictionary: + var props := {} + for p in node.get_property_list(): + var name := str(p.get("name", "")) + var usage := int(p.get("usage", 0)) + if name.is_empty() or (usage & PROPERTY_USAGE_EDITOR) == 0: + continue + props[name] = _variant_to_json(node.get(name)) + return props + + +func _resolve_runtime_node(path: String) -> Node: + var scene_root := _current_scene_root() + if scene_root == null: + return null + if path.is_empty() or path == "/": + return scene_root + + if path.begins_with("/root/"): + return get_tree().root.get_node_or_null(path.trim_prefix("/root/")) + + var scene_path := path.trim_prefix("/") + if scene_path == str(scene_root.name): + return scene_root + var prefix := str(scene_root.name) + "/" + if scene_path.begins_with(prefix): + scene_path = scene_path.substr(prefix.length()) + return scene_root.get_node_or_null(scene_path) + + +func _runtime_path(node: Node) -> String: + var scene_root := _current_scene_root() + if scene_root == null: + return str(node.get_path()) + if node == scene_root: + return "/" + str(scene_root.name) + return "/" + str(scene_root.name) + "/" + str(scene_root.get_path_to(node)) + + +func _current_scene_root() -> Node: + var tree := get_tree() + if tree == null: + return null + var scene_root := tree.current_scene + if scene_root == null and Engine.is_editor_hint(): + # Look the editor singleton up by name rather than referencing the bare + # `EditorInterface` identifier: that identifier is compiled out of export + # templates, so the GDScript parser rejects it ("Identifier + # "EditorInterface" not declared in the current scope") in an exported + # build even though `Engine.is_editor_hint()` would never run it there. + # That parse failure stops this autoload from loading in every export. + var editor := Engine.get_singleton(&"EditorInterface") + if editor: + scene_root = editor.get_edited_scene_root() + return scene_root + + +func _game_input_key(params: Dictionary) -> Dictionary: + var key_name := str(params.get("key", "")) + var keycode := OS.find_keycode_from_string(key_name) + if keycode == KEY_NONE: + return {"sent": false, "error": "Unknown key: %s" % key_name} + var ev := InputEventKey.new() + ev.keycode = keycode + ev.physical_keycode = keycode + ev.pressed = bool(params.get("pressed", true)) + ev.echo = bool(params.get("echo", false)) + Input.parse_input_event(ev) + return {"sent": true, "key": key_name, "pressed": ev.pressed} + + +func _game_input_mouse(params: Dictionary) -> Dictionary: + var event := str(params.get("event", "button")) + var pos_result := _resolve_mouse_position(params.get("position")) + if pos_result.has("error"): + return {"sent": false, "event": event, "error": pos_result.error} + var pos: Vector2 = pos_result.position + match event: + "motion": + var motion := InputEventMouseMotion.new() + motion.position = pos + motion.global_position = pos + Input.parse_input_event(motion) + return {"sent": true, "event": "motion", "position": _variant_to_json(pos)} + "button": + var button_event := InputEventMouseButton.new() + button_event.position = pos + button_event.global_position = pos + button_event.button_index = _mouse_button_index(str(params.get("button", "left"))) + button_event.pressed = bool(params.get("pressed", true)) + Input.parse_input_event(button_event) + return { + "sent": true, + "event": "button", + "button": params.get("button", "left"), + "pressed": button_event.pressed, + "position": _variant_to_json(pos), + } + return {"sent": false, "error": "Invalid mouse event: %s" % event} + + +func _game_input_gamepad(params: Dictionary) -> Dictionary: + var device := int(params.get("device", 0)) + var control := str(params.get("control", "button")) + match control: + "button": + var button := InputEventJoypadButton.new() + button.device = device + button.button_index = int(params.get("index", 0)) + button.pressed = bool(params.get("pressed", true)) + Input.parse_input_event(button) + return {"sent": true, "control": "button", "device": device, "index": button.button_index, "pressed": button.pressed} + "axis": + var axis := InputEventJoypadMotion.new() + axis.device = device + axis.axis = int(params.get("index", 0)) + axis.axis_value = float(params.get("value", 0.0)) + Input.parse_input_event(axis) + return {"sent": true, "control": "axis", "device": device, "index": axis.axis, "value": axis.axis_value} + return {"sent": false, "error": "Invalid gamepad control: %s" % control} + + +func _game_input_action(params: Dictionary) -> Dictionary: + var action := str(params.get("action", "")) + if action.is_empty(): + return {"sent": false, "error": "Missing action"} + if not InputMap.has_action(action): + return {"sent": false, "action": action, "error": "Unknown action: %s" % action} + var pressed := bool(params.get("pressed", true)) + var strength := clampf(float(params.get("strength", 1.0)), 0.0, 1.0) + if pressed: + Input.action_press(action, strength) + else: + Input.action_release(action) + return { + "sent": true, + "action": action, + "pressed": pressed, + "strength": strength, + "delivery": "action_state", + } + + +func _game_input_state(params: Dictionary) -> Dictionary: + var actions: Array = params.get("actions", []) + if actions.is_empty(): + actions = InputMap.get_actions() + var states := {} + for action in actions: + var name := str(action) + states[name] = Input.is_action_pressed(name) + return {"actions": states} + + +## --- input_sequence: frame-timed action timeline (deferred) --- +## +## Per-step round-trips can't hit a target frame — network jitter lands each +## input on whatever frame its reply happens to arrive on, so a jump arc or a +## timed combo is unreproducible (#814). input_sequence takes the whole +## timeline in one call and drives it game-side, applying each step's action on +## its scheduled frame, then replies once (deferred). Frame count (not ms) is +## the timing basis: it's what reproduces identically across runs. + +## Hard caps mirrored by the server-side schema (see game handlers). The game +## side re-checks them so a malformed direct message can't park the coroutine +## on an unbounded await; the server rejects the same cases up front with a +## clearer error. +## +## The frame cap bounds the sequence in *frames*, which is a wall-clock time +## only at a given FPS: 600 frames is ~10s at 60fps but longer under load or on +## a throttled runner. It is not sized to the ~30s deferred budget +## (editor_handler.INPUT_SEQUENCE_TIMEOUT_SEC) — the two are independent +## safeguards. If a genuinely slow run exceeds the budget, the dispatcher +## returns a clean DEFERRED_TIMEOUT rather than hanging, so the cap can stay a +## simple frame count. +const MAX_SEQUENCE_STEPS := 256 +const MAX_SEQUENCE_FRAMES := 600 + +## Testing seam: the last input_sequence reply (response or error), recorded +## before the EngineDebugger channel (inactive in the editor-side test +## harness). Mirrors _last_screenshot_reply / _last_eval_reply. +var _last_game_command_reply: Dictionary = {} + +## Testing seam: overrides the per-frame wait in _run_input_sequence. Left +## invalid in production (real `process_frame` awaits). A test sets it to a +## synchronously-returning Callable so the multi-frame loop runs to completion +## in one call — the editor test runner invokes tests synchronously and never +## pumps `process_frame`, so a real frame-await would suspend and record zero +## assertions. Timing itself (one frame per step) is engine-guaranteed; this +## seam covers the scheduling/application/reply logic layered on top. +var _frame_waiter: Callable = Callable() + + +## Validate + normalize an input_sequence request. Pure (no engine state), so +## the ordering/cap/shape rules are unit-testable without a running game. +## Returns {"error": String} or {"steps": Array, "end_frame": int}. +func _plan_input_sequence(params: Dictionary) -> Dictionary: + var raw_steps: Variant = params.get("steps", null) + if not (raw_steps is Array): + return {"error": "steps must be an array"} + var steps_arr: Array = raw_steps + if steps_arr.is_empty(): + return {"error": "steps must not be empty"} + if steps_arr.size() > MAX_SEQUENCE_STEPS: + return {"error": "steps exceeds cap of %d (got %d)" % [MAX_SEQUENCE_STEPS, steps_arr.size()]} + + ## Validate field *kinds* rather than coercing them: the server already + ## rejects bad shapes, but this planner is also the backstop for a + ## malformed direct debugger message, so it must not silently turn + ## pressed="false" into true or at_frame="oops" into 0. _is_number accepts + ## int or float (JSON round-trips whole numbers as either) but not bool or + ## string, so this stays consistent with the server without tripping on + ## JSON's number typing. + var settle_raw: Variant = params.get("settle_frames", 0) + if not _is_number(settle_raw): + return {"error": "settle_frames must be a number"} + var settle_frames := int(settle_raw) + if settle_frames < 0: + return {"error": "settle_frames must be >= 0"} + + var normalized: Array = [] + var prev_frame := -1 + for i in steps_arr.size(): + var raw: Variant = steps_arr[i] + if not (raw is Dictionary): + return {"error": "steps[%d] must be an object" % i} + var step: Dictionary = raw + if not (step.get("action", "") is String) or str(step.get("action", "")).is_empty(): + return {"error": "steps[%d].action is required" % i} + var action: String = step["action"] + var at_frame_raw: Variant = step.get("at_frame", 0) + if not _is_number(at_frame_raw): + return {"error": "steps[%d].at_frame must be a number" % i} + var at_frame := int(at_frame_raw) + if at_frame < 0: + return {"error": "steps[%d].at_frame must be >= 0" % i} + if at_frame < prev_frame: + return {"error": "steps must be ordered by at_frame (steps[%d]=%d < previous %d)" % [i, at_frame, prev_frame]} + prev_frame = at_frame + var pressed_raw: Variant = step.get("pressed", true) + if not (pressed_raw is bool): + return {"error": "steps[%d].pressed must be a boolean" % i} + var strength_raw: Variant = step.get("strength", 1.0) + if not _is_number(strength_raw): + return {"error": "steps[%d].strength must be a number" % i} + normalized.append({ + "at_frame": at_frame, + "action": action, + "pressed": pressed_raw, + "strength": clampf(float(strength_raw), 0.0, 1.0), + }) + + var end_frame: int = int(normalized[-1]["at_frame"]) + settle_frames + if end_frame > MAX_SEQUENCE_FRAMES: + return {"error": "sequence spans %d frames, exceeds cap of %d" % [end_frame, MAX_SEQUENCE_FRAMES]} + return {"steps": normalized, "end_frame": end_frame} + + +## Async: apply each step's action on its scheduled frame, awaiting one +## process_frame per frame, then reply (deferred). Bails out before applying +## anything if the plan is invalid or any action is unknown to the running +## game's InputMap — a half-applied timeline leaves inputs in an undefined +## state, so it's all-or-nothing on the pre-checks. +func _run_input_sequence(request_id: String, params: Dictionary) -> void: + var plan := _plan_input_sequence(params) + if plan.has("error"): + _reply_input_sequence_error(request_id, plan["error"]) + return + + var steps: Array = plan["steps"] + var end_frame: int = plan["end_frame"] + + ## Resolve action names against the *game's* InputMap up front — the server + ## can't see it, so this is the first place unknown actions surface. + for step in steps: + if not InputMap.has_action(step["action"]): + _reply_input_sequence_error(request_id, "Unknown action: %s" % step["action"]) + return + + var tree := get_tree() + if tree == null: + _reply_input_sequence_error(request_id, "No SceneTree available for input sequence") + return + + var applied: Array = [] + var step_i := 0 + for f in range(0, end_frame + 1): + while step_i < steps.size() and int(steps[step_i]["at_frame"]) == f: + var step: Dictionary = steps[step_i] + _game_input_action(step) + applied.append({"at_frame": f, "action": step["action"], "pressed": step["pressed"]}) + step_i += 1 + if f < end_frame: + if _frame_waiter.is_valid(): + await _frame_waiter.call() + else: + await tree.process_frame + + _reply_input_sequence_ok(request_id, { + "completed": true, + "steps_applied": applied.size(), + "frames_elapsed": end_frame, + "applied": applied, + "actions_pressed_at_end": _actions_pressed_at_end(steps), + }) + + +## Distinct actions the sequence touched that are still held at the end, so the +## caller knows what it must release (a press with no matching release leaves +## the action stuck on across the next frames). +func _actions_pressed_at_end(steps: Array) -> Array: + var seen := {} + var pressed: Array = [] + for step in steps: + var action: String = step["action"] + if seen.has(action): + continue + seen[action] = true + if Input.is_action_pressed(action): + pressed.append(action) + return pressed + + +func _reply_input_sequence_ok(request_id: String, result: Dictionary) -> void: + result["source"] = "game" + result["op"] = "input_sequence" + _last_game_command_reply = {"kind": "response", "op": "input_sequence", "result": result} + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:game_command_response", + [request_id, JSON.stringify(_variant_to_json(result))]) + + +func _reply_input_sequence_error(request_id: String, message: String) -> void: + _last_game_command_reply = {"kind": "error", "op": "input_sequence", "message": message} + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:game_command_error", [request_id, message]) + + +## Resolve a mouse-position param. Absent (null, or an empty {}) falls back to +## the live cursor position — a deliberate default. A present but wrong-shaped +## value is rejected instead of silently substituting the cursor, which +## previously hid caller bugs (#635). Accepts a {x, y} dict or an [x, y] array; +## returns {position: Vector2} or {error: String}. +func _resolve_mouse_position(value: Variant) -> Dictionary: + var viewport := get_viewport() + var fallback := viewport.get_mouse_position() if viewport != null else Vector2.ZERO + if value == null: + return {"position": fallback} + if value is Dictionary: + var dict: Dictionary = value + if dict.is_empty(): + return {"position": fallback} + # A non-empty dict that carries neither coordinate is a caller mistake, + # not "use the default" — reject rather than silently substitute. + if not dict.has("x") and not dict.has("y"): + return {"error": "position object must have an 'x' and/or 'y' key (got keys %s)" % str(dict.keys())} + var x_val: Variant = dict.get("x", fallback.x) + var y_val: Variant = dict.get("y", fallback.y) + if not _is_number(x_val) or not _is_number(y_val): + return {"error": "position x/y must be numbers (got x=%s, y=%s)" % [type_string(typeof(x_val)), type_string(typeof(y_val))]} + return {"position": Vector2(float(x_val), float(y_val))} + if value is Array: + var arr: Array = value + if arr.size() != 2: + return {"error": "position array must be [x, y] (got %d elements)" % arr.size()} + if not _is_number(arr[0]) or not _is_number(arr[1]): + return {"error": "position array elements must be numbers (got [%s, %s])" % [type_string(typeof(arr[0])), type_string(typeof(arr[1]))]} + return {"position": Vector2(float(arr[0]), float(arr[1]))} + return {"error": "position must be a {x, y} object or [x, y] array (got %s)" % type_string(typeof(value))} + + +func _is_number(v: Variant) -> bool: + return typeof(v) == TYPE_INT or typeof(v) == TYPE_FLOAT + + +func _mouse_button_index(name: String) -> int: + match name: + "right": + return MOUSE_BUTTON_RIGHT + "middle": + return MOUSE_BUTTON_MIDDLE + "wheel_up": + return MOUSE_BUTTON_WHEEL_UP + "wheel_down": + return MOUSE_BUTTON_WHEEL_DOWN + return MOUSE_BUTTON_LEFT + + +## --- game_eval: execute arbitrary GDScript in the running game --- + +## Wall-clock ceiling for a single game_eval. Evaluated code that awaits +## something which never completes (a signal that never fires, a timer on a +## paused tree) would otherwise pin the request open until the dispatcher's +## 15s deferred budget / the server's 15s command timeout fires it as an +## opaque INTERNAL_ERROR — with the temp eval Node leaked into the tree. +## Bounding it here lets us free the node and reply with an actionable +## message instead. See hi-godot/godot-ai#487. +## +## TIMEOUT ORDERING — load-bearing across three files: this value MUST stay +## below the editor-side fallback timer in +## `debugger/mcp_debugger_plugin.gd::request_game_eval` (`timeout_sec`, +## default 10.0), which in turn stays below the dispatcher's `game_eval` +## budget in `dispatcher.gd` (15000 ms). So: game 8s < editor 10s < +## dispatcher 15s. Only this game-side guard emits the specific +## "Eval exceeded 8s" message (both it and the editor backstop now carry the +## EVAL_HUNG code, #518, but the editor's message can't name the cause). +## Raise this at/above the editor timer (or drop that timer below this) and +## the less specific editor message wins the race, silently losing the +## diagnostic this fix exists to provide. The cross-file contract is enforced +## by tests/unit/test_game_eval_timeout_ordering.py. +## +## NOTE: this catches a hung `await`, not a CPU-bound loop with no `await` — +## a tight `while true:` with no yield blocks the main thread, so nothing +## (including this poll) runs until it yields. That case is out of scope. +const EVAL_TIMEOUT_SEC := 8.0 + + +func _handle_eval(data: Array) -> void: + var request_id: String = data[0] if data.size() > 0 else "" + var code: String = data[1] if data.size() > 1 else "" + + if code.is_empty(): + _reply_eval_error(request_id, "No code provided") + return + + ## Wrap user code in an execute() coroutine (so it can `await` internally) + ## whose inner function is uniquely named per eval. A runtime error's + ## backtrace then carries `_mcp_run_`, letting us attribute it to + ## THIS eval — not an unrelated background game error, and not a sibling + ## overlapping eval. (#490) + _eval_token_counter += 1 + var token := str(_eval_token_counter) + var run_fn := "_mcp_run_%s" % token + var script_source := ( + "extends Node\n" + + "func execute():\n" + + "\treturn await %s()\n\n" % run_fn + + "func %s():\n" % run_fn + + _indent_eval_code(code) + ) + + ## Snapshot the logger's script-error seq BEFORE running so we only attribute + ## errors raised by this eval. In a debug build a parse error aborts reload() + ## and a runtime error aborts execute() — either way this function may never + ## reach its reply: the editor infers a compile error from the missing + ## mcp:eval_compiled beacon, and a runtime error is reported (via the + ## eval_check probe / the in-flight poll loop) once a logged error past this + ## baseline carries this eval's token. + var baseline: int = _logger.script_error_seq() if _logger != null else 0 + + var script: GDScript = GDScript.new() + script.source_code = script_source + ## #490: ack BEFORE reload(). A parse error aborts this function at reload() + ## without a return code in a debug build, so this is our only chance to tell + ## the editor "received + about to compile." The editor uses that to tell a + ## real parse error (acked, never compiled) apart from a message it simply + ## hasn't serviced yet (never acked); see mcp_debugger_plugin._on_eval_grace. + EngineDebugger.send_message("mcp:eval_ack", [request_id]) + ## reload() ABORTS this function on a parse error in a debug build (it does + ## not return a non-OK code there), so the lines below only run when the + ## source compiled. Keep reload() INLINE — moving it behind a timer/await + ## poisons subsequent evals (#490). The err branch still matters for the + ## editor process (handler unit tests), where reload() does return. + var err: int = script.reload() + if err != OK: + _reply_eval_error(request_id, + "Failed to compile GDScript (error %d). Check syntax." % err) + return + + ## Compiled OK — tell the editor so its grace timer doesn't flag a compile + ## error and so it begins probing for a runtime error. + EngineDebugger.send_message("mcp:eval_compiled", [request_id]) + + var temp_node := Node.new() + temp_node.set_script(script) + temp_node.process_mode = Node.PROCESS_MODE_ALWAYS + add_child(temp_node) + + if not temp_node.has_method("execute"): + temp_node.queue_free() + _reply_eval_error(request_id, "Internal error: eval wrapper is missing execute().") + return + + ## Register in-flight BEFORE running: a runtime error aborts execute() (and + ## may unwind this function) before we could record it afterward, and the + ## editor probe / poll loop need the entry to attribute and report the error. + _inflight_evals[request_id] = {"node": temp_node, "token": token, "baseline": baseline} + + ## Drive execute() as a fire-and-forget coroutine that records its outcome + ## into `holder`, then poll frames until it finishes or the deadline passes + ## (#488's hung-await guard). A plain `await temp_node.execute()` has no + ## escape hatch: if user code never returns, we never reach the reply/cleanup + ## below and the request hangs with the node leaked. + var holder := {"done": false, "value": null, "abandoned": false} + _drive_eval(temp_node, holder) + + var tree := get_tree() + var deadline_ms := int(EVAL_TIMEOUT_SEC * 1000.0) + var start_ms := Time.get_ticks_msec() + while not holder["done"] and (Time.get_ticks_msec() - start_ms) < deadline_ms: + ## #490 focused fast path: a runtime error aborts _drive_eval (holder + ## never completes), so check each frame whether THIS eval's token now + ## appears in a logged error and report it immediately. (Backgrounded, + ## this loop is frozen and the editor probe does the same job.) + if _try_report_eval_runtime_error(request_id): + holder["abandoned"] = true + return + await tree.process_frame + + if not holder["done"]: + ## Past the 8s deadline. Disambiguate a runtime error (its token is in a + ## logged error) from a genuine hung await before the generic timeout. + holder["abandoned"] = true + if _try_report_eval_runtime_error(request_id): + return + _inflight_evals.erase(request_id) + if is_instance_valid(temp_node): + remove_child(temp_node) + _reply_eval_error(request_id, + ("Eval exceeded %ds and was aborted — the code likely awaits " + + "something that never completes (a signal that never fires, a timer on " + + "a paused tree) or loops forever. Check logs_read(source='game').") + % int(EVAL_TIMEOUT_SEC), + ErrorCodes.EVAL_HUNG) + return + + ## Clean finish. + _inflight_evals.erase(request_id) + temp_node.queue_free() + _reply_eval_response(request_id, holder["value"]) + + +## Run the compiled eval node's execute() and stash the result. Kept +## separate from _handle_eval so the latter can race it against a deadline +## via frame polling. If the eval was abandoned (timed out) before this +## resumes, drop the result and free the now-detached node — _handle_eval +## has already replied. +## +## RESIDUAL LEAK (accepted): if the awaited thing *never* fires, this +## coroutine never resumes, so the `node` it holds is detached (via +## _handle_eval's remove_child) but never freed — one orphaned Node per such +## timeout, for the game-process lifetime. GDScript has no way to cancel a +## suspended coroutine, so this is the best achievable in-process. It is still +## strictly better than the pre-#487 behavior, where the node leaked *into* +## the live tree and the request hung to the 15s ceiling. +func _drive_eval(node: Node, holder: Dictionary) -> void: + var value = await node.execute() + if holder.get("abandoned", false): + if is_instance_valid(node): + node.queue_free() + return + holder["value"] = value + holder["done"] = true + + +## #518: cap on the serialized eval result. Godot's remote-debugger TCP peer +## silently discards any single message over ~8 MiB, so a bigger reply never +## reaches the editor and the request rides to the 10s backstop as a phantom +## "hang". (Results over the editor↔server WebSocket buffer cap of 4 MiB fail +## there with their own explicit error; this game-side cap only needs to stay +## under the debugger peer's drop threshold to keep the failure visible.) +const EVAL_RESULT_MAX_BYTES := 6 * 1024 * 1024 + +## Testing seam: the last eval reply, recorded before hitting the +## EngineDebugger channel (inactive in the editor-side test harness). +var _last_eval_reply: Dictionary = {} + + +## `code` (optional) rides as a third payload element so the editor can map +## the reply to a specific error code instead of the generic INTERNAL_ERROR; +## the editor allowlists the value (see mcp_debugger_plugin._on_eval_error). +func _reply_eval_error(request_id: String, message: String, code: String = "") -> void: + _last_eval_reply = {"kind": "error", "request_id": request_id, + "message": message, "code": code} + var payload := [request_id, message] + if not code.is_empty(): + payload.append(code) + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:eval_error", payload) + + +func _reply_eval_response(request_id: String, value: Variant) -> void: + var serialized := JSON.stringify(_variant_to_json(value)) + var serialized_bytes := serialized.to_utf8_buffer().size() + if serialized_bytes > EVAL_RESULT_MAX_BYTES: + _reply_eval_error(request_id, + ("Eval result too large to return (%d bytes serialized, limit %d). " + + "Return a smaller slice instead — e.g. counts, node paths, or a " + + "truncated substring.") % [serialized_bytes, EVAL_RESULT_MAX_BYTES], + ErrorCodes.EVAL_RESULT_TOO_LARGE) + return + _last_eval_reply = {"kind": "response", "request_id": request_id} + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:eval_response", [request_id, serialized]) + + +## #490: if a logged script error past THIS eval's baseline carries its unique +## wrapper-function token, a runtime error aborted it before it could reply — +## report it with the real text + line. Returns true if it reported. Called +## from the editor's eval_check probe (the reliable path when a backgrounded +## game's idle loop is frozen — the debugger capture callback still runs) and +## from _handle_eval's poll loop (the focused fast path). Token + baseline +## matching means an unrelated background error, or a sibling overlapping +## eval's error, can never fail this request. +func _try_report_eval_runtime_error(request_id: String) -> bool: + if _logger == null: + return false + var entry = _inflight_evals.get(request_id) + if entry == null: + return false + var text: String = _logger.find_script_error_since( + int(entry["baseline"]), "_mcp_run_%s" % str(entry["token"])) + if text.is_empty(): + return false + _inflight_evals.erase(request_id) + var node: Node = entry["node"] + if node != null and is_instance_valid(node): + node.queue_free() + if EngineDebugger.is_active(): + EngineDebugger.send_message("mcp:eval_runtime_error", [request_id, text]) + return true + + +## #490: answer an editor eval_check probe. The editor polls this once the +## eval has compiled but not yet replied. This runs in the debugger capture +## callback, which stays live even when the backgrounded game's _process is +## frozen — so it's the reliable channel for reporting a runtime error that +## aborted the eval. Report if one is detected for this request, else stay +## silent (the editor keeps polling until the real reply or the hang timeout). +func _handle_eval_check(data: Array) -> void: + var request_id: String = data[0] if data.size() > 0 else "" + if request_id.is_empty(): + return + _try_report_eval_runtime_error(request_id) + + +func _indent_eval_code(code: String) -> String: + var lines: PackedStringArray = code.split("\n") + var out := "" + for line in lines: + out += "\t" + line + "\n" + return out + + +## Serialize any Godot Variant to a JSON-safe dictionary/array/primitive. +## Ported from godot-mcp's mcp_interaction_server.gd. +func _variant_to_json(value: Variant) -> Variant: + if value == null: + return null + if value is bool or value is int or value is float or value is String: + return value + if value is Vector2: + return {"x": value.x, "y": value.y} + if value is Vector3: + return {"x": value.x, "y": value.y, "z": value.z} + if value is Vector4: + return {"x": value.x, "y": value.y, "z": value.z, "w": value.w} + if value is Vector2i: + return {"x": value.x, "y": value.y} + if value is Vector3i: + return {"x": value.x, "y": value.y, "z": value.z} + if value is Vector4i: + return {"x": value.x, "y": value.y, "z": value.z, "w": value.w} + if value is Color: + return {"r": value.r, "g": value.g, "b": value.b, "a": value.a} + if value is Quaternion: + return {"x": value.x, "y": value.y, "z": value.z, "w": value.w} + if value is Basis: + return { + "x": _variant_to_json(value.x), + "y": _variant_to_json(value.y), + "z": _variant_to_json(value.z), + } + if value is Transform3D: + return { + "basis": _variant_to_json(value.basis), + "origin": _variant_to_json(value.origin), + } + if value is Transform2D: + return { + "x": _variant_to_json(value.x), + "y": _variant_to_json(value.y), + "origin": _variant_to_json(value.origin), + } + if value is Rect2: + return { + "position": _variant_to_json(value.position), + "size": _variant_to_json(value.size), + } + if value is Rect2i: + return { + "position": _variant_to_json(value.position), + "size": _variant_to_json(value.size), + } + if value is AABB: + return { + "position": _variant_to_json(value.position), + "size": _variant_to_json(value.size), + } + if value is NodePath or value is StringName: + return str(value) + if value is Plane: + return { + "normal": _variant_to_json(value.normal), + "d": value.d, + } + if value is Projection: + return { + "x": _variant_to_json(value.x), + "y": _variant_to_json(value.y), + "z": _variant_to_json(value.z), + "w": _variant_to_json(value.w), + } + ## Packed arrays + if value is PackedByteArray: + var arr: Array = [] + for item in value: arr.append(item) + return arr + if value is PackedInt32Array or value is PackedInt64Array: + var arr: Array = [] + for item in value: arr.append(item) + return arr + if value is PackedFloat32Array or value is PackedFloat64Array: + var arr: Array = [] + for item in value: arr.append(item) + return arr + if value is PackedStringArray: + var arr: Array = [] + for item in value: arr.append(item) + return arr + if value is PackedVector2Array: + var arr: Array = [] + for item in value: arr.append({"x": item.x, "y": item.y}) + return arr + if value is PackedVector3Array: + var arr: Array = [] + for item in value: arr.append({"x": item.x, "y": item.y, "z": item.z}) + return arr + if value is PackedVector4Array: + var arr: Array = [] + for item in value: arr.append({"x": item.x, "y": item.y, "z": item.z, "w": item.w}) + return arr + if value is PackedColorArray: + var arr: Array = [] + for item in value: arr.append({"r": item.r, "g": item.g, "b": item.b, "a": item.a}) + return arr + ## Generic arrays and dictionaries — recurse + if value is Array: + var arr: Array = [] + for item in value: + arr.append(_variant_to_json(item)) + return arr + if value is Dictionary: + var dict: Dictionary = {} + for key in value.keys(): + dict[str(key)] = _variant_to_json(value[key]) + return dict + ## Fallback: string representation + return str(value) diff --git a/addons/godot_ai/runtime/game_helper.gd.uid b/addons/godot_ai/runtime/game_helper.gd.uid new file mode 100644 index 0000000..7224a50 --- /dev/null +++ b/addons/godot_ai/runtime/game_helper.gd.uid @@ -0,0 +1 @@ +uid://gfybkdtsclti diff --git a/addons/godot_ai/runtime/game_logger.gd b/addons/godot_ai/runtime/game_logger.gd new file mode 100644 index 0000000..6384960 --- /dev/null +++ b/addons/godot_ai/runtime/game_logger.gd @@ -0,0 +1,142 @@ +@tool +extends Logger + +## Game-process Logger subclass. +## +## NOTE: deliberately no `class_name`. Registered from inside the running +## game so we can intercept print(), printerr(), push_error(), and +## push_warning() and ferry them back to the editor over the EngineDebugger +## channel — the same bridge PR #76 uses for screenshots. +## +## Logger virtuals can be called from any thread (e.g. async loaders push +## errors off the main thread). We accumulate into _pending under a Mutex +## and the host (game_helper.gd) flushes once per frame from the main +## thread, where EngineDebugger.send_message is safe to call. + +## `McpLogBacktrace` is published as a `class_name` on log_backtrace.gd, but a +## freshly-launched game subprocess (no prior editor scan; e.g. CI launching +## `--headless --path`) hits this autoload before the global class_name table +## is populated, and parsing this script fails with +## "Identifier 'McpLogBacktrace' not declared in the current scope". Using +## `const preload` resolves the path at parse time and is independent of the +## class_name registry — matches the project convention in CLAUDE.md +## ("Internals … skip class_name entirely and load via const preload"). +const _LogBacktrace := preload("res://addons/godot_ai/utils/log_backtrace.gd") + +var _pending: Array = [] +var _mutex := Mutex.new() +## #490: a monotonic sequence + a small ring of recent GDScript runtime +## (script-type) errors, each with its text AND the function names in its +## backtrace. game_helper uses this to attribute a runtime error to the +## *specific* eval that raised it: each eval's wrapper has a uniquely named +## inner function, and game_helper asks find_script_error_since() whether any +## error past its pre-eval baseline carries that function in its stack. This +## avoids failing an eval on an unrelated background game error that merely +## advanced a global counter, and keeps overlapping evals from cross- +## attributing. Gated on ERROR_TYPE_SCRIPT (2) so push_error()/push_warning() +## (types 0/1) never count. Mutex-guarded: _log_error can fire from any thread. +const _ERROR_TYPE_SCRIPT := 2 +const _MAX_RECENT_SCRIPT_ERRORS := 64 +var _script_error_seq: int = 0 +var _recent_script_errors: Array = [] + + +func _log_message(message: String, error: bool) -> void: + ## `error` is true for printerr(), false for print(). + var level := "error" if error else "info" + _append(level, message) + + +func _log_error( + function: String, + file: String, + line: int, + code: String, + rationale: String, + _editor_notify: bool, + error_type: int, + script_backtraces: Array, +) -> void: + ## EngineDebugger's payload shape is `[level, text]` — the source + ## location has nowhere structured to land for the game side, so we + ## inline it into `text`. editor_logger keeps the resolved fields + ## as structured columns instead. + var resolved := _LogBacktrace.resolve_error( + function, file, line, code, rationale, error_type, script_backtraces, + ) + var loc := "" + if not resolved.path.is_empty(): + loc = "%s:%d @ %s" % [resolved.path, resolved.line, resolved.function] if not resolved.function.is_empty() else "%s:%d" % [resolved.path, resolved.line] + var text: String = "%s (%s)" % [resolved.message, loc] if not loc.is_empty() else resolved.message + var details: Dictionary = resolved.get("details", {}) + _append(resolved.level, text, details) + if error_type == _ERROR_TYPE_SCRIPT: + ## Collect every function name in the first non-empty backtrace so + ## game_helper can match its eval's uniquely named wrapper function. + var funcs := PackedStringArray() + for bt: RefCounted in script_backtraces: + if bt != null and bt.get_frame_count() > 0: + for i: int in bt.get_frame_count(): + funcs.append(bt.get_frame_function(i)) + break + _mutex.lock() + _script_error_seq += 1 + _recent_script_errors.append({"seq": _script_error_seq, "text": text, "funcs": funcs}) + if _recent_script_errors.size() > _MAX_RECENT_SCRIPT_ERRORS: + _recent_script_errors.remove_at(0) + _mutex.unlock() + + +func _append(level: String, text: String, details: Dictionary = {}) -> void: + _mutex.lock() + if details.is_empty(): + _pending.append([level, text]) + else: + _pending.append([level, text, details.duplicate(true)]) + _mutex.unlock() + + +## Drain the pending queue and return entries as [[level, text], ...]. +## Called from the main thread by game_helper each frame. +func drain() -> Array: + _mutex.lock() + var out := _pending + _pending = [] + _mutex.unlock() + return out + + +func has_pending() -> bool: + _mutex.lock() + var any := not _pending.is_empty() + _mutex.unlock() + return any + + +## #490: monotonic count of script-type runtime errors seen this run. +## game_helper snapshots this before an eval to use as the `since_seq` +## baseline for find_script_error_since(). Mutex-guarded. +func script_error_seq() -> int: + _mutex.lock() + var v := _script_error_seq + _mutex.unlock() + return v + + +## #490: text of the most recent script error with seq > since_seq whose +## backtrace includes `function_name`, or "" if none. Lets game_helper +## attribute a runtime error to the exact eval whose uniquely named wrapper +## function appears in the stack — ignoring unrelated game errors and errors +## from before the eval started. Mutex-guarded. +func find_script_error_since(since_seq: int, function_name: String) -> String: + _mutex.lock() + var found := "" + for i in range(_recent_script_errors.size() - 1, -1, -1): + var rec: Dictionary = _recent_script_errors[i] + if int(rec["seq"]) <= since_seq: + break + if (rec["funcs"] as PackedStringArray).has(function_name): + found = rec["text"] + break + _mutex.unlock() + return found diff --git a/addons/godot_ai/runtime/game_logger.gd.uid b/addons/godot_ai/runtime/game_logger.gd.uid new file mode 100644 index 0000000..d4e263e --- /dev/null +++ b/addons/godot_ai/runtime/game_logger.gd.uid @@ -0,0 +1 @@ +uid://dwcs6d1y7vhqi diff --git a/addons/godot_ai/runtime/validation_logger.gd b/addons/godot_ai/runtime/validation_logger.gd new file mode 100644 index 0000000..672b11f --- /dev/null +++ b/addons/godot_ai/runtime/validation_logger.gd @@ -0,0 +1,43 @@ +@tool +extends Logger + +## Short-lived Logger used only for per-write validation loads. +## +## Unlike editor_logger.gd this deliberately has no addon feedback-loop filter: +## the caller attaches it around one ResourceLoader.load() call, reads its +## private buffer, and immediately removes it. The shared editor logger should +## still drop these validation-load errors so logs_read(source="editor") stays +## clean. + +const _LogBacktrace := preload("res://addons/godot_ai/utils/log_backtrace.gd") + +var _buffer + + +func _init(buffer = null) -> void: + _buffer = buffer + + +func _log_error( + function: String, + file: String, + line: int, + code: String, + rationale: String, + _editor_notify: bool, + error_type: int, + script_backtraces: Array, +) -> void: + if _buffer == null: + return + var resolved := _LogBacktrace.resolve_error( + function, + file, + line, + code, + rationale, + error_type, + script_backtraces, + ) + var details: Dictionary = resolved.get("details", {}) + _buffer.append(resolved.level, resolved.message, resolved.path, resolved.line, resolved.function, details) diff --git a/addons/godot_ai/runtime/validation_logger.gd.uid b/addons/godot_ai/runtime/validation_logger.gd.uid new file mode 100644 index 0000000..4e693b4 --- /dev/null +++ b/addons/godot_ai/runtime/validation_logger.gd.uid @@ -0,0 +1 @@ +uid://b2ff3aot6t2l4 diff --git a/addons/godot_ai/telemetry.gd b/addons/godot_ai/telemetry.gd new file mode 100644 index 0000000..dc90bf9 --- /dev/null +++ b/addons/godot_ai/telemetry.gd @@ -0,0 +1,198 @@ +## Plugin-side telemetry helper. +## +## Relays plugin-only events (dock startup, self-update outcome, plugin +## reload, dev-server toggle) to the Python MCP server via the existing +## `send_event("plugin_event", {...})` channel. The server's +## `transport/websocket.py` allowlists event names and forwards into the +## central telemetry pipeline — meaning opt-out, endpoint, customer_uuid +## and the bounded-queue worker stay in one place (Python), not +## duplicated in GDScript. +## +## Opt-out options priority: +## 1. `GODOT_AI_DISABLE_TELEMETRY` / `DISABLE_TELEMETRY` env vars — +## checked first so CI / operators can force-disable without touching +## EditorSettings. +## 2. The `godot_ai/telemetry_enabled` EditorSetting — set through the +## MCP dock and persisted between sessions. +## +## When telemetry is disabled, events are never buffered or sent. Only a +## *truthy* env var force-disables; a falsey or absent env var falls through +## to the EditorSetting (which defaults to enabled). See McpSettings.telemetry_enabled. +## +## Buffering: events recorded before the WebSocket is connected go into +## a small bounded buffer and flush on the next `record_event` call once +## connected. The buffer is intentionally small (`_MAX_BUFFER`); plugin +## events are sparse, and a flood means something is misconfigured. + +extends RefCounted + +## Allowlist mirrored on the Python side in +## `src/godot_ai/transport/websocket.py::_PLUGIN_EVENT_NAMES`. Update +## both together. +const _ALLOWED_EVENTS := [ + "dock_startup", + "plugin_reload", + "self_update", + "dev_server_toggle", +] + +const _MAX_BUFFER := 32 + +## EditorSetting key used to defer a ``plugin_reload`` event across the +## disable -> enable boundary. Callers that trigger plugin reload (the +## dock reload button, ``editor_reload_plugin`` MCP-tool path) write +## here *before* the disable kills the live WebSocket; the new +## plugin's ``_enter_tree`` flushes via ``flush_pending_plugin_reload``. +const PENDING_PLUGIN_RELOAD_KEY := "godot_ai/pending_plugin_reload_event" + + +## Persist a ``plugin_reload`` event so the re-enabled plugin instance +## can emit it once its new WebSocket is up. Static so callers without +## a telemetry instance handle (e.g. ``editor_handler.reload_plugin``) +## can use it via the preloaded const alias. +static func record_pending_plugin_reload(source: String) -> void: + var settings := EditorInterface.get_editor_settings() + if settings == null: + return + settings.set_setting( + PENDING_PLUGIN_RELOAD_KEY, + JSON.stringify({"source": source, "success": true}), + ) + + +## Read + clear an EditorSetting JSON-encoded event payload. Returns +## the parsed dict, or ``null`` if the key is absent / empty / +## malformed. Used by ``flush_pending_plugin_reload`` (below) and by +## ``plugin.gd::_flush_pending_self_update_telemetry``. Centralising +## the read-and-clear dance keeps both flush sites symmetric with the +## ``record_pending_*`` writers and prevents the "key gets stuck" +## class of bug if a future flush helper forgets the clear step. +static func _drain_editor_setting_dict(key: String): + var settings := EditorInterface.get_editor_settings() + if settings == null: + return null + if not settings.has_setting(key): + return null + var raw := str(settings.get_setting(key)) + settings.set_setting(key, "") + if raw == "": + return null + var parsed = JSON.parse_string(raw) + if typeof(parsed) != TYPE_DICTIONARY: + return null + return parsed + +var _connection +var _disabled: bool = false +var _pending: Array = [] # of {name: String, data: Dictionary} + +func _init(connection) -> void: + _connection = connection + _disabled = not McpSettings.telemetry_enabled() + ## Subscribe to ``connection_state_changed`` so events buffered before + ## the WebSocket handshake (e.g. ``record_dock_startup`` from + ## ``plugin._enter_tree``) actually leave the editor. Without this, + ## the buffer only drained on the next ``record_event`` call — when + ## that call never came (the common single-session case), the very + ## events we cared about most sat in the queue forever. + if _connection != null and _connection.has_signal("connection_state_changed"): + _connection.connection_state_changed.connect(_on_connection_state_changed) + + +func record_event(name: String, data: Dictionary = {}) -> void: + if _disabled: + return + if not _ALLOWED_EVENTS.has(name): + ## Drop silently — matches the server's behavior for unknown + ## names, and avoids editor yellow-bar noise from third-party + ## callers or stale event names mid-rollout. + return + if _connection != null and _connection.is_connected: + _flush() + _send_one(name, data) + return + ## Pre-handshake: stash in a small bounded buffer. Drained on the + ## first ``connection_state_changed(true)`` after this point (see + ## ``_on_connection_state_changed``). Falling back to "drain on the + ## next record_event" is a footgun: the most useful plugin events + ## (``dock_startup``, pending ``self_update``) fire from + ## ``plugin._enter_tree`` before the handshake, and a single-session + ## editor may never emit a second event — so without the signal- + ## driven flush they sat buffered forever. + if _pending.size() >= _MAX_BUFFER: + _pending.pop_front() + _pending.append({"name": name, "data": data}) + + +func _on_connection_state_changed(is_open: bool) -> void: + if is_open: + _flush() + +func _flush() -> void: + if _pending.is_empty(): + return + var to_send := _pending.duplicate() + _pending.clear() + for entry in to_send: + _send_one(entry["name"], entry["data"]) + +func _send_one(name: String, data: Dictionary) -> void: + if _connection == null: + return + _connection.send_event("plugin_event", {"name": name, "data": data}) + +# --- convenience emitters -------------------------------------------------- + +func record_dock_startup(extra: Dictionary = {}) -> void: + record_event("dock_startup", extra) + +func record_self_update( + status: String, + from_version: String = "", + to_version: String = "", + error: String = "", +) -> void: + var data := {"status": status} + if from_version != "": + data["from_version"] = from_version + if to_version != "": + data["to_version"] = to_version + if error != "": + data["error"] = error.substr(0, 200) + record_event("self_update", data) + +func record_dev_server_toggle(action: String) -> void: + record_event("dev_server_toggle", {"action": action}) + + +## Drain a pending ``plugin_reload`` event written by the previous +## instance before it disabled itself. Pending events are currently +## always success=true — ``record_pending_plugin_reload`` above is the +## only writer and hardcodes it (a reload that fails never reaches the +## flush anyway; there is no new instance to drain the key). The +## error/success parsing below stays tolerant for forward compat with +## a writer that records failures. +func flush_pending_plugin_reload() -> void: + var parsed = _drain_editor_setting_dict(PENDING_PLUGIN_RELOAD_KEY) + if parsed == null: + return + var data := { + "success": bool(parsed.get("success", true)), + "source": str(parsed.get("source", "unknown")), + } + var error := str(parsed.get("error", "")) + if error != "": + data["error"] = error.substr(0, 200) + record_event("plugin_reload", data) + +# --- test seam ------------------------------------------------------------- + +## Inject a fake connection or force the disabled flag for unit tests +## that don't have a live WebSocket. Production code does not call this. +func _test_set_state(connection, disabled: bool) -> void: + _connection = connection + _disabled = disabled + _pending.clear() + +func _test_pending_count() -> int: + return _pending.size() diff --git a/addons/godot_ai/telemetry.gd.uid b/addons/godot_ai/telemetry.gd.uid new file mode 100644 index 0000000..6f46be6 --- /dev/null +++ b/addons/godot_ai/telemetry.gd.uid @@ -0,0 +1 @@ +uid://dlul2gculiy1p diff --git a/addons/godot_ai/testing/script_error_capture.gd b/addons/godot_ai/testing/script_error_capture.gd new file mode 100644 index 0000000..92c53ed --- /dev/null +++ b/addons/godot_ai/testing/script_error_capture.gd @@ -0,0 +1,49 @@ +@tool +extends Logger + +## Captures GDScript runtime errors emitted while a test is running. +## +## Deliberately no class_name: this is an internal test helper. +## +## Only ERROR_TYPE_SCRIPT is captured. push_error(), push_warning(), and +## engine-internal ERR_FAIL_* checks are often valid negative-path assertions and +## should not abort the test. + +var _mutex := Mutex.new() +var _capturing := false +var _errors := PackedStringArray() + + +func begin_capture() -> void: + _mutex.lock() + _capturing = true + _errors.clear() + _mutex.unlock() + + +func end_capture() -> PackedStringArray: + _mutex.lock() + var captured := _errors.duplicate() + _capturing = false + _errors.clear() + _mutex.unlock() + return captured + + +func _log_error( + function: String, + file: String, + line: int, + code: String, + rationale: String, + _editor_notify: bool, + error_type: int, + _script_backtraces: Array, +) -> void: + if error_type != ERROR_TYPE_SCRIPT: + return + _mutex.lock() + if _capturing: + var text := rationale if not rationale.is_empty() else code + _errors.append("%s (%s:%d in %s)" % [text, file, line, function]) + _mutex.unlock() diff --git a/addons/godot_ai/testing/script_error_capture.gd.uid b/addons/godot_ai/testing/script_error_capture.gd.uid new file mode 100644 index 0000000..6b2d712 --- /dev/null +++ b/addons/godot_ai/testing/script_error_capture.gd.uid @@ -0,0 +1 @@ +uid://crk8w2nei087v diff --git a/addons/godot_ai/testing/test_runner.gd b/addons/godot_ai/testing/test_runner.gd new file mode 100644 index 0000000..1aa0041 --- /dev/null +++ b/addons/godot_ai/testing/test_runner.gd @@ -0,0 +1,441 @@ +@tool +class_name McpTestRunner +extends RefCounted + +## Lightweight test runner for MCP plugin tests. Discovers test_* methods +## on McpTestSuite instances, runs them, and collects structured results. + +const ScriptErrorCapture := preload("res://addons/godot_ai/testing/script_error_capture.gd") + +var _results: Array[Dictionary] = [] +var _last_run_ms: int = 0 +var _script_error_capture: ScriptErrorCapture = null +var _capture_registered := false + + +func _notification(what: int) -> void: + if what == NOTIFICATION_PREDELETE and _capture_registered and _script_error_capture != null: + OS.remove_logger(_script_error_capture) + _capture_registered = false + + +func run_suite(suite: McpTestSuite, test_filter: String = "", exclude_test_filter: String = "") -> void: + var owns_capture := not _capture_registered + if owns_capture: + _register_capture() + + _run_suite_tests(suite, test_filter, exclude_test_filter, Callable(), 0, {}) + + if owns_capture: + _unregister_capture() + + +## Shared per-test loop for both the legacy synchronous path and the +## serviced driver. Returns "" when the loop completed, or a terminal +## outcome ("timeout" / "transport_lost" / "paused") when a checkpoint +## aborted it. Checkpoints run BETWEEN tests — an atomic test body is +## never preempted (see docs/test-run-transport-starvation-plan.md). +func _run_suite_tests( + suite: McpTestSuite, + test_filter: String, + exclude_test_filter: String, + service_cb: Callable, + deadline_ticks_ms: int, + run_state: Dictionary, +) -> String: + var name := suite.suite_name() + var methods := _get_test_methods(suite) + var exclusions := _parse_exclusions(exclude_test_filter) + + for method_name in methods: + if not test_filter.is_empty() and method_name.find(test_filter) == -1: + continue + _selected_processed += 1 + if _matches_any_exclusion(method_name, exclusions): + _results.append({ + "suite": name, + "test": method_name, + "passed": true, + "skipped": true, + "message": "Excluded by exclude_test_name filter", + "assertion_count": 0, + "duration_ms": 0, + }) + continue + + var test_start := Time.get_ticks_msec() + var entry := _run_one_test(suite, name, method_name) + entry["duration_ms"] = Time.get_ticks_msec() - test_start + _results.append(entry) + + var stop := _checkpoint(service_cb, deadline_ticks_ms, run_state) + if not stop.is_empty(): + return stop + return "" + + +## Execute one test method and return its result entry (not yet appended; +## the caller stamps `duration_ms`). Extracted from run_suite so the legacy +## and serviced drivers share one execution core — behavior must stay +## byte-identical to the pre-refactor loop body. +func _run_one_test(suite: McpTestSuite, name: String, method_name: String) -> Dictionary: + suite._reset() + _begin_script_error_capture() + suite.setup() + suite.call(method_name) + suite.teardown() + var script_errors := suite._unexpected_script_errors(_end_script_error_capture()) + suite._free_tracked() + + ## Issue #19 defence: free any `_McpTest*` nodes the test created, even + ## nested ones. If the scene gets auto-saved mid-test while one of these + ## exists, the reference bakes into main.tscn and breaks the next open + ## with a "missing dependency" error. Runs after every test, not just at + ## suite boundaries, so a test that fails mid-flow can't leave a trap + ## for the next test or for scene autosave. + var scene_root_for_cleanup := _edited_scene_root() + if scene_root_for_cleanup != null and scene_root_for_cleanup.is_inside_tree(): + _free_mcp_test_nodes_recursive(scene_root_for_cleanup) + + if not script_errors.is_empty(): + var abort_message := "Aborted by SCRIPT ERROR: %s" % "; ".join(script_errors) + if suite._failed: + abort_message += " (after assertion failure: %s)" % suite._message + return { + "suite": name, + "test": method_name, + "passed": false, + "message": abort_message, + "assertion_count": suite._assertion_count, + } + + ## A failed assertion always wins over a later skip(): a test that + ## fails and then hits a skip-guard must report the failure, not + ## park itself as green-skipped. + if suite._skipped and not suite._failed: + return { + "suite": name, + "test": method_name, + "passed": true, + "skipped": true, + "message": suite._skip_reason, + "assertion_count": 0, + } + + var passed := not suite._failed + var msg := suite._message + + ## Warn about zero-assertion tests (likely silently skipped logic). + if passed and suite._assertion_count == 0: + passed = false + msg = "Test completed with 0 assertions (likely skipped its logic)" + + return { + "suite": name, + "test": method_name, + "passed": passed, + "message": msg, + "assertion_count": suite._assertion_count, + } + + +func run_suites(suites: Array, suite_filter: String = "", test_filter: String = "", ctx: Dictionary = {}, verbose: bool = false, exclude_test_filter: String = "") -> Dictionary: + ## Legacy synchronous API — unchanged signature and semantics for direct + ## callers, unit-test fixtures, and any batch context. No servicing, no + ## ceiling: with an invalid Callable and deadline 0 every checkpoint is a + ## no-op and the outcome is always "completed". + var run := run_suites_serviced(suites, suite_filter, test_filter, ctx, verbose, exclude_test_filter) + return run["results"] + + +## Serviced driver for live MCP runs. Between tests and at suite +## boundaries it (a) aborts once `deadline_ticks_ms` passes and (b) calls +## `service_cb` (McpConnection.service_transport_during_exclusive_run) so +## the WebSocket heartbeat stays alive while the suite monopolizes the +## main thread. Returns: +## { +## "outcome": "completed" | "timeout" | "transport_lost" | "paused", +## "results": , +## "tests_not_run": , +## } +## Every outcome path — including aborts — runs the current suite's +## teardown + leak cleanup, restores console echo, and unregisters the +## capture logger. `run_state` is caller-owned and threaded through to the +## service callback (cumulative packet counter lives there). +func run_suites_serviced( + suites: Array, + suite_filter: String = "", + test_filter: String = "", + ctx: Dictionary = {}, + verbose: bool = false, + exclude_test_filter: String = "", + service_cb: Callable = Callable(), + deadline_ticks_ms: int = 0, + run_state: Dictionary = {}, +) -> Dictionary: + _results.clear() + _selected_processed = 0 + var selected_total := _count_selected_tests(suites, suite_filter, test_filter) + var start := Time.get_ticks_msec() + var outcome := "" + + ## Silence the plugin's ring-buffer console echo while tests run. Negative- + ## path suites deliberately fill the ring with 500 lines and log malformed- + ## result errors; echoing all of that buries an all-green run in scary + ## console output. The ring contents tests assert on are untouched, and + ## the flag is restored after the run so live logging resumes. + var _prev_console_echo := McpLogBuffer.console_echo + McpLogBuffer.console_echo = false + + ## If a prior run was interrupted after registering the logger but before + ## normal teardown, remove that stale registration before starting fresh. + _unregister_capture() + _register_capture() + + for suite: McpTestSuite in suites: + if not suite_filter.is_empty() and suite.suite_name() != suite_filter: + continue + + ## Snapshot scene children before the suite so we can clean up leaks. + var scene_root := _edited_scene_root() + var before_children: Array[Node] = [] + if scene_root != null: + before_children = _get_children_snapshot(scene_root) + + suite._reset_suite_state() + suite.suite_setup(ctx.duplicate(true)) + + ## fail_setup() / skip_suite() gives suites a clean way to bail out of + ## suite_setup without leaving N tests to fail with "0 assertions". We + ## emit ONE suite-level result and skip individual tests entirely. + if suite._suite_failed: + _results.append({ + "suite": suite.suite_name(), + "test": "", + "passed": false, + "message": "suite_setup() failed: %s (subsequent tests not run)" % suite._suite_failed_message, + "assertion_count": 0, + }) + ## The bailed suite's tests are accounted for, not "not run". + _selected_processed += _count_selected_tests([suite], "", test_filter) + elif suite._suite_skipped: + _results.append({ + "suite": suite.suite_name(), + "test": "", + "passed": true, + "skipped": true, + "message": "suite_setup() skipped: %s" % suite._suite_skipped_reason, + "assertion_count": 0, + }) + _selected_processed += _count_selected_tests([suite], "", test_filter) + else: + outcome = _checkpoint(service_cb, deadline_ticks_ms, run_state) + if outcome.is_empty(): + outcome = _run_suite_tests( + suite, test_filter, exclude_test_filter, + service_cb, deadline_ticks_ms, run_state + ) + ## Suite epilogue runs on EVERY path, including aborts: the suite has + ## begun, so its teardown and leak cleanup must not be skipped. + suite.suite_teardown() + suite._free_tracked() + + ## Remove any nodes the suite left behind (failed undo, missing cleanup). + if scene_root != null and scene_root.is_inside_tree(): + _cleanup_leaked_nodes(scene_root, before_children) + + if not outcome.is_empty(): + break + + outcome = _checkpoint(service_cb, deadline_ticks_ms, run_state) + if not outcome.is_empty(): + break + + _last_run_ms = Time.get_ticks_msec() - start + McpLogBuffer.console_echo = _prev_console_echo + _unregister_capture() + if outcome.is_empty(): + outcome = "completed" + return { + "outcome": outcome, + "results": get_results(verbose), + "tests_not_run": maxi(0, selected_total - _selected_processed), + } + + +## Count of selected (filter-surviving) tests already looped over this run, +## including exclusion-skips and bailed-suite accounting. Drives the +## `tests_not_run` estimate on aborted runs. +var _selected_processed := 0 + + +func _count_selected_tests(suites: Array, suite_filter: String, test_filter: String) -> int: + var count := 0 + for suite: McpTestSuite in suites: + if not suite_filter.is_empty() and suite.suite_name() != suite_filter: + continue + for method_name in _get_test_methods(suite): + if not test_filter.is_empty() and method_name.find(test_filter) == -1: + continue + count += 1 + return count + + +## Between-phase checkpoint: "" to continue, or a terminal outcome. +## Delegates to the shared mapping so the discovery checkpoints in +## test_handler.gd can never drift from the between-test ones (plan §9 Q2). +func _checkpoint(service_cb: Callable, deadline_ticks_ms: int, run_state: Dictionary) -> String: + return McpConnection.exclusive_run_checkpoint(service_cb, deadline_ticks_ms, run_state) + + +func _register_capture() -> void: + if _capture_registered: + return + if _script_error_capture == null: + _script_error_capture = ScriptErrorCapture.new() + if _script_error_capture == null: + return + OS.add_logger(_script_error_capture) + _capture_registered = true + + +func _unregister_capture() -> void: + if not _capture_registered: + return + if _script_error_capture == null: + _capture_registered = false + return + OS.remove_logger(_script_error_capture) + _capture_registered = false + + +func _begin_script_error_capture() -> void: + if _script_error_capture != null and _capture_registered: + _script_error_capture.begin_capture() + + +func _end_script_error_capture() -> PackedStringArray: + if _script_error_capture == null or not _capture_registered: + return PackedStringArray() + return _script_error_capture.end_capture() + + +static func _edited_scene_root() -> Node: + if not Engine.is_editor_hint(): + return null + return EditorInterface.get_edited_scene_root() + + +func get_results(verbose: bool = false) -> Dictionary: + var passed := 0 + var failed := 0 + var skipped := 0 + var failures: Array[Dictionary] = [] + var suites_seen := {} + for r in _results: + suites_seen[r.suite] = true + if r.get("skipped", false): + skipped += 1 + elif r.passed: + passed += 1 + else: + failed += 1 + failures.append(r) + + var result := { + "passed": passed, + "failed": failed, + "skipped": skipped, + "total": _results.size(), + "duration_ms": _last_run_ms, + "suites_run": suites_seen.keys(), + "suite_count": suites_seen.size(), + } + + if not failures.is_empty(): + result["failures"] = failures + + if verbose: + result["results"] = _results + + return result + + +func clear() -> void: + _results.clear() + _last_run_ms = 0 + + +func _get_test_methods(obj: Object) -> Array[String]: + var methods: Array[String] = [] + for m in obj.get_method_list(): + var name: String = m.get("name", "") + if name.begins_with("test_"): + methods.append(name) + methods.sort() + return methods + + +func _get_children_snapshot(node: Node) -> Array[Node]: + var children: Array[Node] = [] + for child in node.get_children(): + children.append(child) + return children + + +## Remove any nodes in scene_root that weren't present before the suite ran, +## plus any _McpTest* named nodes anywhere in the tree (catches nested leaks). +## NOTE: this bypasses EditorUndoRedoManager by design — the test runner +## owns these leaks and needs to clear them unconditionally. Don't Ctrl-Z in +## the editor immediately after a test run that triggered cleanup; the undo +## stack may reference freed nodes. +func _cleanup_leaked_nodes(scene_root: Node, before: Array[Node]) -> void: + var before_set := {} + for n in before: + before_set[n] = true + for child in scene_root.get_children(): + if not before_set.has(child): + scene_root.remove_child(child) + child.queue_free() + + +## Recursively free every node whose name starts with `_McpTest`, anywhere in +## the scene. Intentionally bypasses undo — these are test leaks, not user +## work. Walk breadth-first so we can collect victims before mutating the tree. +func _free_mcp_test_nodes_recursive(root: Node) -> void: + var victims: Array[Node] = [] + var queue: Array[Node] = [root] + while not queue.is_empty(): + var node: Node = queue.pop_back() + for child in node.get_children(): + if str(child.name).begins_with("_McpTest"): + victims.append(child) + else: + queue.append(child) + for v in victims: + if v.get_parent() != null: + v.get_parent().remove_child(v) + v.queue_free() + + +## Split the `exclude_test_name` filter into individual substring matchers. +## Comma-separated so the CI smoke harness can list multiple flaky tests +## without shipping a richer schema (single names still work — same string, +## no comma, same one-element list). Whitespace around each name is stripped +## so `"a, b"` and `"a,b"` behave identically. +static func _parse_exclusions(filter: String) -> Array[String]: + var out: Array[String] = [] + if filter.is_empty(): + return out + for part in filter.split(","): + var trimmed := part.strip_edges() + if not trimmed.is_empty(): + out.append(trimmed) + return out + + +static func _matches_any_exclusion(method_name: String, exclusions: Array[String]) -> bool: + for ex in exclusions: + if method_name.find(ex) != -1: + return true + return false diff --git a/addons/godot_ai/testing/test_runner.gd.uid b/addons/godot_ai/testing/test_runner.gd.uid new file mode 100644 index 0000000..c0befb0 --- /dev/null +++ b/addons/godot_ai/testing/test_runner.gd.uid @@ -0,0 +1 @@ +uid://367b77qh5grt diff --git a/addons/godot_ai/testing/test_suite.gd b/addons/godot_ai/testing/test_suite.gd new file mode 100644 index 0000000..57b3bef --- /dev/null +++ b/addons/godot_ai/testing/test_suite.gd @@ -0,0 +1,330 @@ +@tool +class_name McpTestSuite +extends RefCounted + +## Base class for MCP test suites. Provides assertion methods and +## lifecycle hooks. Subclass this, add test_* methods, and drop the +## script in res://tests/. + +## Override to return a short name for this suite (e.g. "scene", "node"). +func suite_name() -> String: + return "unnamed" + + +## Called once before the suite runs. Override to create handlers. +func suite_setup(_ctx: Dictionary) -> void: + pass + + +## Called before each test method. +func setup() -> void: + pass + + +## Called after each test method. +func teardown() -> void: + pass + + +## Called once after the suite finishes. +func suite_teardown() -> void: + pass + + +# ----- tracked allocations (freed by the runner after each test) ----- + +var _tracked_objects: Array[Object] = [] + + +## Register a manually-managed Object (plain Object or out-of-tree Node) so +## the runner frees it after the current test. RefCounted instances are +## accepted but ignored because they manage their own lifetime. +func track(obj: Object) -> Object: + if obj != null and not obj is RefCounted: + _tracked_objects.append(obj) + return obj + + +## Free everything registered via track(). Called by the runner after each +## test's teardown() and again after suite_teardown(). +func _free_tracked() -> void: + for obj in _tracked_objects: + if not is_instance_valid(obj) or (obj is Node and obj.is_queued_for_deletion()): + continue + if obj is Node: + var parent := (obj as Node).get_parent() + if parent != null: + parent.remove_child(obj) + obj.free() + _tracked_objects.clear() + + +# ----- assertion state (managed by McpTestRunner) ----- + +var _failed: bool = false +var _message: String = "" +var _assertion_count: int = 0 +var _skipped: bool = false +var _skip_reason: String = "" +var _expected_script_error_substrings: Array[String] = [] + +# ----- suite-level state (managed by McpTestRunner) ----- + +var _suite_failed: bool = false +var _suite_failed_message: String = "" +var _suite_skipped: bool = false +var _suite_skipped_reason: String = "" + + +func _reset() -> void: + _failed = false + _message = "" + _assertion_count = 0 + _skipped = false + _skip_reason = "" + _expected_script_error_substrings.clear() + + +func _reset_suite_state() -> void: + _suite_failed = false + _suite_failed_message = "" + _suite_skipped = false + _suite_skipped_reason = "" + + +## Mark the current test as skipped. Use when a precondition isn't met +## (e.g. no scene open, no Node3D in scene) and the test can't run. +## Skipped tests count separately from passed/failed. +func skip(reason: String = "") -> void: + _skipped = true + _skip_reason = reason + + +## Bail out of suite_setup() with a failure. Subsequent tests in this suite +## are not run; the runner reports a single suite-level failure with the +## given reason instead of N zero-assertion noise lines per test. +## +## Example: +## func suite_setup(ctx): +## var arena = preload("res://game/arena.gd").new() +## if arena == null: +## fail_setup("arena.gd failed to instantiate in @tool scope") +## return +func fail_setup(reason: String) -> void: + _suite_failed = true + _suite_failed_message = reason + + +## Bail out of suite_setup() because a precondition isn't met (no scene open, +## no game running, etc.). Subsequent tests are not run and the runner emits +## a single suite-level skip rather than per-test skip noise. +func skip_suite(reason: String) -> void: + _suite_skipped = true + _suite_skipped_reason = reason + + +## Mark the current test as skipped when the running Godot is older than +## `min_version` (a "major.minor" string like "4.6"). Use for tests that +## exercise an engine API or behavior that only exists on newer Godot. +## Returns true when the test was skipped, so callers can `return` from +## the test body. +## +## Example: +## func test_uses_46_only_api() -> void: +## if skip_on_godot_lt("4.6", "example API requires Godot 4.6+"): +## return +## ... +func skip_on_godot_lt(min_version: String, reason: String = "") -> bool: + var v := Engine.get_version_info() + var current_major := int(v.get("major", 0)) + var current_minor := int(v.get("minor", 0)) + var parts := min_version.split(".") + var want_major := int(parts[0]) if parts.size() > 0 else 0 + var want_minor := int(parts[1]) if parts.size() > 1 else 0 + if ( + current_major < want_major + or (current_major == want_major and current_minor < want_minor) + ): + var msg := reason if not reason.is_empty() else "requires Godot %s+" % min_version + skip(msg + " (running %d.%d)" % [current_major, current_minor]) + return true + return false + + +## Allow one captured SCRIPT ERROR whose text contains `substring`. +## Use only for negative-path tests that intentionally compile or execute +## invalid GDScript and assert on the resulting diagnostics. +func expect_script_error_containing(substring: String) -> void: + _expected_script_error_substrings.append(substring) + + +func _unexpected_script_errors(captured: PackedStringArray) -> PackedStringArray: + var unexpected := PackedStringArray() + var remaining := _expected_script_error_substrings.duplicate() + for error in captured: + var matched_index := -1 + for i in range(remaining.size()): + if error.find(remaining[i]) != -1: + matched_index = i + break + if matched_index == -1: + unexpected.append(error) + else: + remaining.remove_at(matched_index) + return unexpected + + +## Trigger an undo against whichever history (scene or global) holds the most +## recent action. `EditorUndoRedoManager` in Godot 4.x doesn't expose `.undo()` +## directly — you resolve the history's underlying UndoRedo and call it there. +## Actions registered via `add_do_method(self, …)` with a non-scene target land +## in GLOBAL_HISTORY, while actions on scene nodes land in the scene's history, +## so we try both (matches the pattern in batch_handler.gd). +func editor_undo(undo_redo: EditorUndoRedoManager) -> bool: + for ur in _collect_histories(undo_redo): + if ur.undo(): + return true + return false + + +## Mirror of `editor_undo` for redo. +func editor_redo(undo_redo: EditorUndoRedoManager) -> bool: + for ur in _collect_histories(undo_redo): + if ur.redo(): + return true + return false + + +func _collect_histories(undo_redo: EditorUndoRedoManager) -> Array: + var out: Array = [] + if undo_redo == null: + return out + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root != null: + var scene_id := undo_redo.get_object_history_id(scene_root) + var scene_ur := undo_redo.get_history_undo_redo(scene_id) + if scene_ur != null: + out.append(scene_ur) + var global_ur := undo_redo.get_history_undo_redo(EditorUndoRedoManager.GLOBAL_HISTORY) + if global_ur != null and not global_ur in out: + out.append(global_ur) + return out + + +# ----- assertions ----- + +func assert_true(condition: bool, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if not condition: + _failed = true + _message = msg if msg else "Expected true" + + +func assert_false(condition: bool, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if condition: + _failed = true + _message = msg if msg else "Expected false" + + +func assert_eq(actual: Variant, expected: Variant, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if actual != expected: + _failed = true + _message = msg if msg else "Expected %s, got %s" % [str(expected), str(actual)] + + +func assert_ne(actual: Variant, not_expected: Variant, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if actual == not_expected: + _failed = true + _message = msg if msg else "Expected value != %s" % str(not_expected) + + +func assert_gt(actual: Variant, threshold: Variant, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if not (actual > threshold): + _failed = true + _message = msg if msg else "Expected %s > %s" % [str(actual), str(threshold)] + + +func assert_has_key(dict: Variant, key: String, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if not dict is Dictionary: + _failed = true + _message = msg if msg else "Expected Dictionary, got %s" % type_string(typeof(dict)) + return + if not dict.has(key): + _failed = true + _message = msg if msg else "Missing key: %s (keys: %s)" % [key, str(dict.keys())] + + +func assert_contains(haystack: Variant, needle: Variant, msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if haystack is String: + if haystack.find(str(needle)) == -1: + _failed = true + _message = msg if msg else "'%s' not found in '%s'" % [str(needle), haystack] + elif haystack is Array: + if not haystack.has(needle): + _failed = true + _message = msg if msg else "%s not found in array" % str(needle) + else: + _failed = true + _message = msg if msg else "assert_contains requires String or Array" + + +func assert_is_error(result: Dictionary, expected_code: String = "", msg: String = "") -> void: + _assertion_count += 1 + if _failed: + return + if not result.has("error"): + _failed = true + _message = msg if msg else "Expected error response, got: %s" % str(result.keys()) + return + if expected_code and result.error.get("code", "") != expected_code: + _failed = true + _message = msg if msg else "Expected error code %s, got %s" % [expected_code, result.error.get("code", "")] + + +# ----- scene helpers (shared across suites that create/remove Controls) ----- + +## Add a Control under the scene root. Creates a Panel if ctl is null. +## Returns the scene path, or "" when no scene is open — in which case a +## caller-supplied ctl is freed to prevent leaks. +func _add_control(ctl_name: String, ctl: Control = null) -> String: + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + if ctl != null: + ctl.queue_free() + return "" + if ctl == null: + ctl = Panel.new() + ctl.name = ctl_name + scene_root.add_child(ctl) + ctl.owner = scene_root + return "/" + scene_root.name + "/" + ctl_name + + +func _remove_control(path: String) -> void: + var scene_root := EditorInterface.get_edited_scene_root() + if scene_root == null: + return + var node := McpScenePath.resolve(path, scene_root) + if node != null: + node.get_parent().remove_child(node) + node.queue_free() diff --git a/addons/godot_ai/testing/test_suite.gd.uid b/addons/godot_ai/testing/test_suite.gd.uid new file mode 100644 index 0000000..b75e726 --- /dev/null +++ b/addons/godot_ai/testing/test_suite.gd.uid @@ -0,0 +1 @@ +uid://dlrq2s7jhp71s diff --git a/addons/godot_ai/tool_catalog.gd b/addons/godot_ai/tool_catalog.gd new file mode 100644 index 0000000..d1e8b4a --- /dev/null +++ b/addons/godot_ai/tool_catalog.gd @@ -0,0 +1,110 @@ +@tool +class_name McpToolCatalog +extends RefCounted + +## Mirror of src/godot_ai/tools/domains.py — drives the dock's Tools tab +## so the UI can render checkboxes, tool counts, and tooltips without +## round-tripping to a running server. +## +## DO NOT EDIT by hand. tests/unit/test_tool_domains.py verifies this file +## against actual tool registration and fails CI when they drift; the +## failure message prints the up-to-date catalog body for paste-over. +## +## The four core tools are always registered and cannot be excluded — they +## render as a single grayed-out "Core" row in the UI. Each non-core domain +## now exposes one or two named verbs plus a single rolled-up +## `_manage` tool. + +const CORE_TOOLS := [ + "editor_state", + "node_get_properties", + "scene_get_hierarchy", + "session_activate", +] + +## Non-core tools that live in a NON-excludable domain (only `session` +## today), so they appear in no DOMAINS row yet are always registered. +## Counted alongside CORE_TOOLS so the dock's totals match the real +## server surface. +const ALWAYS_ON_TOOLS := [ + "session_manage", +] + +## Ordered list of user-toggleable domains. Each entry: +## id: matches the name passed to `--exclude-domains` +## label: human-friendly display (same as id for now, kept separate so +## a future renaming doesn't break the setting) +## count: number of NON-CORE tools in this domain +## tools: flat list of tool names registered by this domain (non-core only) +const DOMAINS := [ + {"id": "animation", "label": "animation", "count": 2, "tools": ["animation_create", "animation_manage"]}, + {"id": "api", "label": "api", "count": 1, "tools": ["api_manage"]}, + {"id": "audio", "label": "audio", "count": 1, "tools": ["audio_manage"]}, + {"id": "autoload", "label": "autoload", "count": 1, "tools": ["autoload_manage"]}, + {"id": "batch", "label": "batch", "count": 1, "tools": ["batch_execute"]}, + {"id": "camera", "label": "camera", "count": 1, "tools": ["camera_manage"]}, + {"id": "client", "label": "client", "count": 1, "tools": ["client_manage"]}, + {"id": "custom", "label": "custom", "count": 1, "tools": ["custom_manage"]}, + {"id": "editor", "label": "editor", "count": 4, "tools": ["editor_manage", "editor_reload_plugin", "editor_screenshot", "logs_read"]}, + {"id": "filesystem", "label": "filesystem", "count": 1, "tools": ["filesystem_manage"]}, + {"id": "game", "label": "game", "count": 1, "tools": ["game_manage"]}, + {"id": "input_map", "label": "input_map", "count": 1, "tools": ["input_map_manage"]}, + {"id": "material", "label": "material", "count": 1, "tools": ["material_manage"]}, + {"id": "node", "label": "node", "count": 4, "tools": ["node_create", "node_find", "node_manage", "node_set_property"]}, + {"id": "particle", "label": "particle", "count": 1, "tools": ["particle_manage"]}, + {"id": "project", "label": "project", "count": 2, "tools": ["project_manage", "project_run"]}, + {"id": "resource", "label": "resource", "count": 1, "tools": ["resource_manage"]}, + {"id": "scene", "label": "scene", "count": 3, "tools": ["scene_manage", "scene_open", "scene_save"]}, + {"id": "script", "label": "script", "count": 4, "tools": ["script_attach", "script_create", "script_manage", "script_patch"]}, + {"id": "signal", "label": "signal", "count": 1, "tools": ["signal_manage"]}, + {"id": "testing", "label": "testing", "count": 2, "tools": ["test_manage", "test_run"]}, + {"id": "theme", "label": "theme", "count": 1, "tools": ["theme_manage"]}, + {"id": "tilemap", "label": "tilemap", "count": 1, "tools": ["tilemap_manage"]}, + {"id": "tileset", "label": "tileset", "count": 1, "tools": ["tileset_manage"]}, + {"id": "gridmap", "label": "gridmap", "count": 1, "tools": ["gridmap_manage"]}, + {"id": "csg", "label": "csg", "count": 1, "tools": ["csg_manage"]}, + {"id": "ui", "label": "ui", "count": 1, "tools": ["ui_manage"]}, +] + + +## Whether `id` is a real, excludable domain in this plugin version. Used to +## drop stale names (e.g. a domain removed since the setting was written) so +## they never reach the server's `--exclude-domains`, whose `parse_exclude_list` +## hard-fails on unknown names. +static func is_excludable_domain(id: String) -> bool: + for d in DOMAINS: + if d["id"] == id: + return true + return false + + +## Total tool count when no domains are excluded. Used for the "Enabled: N / M" +## readout in the Tools tab without looping the catalog on every repaint. +static func total_tool_count() -> int: + var n := CORE_TOOLS.size() + ALWAYS_ON_TOOLS.size() + for d in DOMAINS: + n += int(d["count"]) + return n + + +## Tool count remaining after excluding the given set of domain ids. +static func enabled_tool_count(excluded: PackedStringArray) -> int: + var n := CORE_TOOLS.size() + ALWAYS_ON_TOOLS.size() + for d in DOMAINS: + if excluded.find(d["id"]) == -1: + n += int(d["count"]) + return n + + +## Canonical comma-separated string for a set of domain ids — sorted and +## deduplicated so two equivalent settings (entered in different orders) +## hash to the same EditorSetting value. Matches `excluded_domains()` in +## client_configurator.gd. +static func canonical(excluded: PackedStringArray) -> String: + var seen := PackedStringArray() + for e in excluded: + var t := e.strip_edges() + if not t.is_empty() and seen.find(t) == -1: + seen.append(t) + seen.sort() + return ",".join(seen) diff --git a/addons/godot_ai/tool_catalog.gd.uid b/addons/godot_ai/tool_catalog.gd.uid new file mode 100644 index 0000000..c0c179b --- /dev/null +++ b/addons/godot_ai/tool_catalog.gd.uid @@ -0,0 +1 @@ +uid://d1vqyt4uyo378 diff --git a/addons/godot_ai/update_reload_runner.gd b/addons/godot_ai/update_reload_runner.gd new file mode 100644 index 0000000..7761e40 --- /dev/null +++ b/addons/godot_ai/update_reload_runner.gd @@ -0,0 +1,590 @@ +@tool +extends Node + +## EditorSetting key used to defer a self_update telemetry event across the +## disable -> enable boundary. The runner runs while the plugin is disabled, +## so it can't send WebSocket events directly; it writes the outcome here +## and the re-enabled plugin's `_enter_tree` flushes it. See +## `plugin.gd::_flush_pending_self_update_telemetry`. +const PENDING_SELF_UPDATE_TELEMETRY_KEY := "godot_ai/pending_self_update_event" + +## Self-update runner. Owns the install-and-reload sequence from +## `start(zip_path, temp_dir, detached_dock)` onward: extract files into +## `addons/godot_ai/` with rollback bookkeeping, scan the filesystem, +## re-enable the plugin, and clean up the detached dock. +## +## Single-phase install: writes the full `_new_file_paths + +## _existing_file_paths` set before issuing exactly one +## `EditorFileSystem.scan()`. Godot's scan-time reparse pass then sees one +## consistent v(N+1) snapshot, so new files and existing files can resolve +## each other's same-release API changes regardless of parse order. +## +## Not owned here: HTTP download (in `utils/update_manager.gd`), banner UI +## (in `mcp_dock.gd`), or server stop prep (called by +## `plugin.gd::install_downloaded_update` before this runner starts via +## `_lifecycle.prepare_for_update_reload()`). +## +## This node is deliberately tiny and not parented under the EditorPlugin: +## it survives `set_plugin_enabled(false)`, extracts the downloaded release, +## waits for Godot's filesystem scan, then enables the plugin again. The old +## dock is detached before this runner starts, kept alive while deferred +## Callables drain, and freed only after the new plugin instance is loaded. + +const PLUGIN_CFG_PATH := "res://addons/godot_ai/plugin.cfg" +const PRE_DISABLE_DRAIN_FRAMES := 8 +const POST_DISABLE_DRAIN_FRAMES := 2 +const POST_ENABLE_FREE_FRAMES := 8 +const INSTALL_BASE_PATH := "res://" +const ZIP_ADDON_PREFIX := "addons/godot_ai/" +const TEMP_FILE_SUFFIX := ".godot_ai_update_tmp" +const INSTALL_BACKUP_SUFFIX := ".update_backup" + +## Outcome of `_install_zip_paths`. `OK` means all listed files were replaced. +## `FAILED_CLEAN` means a write/rename failed mid-batch but every previously +## written file was rolled back to its vN content (or removed, if the file +## was new in vN+1). `FAILED_MIXED` means rollback itself failed: the addons +## tree contains a mix of vN and vN+1 files. The runner MUST NOT re-enable +## the plugin in the MIXED case — see issue #297 finding #9 for the data-loss +## scenario this guards against. +enum InstallStatus { OK, FAILED_CLEAN, FAILED_MIXED } + +var _zip_path := "" +## Old plugin.cfg version, read from disk in `start()` before the extract +## replaces it. Rides the pending self-update marker. +var _from_version := "" +var _temp_dir := "" +var _detached_dock = null +var _started := false +var _next_step := "" +var _frames_remaining := 0 +var _waiting_for_scan := false +var _scan_next_step := "" +## Watchdog for `_start_filesystem_scan`: if Godot's `filesystem_changed` +## signal never fires (slow disk, NFS, AV holding the just-extracted addon +## files open), the runner used to hang in `_waiting_for_scan = true` +## forever and the dock stayed disabled. After this timeout we disconnect +## the signal and proceed anyway — worst case the new files aren't visible +## on the first frame, but they get picked up on the next scan. See +## audit-v2 finding #9 (issue #353). Untyped to match the codebase's +## defensive pattern for state that survives `fs.scan()` during update. +const SCAN_WATCHDOG_SECS := 30.0 +var _scan_watchdog_timer = null +## Sticky flag set by `_on_scan_watchdog_timeout`. Subsequent +## `_start_filesystem_scan` calls in the same update bypass connect+scan +## so a delayed `filesystem_changed` emission from the timed-out scan +## can't fire on a freshly-armed listener for the next scan and falsely +## settle it before that scan actually completed. See PR #381 review for +## the cross-scan race this guards against. +var _scan_timed_out := false +## Keep Array fields untyped: this runner survives fs.scan() during update, +## and typed Variant storage is part of the hot-reload crash class. +var _new_file_paths = [] +var _existing_file_paths = [] +## Per-file install records accumulated during install so a later failure +## can roll back files already replaced earlier in the same update. +## Each entry is an untyped Dictionary with target_path / backup_path / +## had_original keys. Cleared by `_finalize_install_success` on full success +## and by `_rollback_paths_written` on failure. +var _paths_written = [] +## Set true if `_install_zip_file`'s inner restore-from-backup couldn't +## complete (backup gone, copy failed). The failed file is NOT recorded in +## `_paths_written` because the function bails at that point — without this +## flag, `_rollback_paths_written` would walk only the prior records, all +## restore cleanly, and report FAILED_CLEAN even though the current target +## is missing or stale on disk. Surfaces FAILED_MIXED so the runner refuses +## to re-enable the plugin against a half-installed tree. +var _restore_failed := false +## Test-only opt-out for the scan-watchdog `push_warning` lines. The +## watchdog unit tests in `test_update_reload_runner.gd` invoke +## `_on_scan_watchdog_timeout()` and the post-timeout +## `_start_filesystem_scan` bypass branch directly to pin their behavior +## — but those code paths' `push_warning` calls then appear as yellow +## console noise in every `test_run`, training reviewers to ignore the +## runner's real production warnings. Tests set this true; production +## leaves it false so genuine scan timeouts during a real self-update +## still surface loudly. See issue #413. +var _suppress_scan_warnings := false + + +func start(zip_path: String, temp_dir: String, detached_dock) -> void: + if _started: + return + _started = true + _zip_path = zip_path + _temp_dir = temp_dir + _detached_dock = detached_dock + ## Captured before the extract replaces plugin.cfg: the success marker + ## carries from/to versions so the re-enabled plugin can (a) report a + ## complete self_update telemetry event and (b) scope the post-update + ## client repin to entries whose ONLY drift is the old version pin. Pure + ## file IO on purpose — the runner must not call into plugin scripts + ## during the disable window. + _from_version = _read_plugin_cfg_version() + _wait_frames(PRE_DISABLE_DRAIN_FRAMES, "_disable_old_plugin") + + +## Read `version="X.Y.Z"` from the on-disk plugin.cfg. Returns "" when the +## file or key is missing — consumers treat an empty version as "unknown" +## and degrade (telemetry sends empty fields, the repin gate skips). +static func _read_plugin_cfg_version() -> String: + var file := FileAccess.open(PLUGIN_CFG_PATH, FileAccess.READ) + if file == null: + return "" + var text := file.get_as_text() + file.close() + var re := RegEx.new() + if re.compile("(?m)^version=\"([^\"]+)\"") != OK: + return "" + var found := re.search(text) + return found.get_string(1) if found != null else "" + + +func _process(_delta: float) -> void: + if _frames_remaining <= 0: + set_process(false) + return + + _frames_remaining -= 1 + if _frames_remaining <= 0: + var step := _next_step + _next_step = "" + set_process(false) + call(step) + + +func _wait_frames(frame_count: int, next_step: String) -> void: + _next_step = next_step + _frames_remaining = max(1, frame_count) + set_process(true) + + +func _disable_old_plugin() -> void: + ## Disable before writing or scanning new scripts. This avoids both the + ## Dict/Array field-storage hot-reload crash (#245) and cached handler + ## constructor shape mismatches (#247) for plugin-owned instances. + print("MCP | update runner disabling old plugin") + EditorInterface.set_plugin_enabled(PLUGIN_CFG_PATH, false) + _wait_frames(POST_DISABLE_DRAIN_FRAMES, "_extract_and_scan") + + +func _extract_and_scan() -> void: + if not _read_update_manifest(): + EditorInterface.set_plugin_enabled(PLUGIN_CFG_PATH, true) + _wait_frames(POST_ENABLE_FREE_FRAMES, "_cleanup_and_finish") + return + + var install_paths := [] + install_paths.append_array(_new_file_paths) + install_paths.append_array(_existing_file_paths) + + var status := _install_zip_paths(install_paths) + if status != InstallStatus.OK: + _handle_install_failure(status) + return + + _finalize_install_success() + _cleanup_update_temp() + ## One scan covers both dependency directions: plugin.gd's preloads of + ## new files resolve because those files are already present, and new + ## files' references to new members or static-ness changes on existing + ## load-surface scripts resolve because those existing files are also + ## already at v(N+1). The goal is a consistent snapshot before scan, not + ## a tree-atomic install; per-file writes still use `.tmp` + rename and + ## rollback on failure. + _start_filesystem_scan("_enable_new_plugin") + + +func _start_filesystem_scan(next_step: String = "_enable_new_plugin") -> void: + var fs := EditorInterface.get_resource_filesystem() + var deferred_step := next_step if not next_step.is_empty() else "_enable_new_plugin" + if fs == null: + call_deferred(deferred_step) + return + + ## Bypass: a previous scan in this update already watchdog'd, so the + ## editor's filesystem is unresponsive. Re-arming a `filesystem_changed` + ## listener now would race with a delayed emission from the timed-out + ## scan: that single emission would fire whichever listener is currently + ## connected to the shared signal, falsely settling this scan before it + ## actually completed. Skip the wait; Godot's normal background scan + ## catches up after the plugin re-enables. See PR #381 review. + if _scan_timed_out: + if not _suppress_scan_warnings: + push_warning( + "MCP | skipping filesystem_changed wait after previous timeout (next_step=%s)" + % deferred_step + ) + call_deferred(deferred_step) + return + + _waiting_for_scan = true + _scan_next_step = deferred_step + if not fs.filesystem_changed.is_connected(_on_filesystem_changed): + fs.filesystem_changed.connect(_on_filesystem_changed, CONNECT_ONE_SHOT) + _arm_scan_watchdog() + fs.scan() + + +func _arm_scan_watchdog() -> void: + if _scan_watchdog_timer == null: + _scan_watchdog_timer = Timer.new() + _scan_watchdog_timer.one_shot = true + _scan_watchdog_timer.timeout.connect(_on_scan_watchdog_timeout) + add_child(_scan_watchdog_timer) + _scan_watchdog_timer.start(SCAN_WATCHDOG_SECS) + + +func _stop_scan_watchdog() -> void: + if _scan_watchdog_timer != null: + _scan_watchdog_timer.stop() + + +func _on_scan_watchdog_timeout() -> void: + ## Signal didn't fire within SCAN_WATCHDOG_SECS — most likely the + ## filesystem scan is blocked behind a slow disk / NFS / AV scanner + ## still reading the just-extracted addon files. + ## Set the sticky `_scan_timed_out` flag so any subsequent + ## `_start_filesystem_scan` in this update skips its connect+scan + ## (otherwise a delayed emission from this scan would falsely settle + ## the next scan's listener — see PR #381 review). + ## Disconnect the current listener too, so this scan's listener can't + ## double-call `_finish_scan_wait` if the signal arrives quickly after + ## the timeout fires. `_finish_scan_wait` is idempotent on + ## `_waiting_for_scan == false`. + if not _waiting_for_scan: + return + if not _suppress_scan_warnings: + push_warning( + "MCP | filesystem_changed didn't fire within %ds; proceeding without scan confirmation" + % int(SCAN_WATCHDOG_SECS) + ) + _scan_timed_out = true + var fs := EditorInterface.get_resource_filesystem() + if fs != null and fs.filesystem_changed.is_connected(_on_filesystem_changed): + fs.filesystem_changed.disconnect(_on_filesystem_changed) + _finish_scan_wait() + + +func _read_update_manifest() -> bool: + var zip_path := ProjectSettings.globalize_path(_zip_path) + var install_base := ProjectSettings.globalize_path(INSTALL_BASE_PATH) + + var reader := ZIPReader.new() + if reader.open(zip_path) != OK: + print("MCP | update extract failed: could not open %s" % zip_path) + return false + + _new_file_paths.clear() + _existing_file_paths.clear() + var has_plugin_cfg := false + var has_plugin_script := false + var files := reader.get_files() + for file_path in files: + if not file_path.begins_with(ZIP_ADDON_PREFIX): + continue + var rel_path := file_path.trim_prefix(ZIP_ADDON_PREFIX) + ## Many zip builders (`zip -r` without `-D`, AssetLib uploads, hand- + ## built archives) emit zero-byte directory entries like + ## `addons/godot_ai/`. Skip those before the safety check; the + ## empty-segment guard in `_is_safe_zip_addon_file` would otherwise + ## flag the bare prefix as unsafe and abort the extract. Current + ## release.yml passes `-D` to strip them, but installed runners must + ## still tolerate older or manually built zips. + if rel_path.is_empty() or file_path.ends_with("/"): + continue + if not _is_safe_zip_addon_file(file_path): + print("MCP | update extract failed: unsafe zip path %s" % file_path) + reader.close() + return false + if rel_path == "plugin.cfg": + has_plugin_cfg = true + elif rel_path == "plugin.gd": + has_plugin_script = true + var target_path := install_base.path_join(file_path) + if FileAccess.file_exists(target_path): + _existing_file_paths.append(file_path) + else: + _new_file_paths.append(file_path) + reader.close() + if not has_plugin_cfg: + print("MCP | update extract failed: zip is missing plugin.cfg") + return false + if not has_plugin_script: + print("MCP | update extract failed: zip is missing plugin.gd") + return false + return true + + +func _handle_install_failure(status: int) -> void: + _record_pending_self_update({ + "status": "failed_mixed" if status == InstallStatus.FAILED_MIXED else "failed_clean", + }) + if status == InstallStatus.FAILED_MIXED: + ## Half-installed addon tree on disk: re-enabling the plugin would + ## load a mix of vN and vN+1 files. Print a load-bearing diagnostic + ## and bail without re-enabling — user must restore manually. See + ## issue #297 finding #9 for the data-loss scenario. + push_error( + "MCP | self-update failed mid-install AND rollback could not" + + " restore the previous addons/godot_ai/ contents. The plugin" + + " is left disabled. Inspect addons/godot_ai/ for" + + " *.update_backup / *.godot_ai_update_tmp files and restore" + + " manually before re-enabling the plugin." + ) + print( + "MCP | self-update aborted: addons/godot_ai/ is in a mixed state;" + + " plugin left disabled (manual intervention required)." + ) + _wait_frames(POST_ENABLE_FREE_FRAMES, "_cleanup_and_finish") + return + ## FAILED_CLEAN: rollback restored every previously-written file. Safe + ## to re-enable the previous plugin version. + print("MCP | self-update rolled back; re-enabling previous plugin version") + EditorInterface.set_plugin_enabled(PLUGIN_CFG_PATH, true) + _wait_frames(POST_ENABLE_FREE_FRAMES, "_cleanup_and_finish") + + +func _is_safe_zip_addon_file(file_path: String) -> bool: + if file_path.is_absolute_path() or file_path.contains("\\"): + return false + if not file_path.begins_with(ZIP_ADDON_PREFIX): + return false + var rel_path := file_path.trim_prefix(ZIP_ADDON_PREFIX) + if rel_path.is_empty() or rel_path.ends_with("/"): + return false + ## Reserved install-machinery suffixes (#713): an entry named like the + ## runner's own staging/backup files would collide with the temp file + ## `_install_zip_file` writes, or overwrite / later be deleted with the + ## rollback snapshots `_finalize_install_success` cleans up — corrupting + ## the very rollback set protecting this install. + if rel_path.ends_with(TEMP_FILE_SUFFIX) or rel_path.ends_with(INSTALL_BACKUP_SUFFIX): + return false + for segment in rel_path.split("/", true): + if segment.is_empty() or segment == "." or segment == "..": + return false + return true + + +func _install_zip_paths(paths: Array) -> int: + if paths.is_empty(): + return InstallStatus.OK + + var zip_path := ProjectSettings.globalize_path(_zip_path) + var reader := ZIPReader.new() + if reader.open(zip_path) != OK: + print("MCP | update extract failed: could not reopen %s" % zip_path) + ## Nothing else can be written, but earlier files from this update + ## may have landed on disk; roll those back too. + return _rollback_paths_written() + + var install_base := ProjectSettings.globalize_path(INSTALL_BASE_PATH) + for file_path in paths: + var record := _install_zip_file(reader, String(file_path), install_base) + if record.is_empty(): + reader.close() + return _rollback_paths_written() + _paths_written.append(record) + reader.close() + return InstallStatus.OK + + +func _install_zip_file( + reader: ZIPReader, file_path: String, install_base: String +) -> Dictionary: + var target_path := install_base.path_join(file_path) + var dir := target_path.get_base_dir() + if DirAccess.make_dir_recursive_absolute(dir) != OK: + print("MCP | update extract failed: could not create %s" % dir) + return {} + + var temp_path := target_path + TEMP_FILE_SUFFIX + DirAccess.remove_absolute(temp_path) + var content := reader.read_file(file_path) + var f := FileAccess.open(temp_path, FileAccess.WRITE) + if f == null: + print("MCP | update extract failed: could not write %s (error %d)" % [ + temp_path, + FileAccess.get_open_error(), + ]) + return {} + ## `store_buffer` reports a short write only via its return value — it + ## does NOT set the last-error state `get_error()` reads — and the write + ## is stdio-buffered, so disk-full surfaces at flush/close, not here. + ## Capture the return and re-verify the on-disk size after close() so a + ## disk-full "succeeds" write can't rename a truncated file over the + ## live target (#687). + var stored := f.store_buffer(content) + f.flush() + var write_error := f.get_error() + f.close() + ## get_length() on a read handle, not get_file_as_bytes().size() — the + ## latter re-reads the whole file into memory per extracted entry just + ## to learn its length. + var written_size := -1 + var verify := FileAccess.open(temp_path, FileAccess.READ) + if verify != null: + written_size = verify.get_length() + verify.close() + if not stored or write_error != OK or written_size != content.size(): + print("MCP | update extract failed: write validation failed (error %d) for %s (stored=%s size=%d expected=%d)" % [ + write_error, + temp_path, + stored, + written_size, + content.size(), + ]) + DirAccess.remove_absolute(temp_path) + return {} + + ## Back up the original via COPY (not rename) so the source of truth + ## stays in place if a later step fails. Rolled back via + ## `_rollback_paths_written` if a subsequent file in this batch — or a + ## later batch — can't be installed. + var had_original := FileAccess.file_exists(target_path) + var backup_path := target_path + INSTALL_BACKUP_SUFFIX + if had_original: + DirAccess.remove_absolute(backup_path) + if DirAccess.copy_absolute(target_path, backup_path) != OK: + DirAccess.remove_absolute(temp_path) + print("MCP | update extract failed: could not back up %s" % target_path) + return {} + + if DirAccess.rename_absolute(temp_path, target_path) != OK: + ## POSIX and APFS replace atomically. Some filesystems reject + ## rename-over-existing; keep a fallback so the update can still + ## proceed, but the common path never exposes a truncated target. + DirAccess.remove_absolute(target_path) + if DirAccess.rename_absolute(temp_path, target_path) != OK: + DirAccess.remove_absolute(temp_path) + ## Target was removed above; restore from the COPY backup so the + ## addons dir is left in its vN state before we surface failure. + ## Only delete the backup if the restore copy actually succeeded + ## — if it didn't, target_path is missing, and `_restore_failed` + ## tells `_rollback_paths_written` to surface FAILED_MIXED so the + ## runner refuses to re-enable the plugin. Leaving the backup on + ## disk also gives the user a manual recovery path. Without this + ## guard the failed file isn't tracked anywhere (we return `{}`, + ## not appended to `_paths_written`) and the caller would + ## erroneously see FAILED_CLEAN. + if had_original: + if ( + FileAccess.file_exists(backup_path) + and DirAccess.copy_absolute(backup_path, target_path) == OK + ): + DirAccess.remove_absolute(backup_path) + else: + _restore_failed = true + print("MCP | update extract failed: could not replace %s" % target_path) + return {} + return { + "target_path": target_path, + "backup_path": backup_path, + "had_original": had_original, + } + + +## Restore (or remove) every file already touched in this update. Safe to +## call after a partial install — entries are processed in reverse so a +## given target is restored before the next earlier write of the same path +## could resurrect a stale value. Returns FAILED_CLEAN if every entry was +## restored AND no in-flight `_install_zip_file` left a target stranded +## (`_restore_failed`); FAILED_MIXED otherwise. The caller MUST NOT +## re-enable the plugin in the MIXED case. +func _rollback_paths_written() -> int: + var any_failed := false + var i := _paths_written.size() - 1 + while i >= 0: + var record = _paths_written[i] + var target := String(record.get("target_path", "")) + var backup := String(record.get("backup_path", "")) + var had_original := bool(record.get("had_original", false)) + if had_original: + if not FileAccess.file_exists(backup): + print("MCP | update rollback failed: backup missing for %s" % target) + any_failed = true + else: + DirAccess.remove_absolute(target) + if DirAccess.copy_absolute(backup, target) != OK: + print("MCP | update rollback failed: could not restore %s" % target) + any_failed = true + else: + DirAccess.remove_absolute(backup) + else: + if FileAccess.file_exists(target): + if DirAccess.remove_absolute(target) != OK: + print( + "MCP | update rollback failed: could not delete %s" % target + ) + any_failed = true + i -= 1 + _paths_written.clear() + if any_failed or _restore_failed: + return InstallStatus.FAILED_MIXED + return InstallStatus.FAILED_CLEAN + + +## Discard accumulated backups after the combined install succeeds. Backups +## are best-effort: a failure here doesn't compromise the new install, just +## leaves stray *.update_backup files for the user to clean up. +func _finalize_install_success() -> void: + for record in _paths_written: + if record.get("had_original", false): + DirAccess.remove_absolute(String(record.get("backup_path", ""))) + _paths_written.clear() + ## plugin.cfg on disk is the NEW version by now — read it back rather + ## than trusting any in-memory value, so the marker describes what was + ## actually installed. + _record_pending_self_update({ + "status": "success", + "from_version": _from_version, + "to_version": _read_plugin_cfg_version(), + }) + + +## Persist a self_update event description so the re-enabled plugin can +## emit it once its WebSocket is connected. Survives the disable -> enable +## window where the runner cannot send anything itself. +func _record_pending_self_update(data: Dictionary) -> void: + var settings := EditorInterface.get_editor_settings() + if settings == null: + return + settings.set_setting(PENDING_SELF_UPDATE_TELEMETRY_KEY, JSON.stringify(data)) + + +func _cleanup_update_temp() -> void: + DirAccess.remove_absolute(ProjectSettings.globalize_path(_zip_path)) + DirAccess.remove_absolute(ProjectSettings.globalize_path(_temp_dir)) + + +func _on_filesystem_changed() -> void: + _finish_scan_wait() + + +func _finish_scan_wait() -> void: + if not _waiting_for_scan: + return + _waiting_for_scan = false + _stop_scan_watchdog() + var next_step := _scan_next_step + _scan_next_step = "" + set_process(false) + if next_step.is_empty(): + next_step = "_enable_new_plugin" + call_deferred(next_step) + + +func _enable_new_plugin() -> void: + print("MCP | update runner enabling new plugin") + EditorInterface.set_plugin_enabled(PLUGIN_CFG_PATH, true) + _wait_frames(POST_ENABLE_FREE_FRAMES, "_cleanup_and_finish") + + +func _cleanup_and_finish() -> void: + _cleanup_detached_dock() + queue_free() + + +func _cleanup_detached_dock() -> void: + if _detached_dock != null and is_instance_valid(_detached_dock): + _detached_dock.queue_free() + _detached_dock = null diff --git a/addons/godot_ai/update_reload_runner.gd.uid b/addons/godot_ai/update_reload_runner.gd.uid new file mode 100644 index 0000000..9cc6615 --- /dev/null +++ b/addons/godot_ai/update_reload_runner.gd.uid @@ -0,0 +1 @@ +uid://cu6c75n3x2pik diff --git a/addons/godot_ai/utils/allow_hosts.gd b/addons/godot_ai/utils/allow_hosts.gd new file mode 100644 index 0000000..a34c964 --- /dev/null +++ b/addons/godot_ai/utils/allow_hosts.gd @@ -0,0 +1,170 @@ +@tool +class_name McpAllowHosts +extends RefCounted + +## Client-side helpers for the `--allow-host` LAN opt-in (#507, server core +## in #421). Pure static functions only — no EditorSettings, no sockets — +## so the settings-value → launch-args plumbing and the manual-command LAN +## URL builder are deterministically testable without a live editor. +## +## Accepted syntax mirrors the server's `parse_allow_hosts` +## (src/godot_ai/transport/origin_guard.py): each token is a bare IP +## (IPv4 or IPv6) or a CIDR, comma-separated. Host bits set on a CIDR are +## tolerated server-side (`strict=False`), so we only validate the IP part +## and the prefix length here — anything else fails loudly at server +## startup, which the dock-side validation exists to pre-empt. + + +## Canonicalize a comma-separated allow-host value: whitespace-stripped, +## deduplicated, sorted. Returns "" for a value with no usable tokens so +## callers can skip appending `--allow-host` entirely (keeps spawns +## compatible with pre-#421 servers — same contract as +## `ClientConfigurator.excluded_domains()`). +static func normalize(raw: String) -> String: + var parts := PackedStringArray() + for p in raw.split(","): + var t := p.strip_edges() + if not t.is_empty() and parts.find(t) == -1: + parts.append(t) + parts.sort() + return ",".join(parts) + + +## Whether a single token is a bare IP or a CIDR the server will accept. +static func token_is_valid(token: String) -> bool: + var t := token.strip_edges() + if t.is_empty(): + return false + var ip := t + var prefix := 0 + ## Track slash presence separately from the prefix value: reusing -1 as + ## the "no slash" sentinel let an explicit negative prefix like + ## "10.0.0.0/-1" validate (is_valid_int accepts "-1"). CodeRabbit review. + var has_prefix := false + var slash := t.find("/") + if slash != -1: + ip = t.substr(0, slash) + var prefix_text := t.substr(slash + 1) + ## Explicit signs are rejected by the server's parse_allow_hosts + ## (ipaddress refuses "10.0.0.0/+8"), but is_valid_int accepts + ## them — keep the mirror honest. + if prefix_text.is_empty() or prefix_text.begins_with("+") or prefix_text.begins_with("-"): + return false + if not prefix_text.is_valid_int(): + return false + prefix = int(prefix_text) + has_prefix = true + if not ip.is_valid_ip_address(): + return false + var max_prefix := 128 if ip.contains(":") else 32 + return not has_prefix or (prefix >= 0 and prefix <= max_prefix) + + +## Every token in `raw` that fails `token_is_valid` — the dock surfaces +## these inline so a typo is caught before it aborts the server spawn. +static func invalid_tokens(raw: String) -> PackedStringArray: + var bad := PackedStringArray() + for p in raw.split(","): + var t := p.strip_edges() + if t.is_empty(): + continue + if not token_is_valid(t) and bad.find(t) == -1: + bad.append(t) + return bad + + +## True when the allowlist names at least one non-loopback range — i.e. +## the server is actually reachable off this machine and the manual +## command should surface a LAN URL. +static func is_lan_allowlist_active(value: String) -> bool: + for p in value.split(","): + var t := p.strip_edges() + if t.is_empty(): + continue + var ip := t.substr(0, t.find("/")) if t.contains("/") else t + if not _is_loopback(ip): + return true + return false + + +## Choose the LAN address to show in the manual command from the +## machine's local addresses (caller passes `IP.get_local_addresses()` +## so this stays pure). Loopback and link-local addresses are dropped; +## the first private-range IPv4 wins, then any remaining IPv4, then +## anything left (IPv6). Returns `{"address": String, "ambiguous": bool}` +## — `ambiguous` flags multiple viable candidates so the note can tell +## the user to pick the interface on their trusted network. +static func pick_lan_address(addresses: PackedStringArray) -> Dictionary: + var candidates := PackedStringArray() + for a in addresses: + var addr := String(a).strip_edges() + if addr.is_empty() or _is_loopback(addr) or _is_link_local(addr): + continue + candidates.append(addr) + if candidates.is_empty(): + return {"address": "", "ambiguous": false} + var chosen := "" + for addr in candidates: + if _is_private_ipv4(addr): + chosen = addr + break + if chosen.is_empty(): + for addr in candidates: + if addr.contains("."): + chosen = addr + break + if chosen.is_empty(): + chosen = candidates[0] + return {"address": chosen, "ambiguous": candidates.size() > 1} + + +## Informational LAN-URL note appended to the manual command when the +## allowlist is active (#507). Never changes what gets WRITTEN to client +## configs — loopback stays the write target; this is copy-paste help for +## pointing a remote agent at the right address. +static func lan_url_note(allow_hosts_value: String, addresses: PackedStringArray, http_port: int) -> String: + if not is_lan_allowlist_active(allow_hosts_value): + return "" + var pick := pick_lan_address(addresses) + var addr := String(pick.get("address", "")) + if addr.is_empty(): + return ( + "LAN access is enabled (--allow-host %s), but no LAN address was detected on this machine." + % allow_hosts_value + ) + var host := "[%s]" % addr if addr.contains(":") else addr + var note := ( + "LAN access is enabled (--allow-host %s). Remote agents on the allowed network can use: http://%s:%d/mcp" + % [allow_hosts_value, host, http_port] + ) + if bool(pick.get("ambiguous", false)): + note += "\n(multiple network interfaces detected — pick the address on the network you allowed)" + return note + + +static func _is_loopback(addr: String) -> bool: + var a := addr.to_lower() + return a.begins_with("127.") or a == "::1" or a == "localhost" + + +static func _is_link_local(addr: String) -> bool: + var a := addr.to_lower() + if a.begins_with("169.254."): + return true + ## IPv6 link-local is fe80::/10 — the whole fe80-febf first hextet, not + ## just literal "fe80" (Copilot review on #507's PR: fea0::... etc. must + ## also be excluded from LAN-URL candidates). + if a.length() >= 4 and a.begins_with("fe") and a[2] in "89ab": + return true + return false + + +static func _is_private_ipv4(addr: String) -> bool: + if not addr.contains("."): + return false + if addr.begins_with("10.") or addr.begins_with("192.168."): + return true + if addr.begins_with("172."): + var second := int(addr.get_slice(".", 1)) + return second >= 16 and second <= 31 + return false diff --git a/addons/godot_ai/utils/allow_hosts.gd.uid b/addons/godot_ai/utils/allow_hosts.gd.uid new file mode 100644 index 0000000..02fecd1 --- /dev/null +++ b/addons/godot_ai/utils/allow_hosts.gd.uid @@ -0,0 +1 @@ +uid://b7qk3vw2nxr4d diff --git a/addons/godot_ai/utils/class_introspection.gd b/addons/godot_ai/utils/class_introspection.gd new file mode 100644 index 0000000..3076740 --- /dev/null +++ b/addons/godot_ai/utils/class_introspection.gd @@ -0,0 +1,259 @@ +@tool +extends RefCounted + +## Builds stable, JSON-safe metadata for any class registered in ClassDB. + +const VariantSerializer := preload("res://addons/godot_ai/utils/variant_serializer.gd") + +## Sections returned when the caller does not name any. Deliberately narrow: +## a bare `get_class` is almost always "what properties does X have", and the +## full five-section dump for a large class (e.g. Node, Control) costs an agent +## thousands of tokens it rarely wanted. Callers opt into the rest by name, or +## request the lot with the "all" keyword (see `_sections`). +const DEFAULT_SECTIONS: Array[String] = ["properties"] +## The full documentation-shaped section set (excludes the heavier, separately +## gated "inheritors"). Expanded from the "all" keyword. +const ALL_SECTIONS: Array[String] = ["properties", "methods", "signals", "enums", "constants"] +const KNOWN_SECTIONS: Array[String] = ["properties", "methods", "signals", "enums", "constants", "inheritors"] +## Tokens a caller may legitimately pass in `sections` — the known sections plus +## the "all" meta-keyword. Used for error suggestions so a typo like "al" can +## resolve to "all"; "all" is NOT a section (it expands in `_sections`), so it +## stays out of KNOWN_SECTIONS which gates validity. +const SUGGESTABLE_SECTION_TOKENS: Array[String] = [ + "properties", "methods", "signals", "enums", "constants", "inheritors", "all" +] +const MAX_DEFAULT_ITEMS := 100 + + +static func build(type_name: String, options: Dictionary = {}) -> Dictionary: + var sections := _sections(options.get("sections", DEFAULT_SECTIONS)) + var include_inherited := bool(options.get("include_inherited", false)) + var include_inheritors := bool(options.get("include_inheritors", false)) + var offset := max(0, int(options.get("offset", 0))) + var limit := int(options.get("limit", MAX_DEFAULT_ITEMS)) + if limit < 0: + limit = MAX_DEFAULT_ITEMS + var can_instantiate := ClassDB.can_instantiate(type_name) + + var data := { + "class_name": type_name, + "engine_version": Engine.get_version_info().get("string", ""), + "parent_class": str(ClassDB.get_parent_class(type_name)), + "inheritance_chain": _inheritance_chain(type_name), + "can_instantiate": can_instantiate, + "is_singleton": Engine.has_singleton(type_name), + "include_inherited": include_inherited, + "offset": offset, + "limit": limit, + } + if include_inheritors or sections.has("inheritors"): + _add_paged(data, "inheritor", "inheritors", _inheritors(type_name, false), offset, limit) + _add_paged( + data, + "concrete_inheritor", + "concrete_inheritors", + _inheritors(type_name, true), + offset, + limit + ) + if sections.has("properties"): + _add_paged(data, "property", "properties", _properties(type_name, include_inherited), offset, limit) + if sections.has("methods"): + _add_paged(data, "method", "methods", _methods(type_name, include_inherited), offset, limit) + if sections.has("signals"): + _add_paged(data, "signal", "signals", _signals(type_name, include_inherited), offset, limit) + if sections.has("enums"): + _add_paged(data, "enum", "enums", _enums(type_name, include_inherited), offset, limit) + if sections.has("constants"): + _add_paged( + data, + "constant", + "constants", + _unscoped_constants(type_name, include_inherited), + offset, + limit + ) + return data + + +static func validate_sections(raw_sections: Variant) -> Dictionary: + var sections := _sections(raw_sections) + var invalid: Array[String] = [] + for section in sections: + if not KNOWN_SECTIONS.has(section): + invalid.append(section) + return {"sections": sections, "invalid": invalid} + + +static func _inheritance_chain(type_name: String) -> Array[String]: + var chain: Array[String] = [] + var current := type_name + while not current.is_empty(): + chain.append(current) + current = str(ClassDB.get_parent_class(current)) + return chain + + +static func _sections(raw_sections: Variant) -> Array[String]: + var result: Array[String] = [] + var values: Array = [] + if raw_sections is String: + values = raw_sections.split(",", false) + elif raw_sections is Array: + values = raw_sections + else: + values = DEFAULT_SECTIONS + for raw_section in values: + var section := str(raw_section).strip_edges().to_lower() + if section == "all": + for expanded in ALL_SECTIONS: + if not result.has(expanded): + result.append(expanded) + continue + if not section.is_empty() and not result.has(section): + result.append(section) + if result.is_empty(): + result.assign(DEFAULT_SECTIONS) + return result + + +static func _add_paged( + data: Dictionary, + singular: String, + key: String, + items: Array, + offset: int, + limit: int +) -> void: + var end := items.size() if limit == 0 else min(items.size(), offset + limit) + var page: Array = [] + if offset < items.size(): + page = items.slice(offset, end) + data[key] = page + data["%s_count" % singular] = items.size() + data["%s_returned_count" % singular] = page.size() + + +static func _inheritors(type_name: String, concrete_only: bool) -> Array[String]: + var result: Array[String] = [] + for inheritor in ClassDB.get_inheriters_from_class(type_name): + var inheritor_name := str(inheritor) + if concrete_only and not ClassDB.can_instantiate(inheritor_name): + continue + result.append(inheritor_name) + result.sort() + return result + + +static func _properties(type_name: String, include_inherited: bool) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for raw_prop in ClassDB.class_get_property_list(type_name, not include_inherited): + var prop: Dictionary = raw_prop + var usage := int(prop.get("usage", 0)) + if not (usage & PROPERTY_USAGE_EDITOR): + continue + var prop_name := str(prop.get("name", "")) + result.append({ + "name": prop_name, + "type": type_string(int(prop.get("type", TYPE_NIL))), + "class_name": str(prop.get("class_name", "")), + "hint": int(prop.get("hint", PROPERTY_HINT_NONE)), + "hint_string": str(prop.get("hint_string", "")), + "usage": usage, + "default": VariantSerializer.serialize( + ClassDB.class_get_property_default_value(type_name, prop_name) + ), + }) + result.sort_custom(func(a, b): return a.name < b.name) + return result + + +static func _methods(type_name: String, include_inherited: bool) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for raw_method in ClassDB.class_get_method_list(type_name, not include_inherited): + var method: Dictionary = raw_method + var args: Array[Dictionary] = [] + for raw_arg in method.get("args", []): + args.append(_argument_info(raw_arg)) + var defaults: Array = [] + for value in method.get("default_args", []): + defaults.append(VariantSerializer.serialize(value)) + result.append({ + "name": str(method.get("name", "")), + "arguments": args, + "default_arguments": defaults, + "return": _argument_info(method.get("return", {})), + "flags": int(method.get("flags", 0)), + }) + result.sort_custom(func(a, b): return a.name < b.name) + return result + + +static func _signals(type_name: String, include_inherited: bool) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for raw_signal in ClassDB.class_get_signal_list(type_name, not include_inherited): + var signal_info: Dictionary = raw_signal + var args: Array[Dictionary] = [] + for raw_arg in signal_info.get("args", []): + args.append(_argument_info(raw_arg)) + var defaults: Array = [] + for value in signal_info.get("default_args", []): + defaults.append(VariantSerializer.serialize(value)) + result.append({ + "name": str(signal_info.get("name", "")), + "arguments": args, + "default_arguments": defaults, + "flags": int(signal_info.get("flags", 0)), + }) + result.sort_custom(func(a, b): return a.name < b.name) + return result + + +static func _argument_info(raw_info: Variant) -> Dictionary: + var info: Dictionary = raw_info if raw_info is Dictionary else {} + return { + "name": str(info.get("name", "")), + "type": type_string(int(info.get("type", TYPE_NIL))), + "class_name": str(info.get("class_name", "")), + "hint": int(info.get("hint", PROPERTY_HINT_NONE)), + "hint_string": str(info.get("hint_string", "")), + "usage": int(info.get("usage", 0)), + } + + +static func _enums(type_name: String, include_inherited: bool) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + var enum_names: Array[String] = [] + for enum_name in ClassDB.class_get_enum_list(type_name, not include_inherited): + enum_names.append(str(enum_name)) + enum_names.sort() + for enum_name in enum_names: + var values: Array[Dictionary] = [] + for constant_name in ClassDB.class_get_enum_constants(type_name, enum_name, not include_inherited): + values.append({ + "name": str(constant_name), + "value": ClassDB.class_get_integer_constant(type_name, constant_name), + }) + values.sort_custom(func(a, b): return a.name < b.name) + result.append({ + "name": enum_name, + "is_bitfield": ClassDB.is_class_enum_bitfield(type_name, enum_name, not include_inherited), + "values": values, + }) + return result + + +static func _unscoped_constants(type_name: String, include_inherited: bool) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for constant_name in ClassDB.class_get_integer_constant_list(type_name, not include_inherited): + var enum_name := str( + ClassDB.class_get_integer_constant_enum(type_name, constant_name, not include_inherited) + ) + if not enum_name.is_empty(): + continue + result.append({ + "name": str(constant_name), + "value": ClassDB.class_get_integer_constant(type_name, constant_name), + }) + result.sort_custom(func(a, b): return a.name < b.name) + return result diff --git a/addons/godot_ai/utils/class_introspection.gd.uid b/addons/godot_ai/utils/class_introspection.gd.uid new file mode 100644 index 0000000..3eda5ca --- /dev/null +++ b/addons/godot_ai/utils/class_introspection.gd.uid @@ -0,0 +1 @@ +uid://caedbsmsl6fk4 diff --git a/addons/godot_ai/utils/diagnostics_capture.gd b/addons/godot_ai/utils/diagnostics_capture.gd new file mode 100644 index 0000000..22441ad --- /dev/null +++ b/addons/godot_ai/utils/diagnostics_capture.gd @@ -0,0 +1,66 @@ +@tool +class_name McpDiagnosticsCapture +extends RefCounted + +## Small helper for scoped validation-log capture windows. Callers snapshot a +## private log cursor, perform a deliberate validation action, then only report +## new diagnostics whose original source location is the target file. + + +static func capture_this_file(log_buffer: McpEditorLogBuffer, target_path: String, action: Callable) -> Dictionary: + var cursor := 0 + if log_buffer != null: + cursor = log_buffer.appended_total() + + var action_result = action.call() + var diagnostics: Array[Dictionary] = [] + var truncated := false + + if log_buffer != null: + var captured: Dictionary = log_buffer.get_since(cursor) + truncated = captured.get("truncated", false) + diagnostics = _diagnostics_for_target(captured.get("entries", []), target_path) + + return { + "action": action_result if action_result is Dictionary else {}, + "diagnostics": diagnostics, + "diagnostics_detail": "log_capture" if not diagnostics.is_empty() else "none", + "diagnostics_scope": "this_file", + "diagnostics_status": "partial" if truncated else "checked", + } + + +static func _diagnostics_for_target(entries: Array, target_path: String) -> Array[Dictionary]: + var out: Array[Dictionary] = [] + for raw_entry in entries: + if not raw_entry is Dictionary: + continue + var entry: Dictionary = raw_entry + if not _entry_matches_target(entry, target_path): + continue + out.append(_normalize_entry(entry, target_path)) + return out + + +static func _entry_matches_target(entry: Dictionary, target_path: String) -> bool: + var source := _source_location(entry) + return str(source.get("path", "")) == target_path + + +static func _normalize_entry(entry: Dictionary, target_path: String) -> Dictionary: + var normalized := entry.duplicate(true) + var source := _source_location(entry) + normalized["path"] = str(source.get("path", target_path)) + normalized["line"] = int(source.get("line", normalized.get("line", 0))) + normalized["function"] = str(source.get("function", normalized.get("function", ""))) + if normalized.has("details") and normalized.details is Dictionary: + normalized["details"] = normalized.details.duplicate(true) + return normalized + + +static func _source_location(entry: Dictionary) -> Dictionary: + if entry.get("details") is Dictionary: + var details: Dictionary = entry.details + if details.get("source") is Dictionary: + return details.source + return {} diff --git a/addons/godot_ai/utils/diagnostics_capture.gd.uid b/addons/godot_ai/utils/diagnostics_capture.gd.uid new file mode 100644 index 0000000..95973c9 --- /dev/null +++ b/addons/godot_ai/utils/diagnostics_capture.gd.uid @@ -0,0 +1 @@ +uid://b3npxxpuobbc2 diff --git a/addons/godot_ai/utils/editor_log_buffer.gd b/addons/godot_ai/utils/editor_log_buffer.gd new file mode 100644 index 0000000..0ea44e7 --- /dev/null +++ b/addons/godot_ai/utils/editor_log_buffer.gd @@ -0,0 +1,127 @@ +@tool +class_name McpEditorLogBuffer +extends McpStructuredLogRing + +## Ring buffer for editor-process script errors and warnings (parse errors, +## @tool runtime errors, EditorPlugin errors, push_error/push_warning) captured +## by editor_logger.gd's Logger subclass. +## +## Smaller cap than McpGameLogBuffer (500 vs 2000) — the editor only emits errors, +## not the full println firehose a game can produce. No run_id rotation: editor +## errors persist across project_run cycles (they're about *editing* state, not +## about the playing game). +## +## Mutex-protected because Logger virtuals can fire from any thread (e.g. +## async script-loader threads emitting parse errors), and the buffer is +## read on the main thread by EditorHandler.get_logs. Each public method +## wraps the base ring's lockless helpers in `_mutex.lock()/unlock()` — +## the base stays lockless so McpGameLogBuffer's hot path doesn't pay an +## unused mutex cost. +## +## Entry shape: {source: "editor", level: "info"|"warn"|"error", +## text, path, line, function} — `path/line/function` may be empty/zero +## when the source location wasn't recoverable (e.g. printerr from a +## thread without a script context). + +const MAX_LINES := 500 + +var _mutex := Mutex.new() +var _error_appended_total := 0 +var _warn_appended_total := 0 + + +func _init() -> void: + super._init(MAX_LINES) + + +func append(level: String, text: String, path: String = "", line: int = 0, function: String = "", details: Dictionary = {}) -> void: + var coerced_level := _coerce_level(level) + var entry := { + "source": "editor", + "level": coerced_level, + "text": text, + "path": path, + "line": line, + "function": function, + } + if not details.is_empty(): + entry["details"] = details.duplicate(true) + _mutex.lock() + _append_entry(entry) + if coerced_level == "error": + _error_appended_total += 1 + elif coerced_level == "warn": + _warn_appended_total += 1 + _mutex.unlock() + + +func get_range(offset: int, count: int) -> Array[Dictionary]: + _mutex.lock() + var out := _get_range_unlocked(offset, count) + _mutex.unlock() + return out + + +func get_recent(count: int) -> Array[Dictionary]: + ## Single-lock so the size we compute `start` from can't race against + ## a concurrent append between the size read and the slice copy. + _mutex.lock() + var size := _total_count_unlocked() + var start := maxi(0, size - count) + var out := _get_range_unlocked(start, size - start) + _mutex.unlock() + return out + + +func get_since(since_seq: int, limit: int = -1) -> Dictionary: + ## Single-lock so the cursor snapshot and slice copy can't race against a + ## Logger-thread append. + _mutex.lock() + var out := _get_since_unlocked(since_seq, limit) + _mutex.unlock() + return out + + +func total_count() -> int: + _mutex.lock() + var n := _total_count_unlocked() + _mutex.unlock() + return n + + +func dropped_count() -> int: + _mutex.lock() + var n := _dropped_count_unlocked() + _mutex.unlock() + return n + + +func appended_total() -> int: + _mutex.lock() + var n := _appended_total_unlocked() + _mutex.unlock() + return n + + +func error_appended_total() -> int: + _mutex.lock() + var n := _error_appended_total + _mutex.unlock() + return n + + +func warn_appended_total() -> int: + _mutex.lock() + var n := _warn_appended_total + _mutex.unlock() + return n + + +func clear() -> int: + _mutex.lock() + var n := _total_count_unlocked() + _clear_storage() + _error_appended_total = 0 + _warn_appended_total = 0 + _mutex.unlock() + return n diff --git a/addons/godot_ai/utils/editor_log_buffer.gd.uid b/addons/godot_ai/utils/editor_log_buffer.gd.uid new file mode 100644 index 0000000..8c8d823 --- /dev/null +++ b/addons/godot_ai/utils/editor_log_buffer.gd.uid @@ -0,0 +1 @@ +uid://b6ynms0856hhq diff --git a/addons/godot_ai/utils/error_codes.gd b/addons/godot_ai/utils/error_codes.gd new file mode 100644 index 0000000..5dc3466 --- /dev/null +++ b/addons/godot_ai/utils/error_codes.gd @@ -0,0 +1,163 @@ +@tool +class_name McpErrorCodes +extends RefCounted + +## Error code constants shared across handlers. Mirrors protocol/errors.py. +## +## This `class_name` shipped in v2.3.2 and earlier and must stay reachable +## through self-update. v2.4.1 dropped it and triggered a "Could not resolve +## script" cascade for every user upgrading from any earlier version; v2.4.2 +## restored it as a hot-fix. The cascade fires because Godot keeps stale +## registry entries during the disable -> extract -> enable window when a +## previously-registered class_name disappears, and that failure mode is +## independent of the runner's install ordering. See CLAUDE.md's +## never-delete-published-class_name policy for the shape-aware shim path +## that retirement (if ever needed) must follow. +## +## All consumers use the preload-alias pattern +## (`const ErrorCodes := preload(...)`) introduced in #412. The alias is +## stylistic; both `McpErrorCodes.X` and `ErrorCodes.X` resolve through the +## same Script object cache, so the alias is not a parse-safety boundary +## under the single-phase runner. + +const INVALID_PARAMS := "INVALID_PARAMS" +const EDITED_SCENE_MISMATCH := "EDITED_SCENE_MISMATCH" +const EDITOR_NOT_READY := "EDITOR_NOT_READY" +const UNKNOWN_COMMAND := "UNKNOWN_COMMAND" +const INTERNAL_ERROR := "INTERNAL_ERROR" +const DEFERRED_TIMEOUT := "DEFERRED_TIMEOUT" +## Python-originated attach bridge codes. GDScript has no emit path, but the +## public registry intentionally mirrors protocol/errors.py. +const TRANSPORT_OUTCOME_UNKNOWN := "TRANSPORT_OUTCOME_UNKNOWN" +const NEW_CLIENT_SESSION_REQUIRED := "NEW_CLIENT_SESSION_REQUIRED" +const ATTACH_LOCK_TIMEOUT := "ATTACH_LOCK_TIMEOUT" +const ATTACH_LOCK_ERROR := "ATTACH_LOCK_ERROR" +const ATTACH_RUNTIME_DIR_ERROR := "ATTACH_RUNTIME_DIR_ERROR" +const PORT_OCCUPIED := "PORT_OCCUPIED" +const BACKEND_START_FAILED := "BACKEND_START_FAILED" +const BACKEND_START_TIMEOUT := "BACKEND_START_TIMEOUT" +# game_eval failure codes (#490) — keep in sync with protocol/errors.py +const EVAL_COMPILE_ERROR := "EVAL_COMPILE_ERROR" +const EVAL_RUNTIME_ERROR := "EVAL_RUNTIME_ERROR" +## #518/#859: the play session is up (EditorInterface.is_playing_scene() is true, +## so editor_handler's EDITOR_NOT_READY "game is not running" gate already +## passed) but the game cannot service evals: the helper did not register within +## EVAL_READY_WAIT_SEC, its main-loop beacon is stale, or its debugger session +## closed mid-eval. Carved out of INTERNAL_ERROR so these fast, +## caller-actionable failures do not burn the opaque 10s eval backstop. +const EVAL_GAME_NOT_READY := "EVAL_GAME_NOT_READY" +## #518: the eval genuinely never finished inside the timeout ladder — the +## game-side 8s deadline aborted a hung await, or the editor-side 10s backstop +## fired because the game never replied at all (CPU-bound loop, frozen / +## backgrounded idle loop). Carved out of INTERNAL_ERROR — the last big +## still-unlabeled bucket from #487/#488 — so "your eval code never finished" +## stops reading as an internal fault in telemetry and agent-facing errors. +const EVAL_HUNG := "EVAL_HUNG" +## #518: the eval completed but its serialized result is too large for the +## debugger + WebSocket pipeline. Without this the reply is dropped silently +## (the debugger TCP peer discards messages over ~8 MiB) and the request rides +## to the 10s backstop as a phantom "hang". Failing fast game-side with the +## real byte count makes the failure actionable (return a smaller slice). +const EVAL_RESULT_TOO_LARGE := "EVAL_RESULT_TOO_LARGE" +## #777: a game-side request (currently editor_screenshot source="game") +## reached a live, registered game helper but no reply came back before the +## editor-side timer fired. Every editor gate already passed +## (is_playing_scene, helper hello) so this is a TOP-LEVEL code, not an +## EDITOR_NOT_READY sub-code: the game process itself failed to respond — +## backgrounded with a frozen main loop and nothing rendered to fall back +## on, main thread blocked, or the helper died mid-run. Carved out of +## INTERNAL_ERROR (the largest opaque timeout bucket fleet-wide) so the +## residual timeout is attributable and actionable. +const GAME_HELPER_TIMEOUT := "GAME_HELPER_TIMEOUT" +## audit-v2 #21 (issue #365): finer-grained codes carved out of the 471 +## INVALID_PARAMS sites so agents can distinguish recoverable input +## errors from structural ones. INVALID_PARAMS stays for genuinely +## catch-all input errors that don't fit any of the buckets below. +## +## - NODE_NOT_FOUND: scene-tree/autoload node lookup failed (path didn't +## resolve to a Node). +## - RESOURCE_NOT_FOUND: a `res://` path lookup failed (file/.tres/ +## .gdshader/.tscn etc. doesn't exist or couldn't load). Distinct from +## NODE_NOT_FOUND because the recovery path differs — agents need to +## know whether to fix a node path vs. create/import a resource. +## - PROPERTY_NOT_ON_CLASS: property/signal/method/uniform/slot lookup +## failed on a known instance (path resolved, but the requested +## member doesn't exist on that class). +## - VALUE_OUT_OF_RANGE: numeric/index bound violation OR enum value +## not in the allowed set. +## - WRONG_TYPE: input was a value (or a loaded resource) of the wrong +## type — the param was provided, but `typeof` or `is X` failed. +## - MISSING_REQUIRED_PARAM: required input field was absent or empty. +const NODE_NOT_FOUND := "NODE_NOT_FOUND" +const RESOURCE_NOT_FOUND := "RESOURCE_NOT_FOUND" +const PROPERTY_NOT_ON_CLASS := "PROPERTY_NOT_ON_CLASS" +const VALUE_OUT_OF_RANGE := "VALUE_OUT_OF_RANGE" +const WRONG_TYPE := "WRONG_TYPE" +const MISSING_REQUIRED_PARAM := "MISSING_REQUIRED_PARAM" +const CUSTOM_TOOL_NOT_UNDOABLE := "CUSTOM_TOOL_NOT_UNDOABLE" +const CUSTOM_TOOL_DISABLED := "CUSTOM_TOOL_DISABLED" + +## #651 stage 1: EDITOR_NOT_READY sub-codes. These travel in +## `error.data.sub_code`, NEVER as the top-level `error.code` — existing +## callers and dashboards key on EDITOR_NOT_READY, so the top-level code is +## frozen. Each sub-code names the concrete editor state at rejection time, +## limited to states EditorInterface/EditorFileSystem can report +## deterministically. States we cannot observe (script compilation, +## resource reload, modal dialogs) intentionally get NO sub-code: a bare +## EDITOR_NOT_READY stays the honest fallback rather than a guessed label. +## Keep in sync with protocol/errors.py::EditorNotReadySubCode — enforced +## by tests/unit/test_editor_not_ready_hint_contract.py. +const SUB_EDITOR_IMPORTING := "EDITOR_IMPORTING" +const SUB_EDITOR_PLAYING := "EDITOR_PLAYING" +const SUB_EDITOR_NO_SCENE := "EDITOR_NO_SCENE" +const SUB_EDITOR_GAME_NOT_RUNNING := "EDITOR_GAME_NOT_RUNNING" +const SUB_EDITOR_VIEWPORT_UNAVAILABLE := "EDITOR_VIEWPORT_UNAVAILABLE" +const SUB_EDITOR_VIEWPORT_NOT_3D := "EDITOR_VIEWPORT_NOT_3D" +const SUB_EDITOR_VIEWPORT_EMPTY := "EDITOR_VIEWPORT_EMPTY" +const SUB_EDITOR_UNAVAILABLE := "EDITOR_UNAVAILABLE" +## Emitted only by the exclusive-run transport servicing path: a command +## arrived while a synchronous test run holds the main thread, and was +## rejected (not buffered) so it can't replay stale after its server-side +## future expires. See connection.gd::service_transport_during_exclusive_run. +const SUB_EDITOR_TEST_RUNNING := "EDITOR_TEST_RUNNING" + +## Terminal code for a test run that hit its between-test abort ceiling +## before finishing. error.data carries the partial summary; full partial +## results stay retrievable via get_test_results. +const TEST_RUN_TIMEOUT := "TEST_RUN_TIMEOUT" + + +## Build a standard error response dictionary. +static func make(code: String, message: String) -> Dictionary: + return {"status": "error", "error": {"code": code, "message": message}} + + +## Build an EDITOR_NOT_READY error carrying the #651 stage-1 attribution +## payload: `data.sub_code` + `retryable` + `hint`. Mirrors the shape +## scene_path.gd::require_edited_scene established (editor_state/retryable/ +## hint). `hint` may be empty when `message` already IS the recovery hint — +## the server's GodotCommandError string-appends every data key, so +## duplicating the message into data would double the agent-visible text. +static func make_not_ready( + sub_code: String, message: String, retryable: bool, hint: String = "" +) -> Dictionary: + var err := make(EDITOR_NOT_READY, message) + var data := {"sub_code": sub_code, "retryable": retryable} + if not hint.is_empty(): + data["hint"] = hint + err["error"]["data"] = data + return err + + +## Return a NEW error dict with the original code and a prefixed message. +## Prefer this over mutating `err["error"]["message"]` in place — callers +## that want to add context ("Property '%s': …") shouldn't need to know +## the internal shape of the dict returned by `make`. Empty `prefix` +## returns `err` unchanged so callers don't need their own guard. +static func prefix_message(err: Dictionary, prefix: String) -> Dictionary: + if prefix.is_empty(): + return err + var inner: Dictionary = err.get("error", {}) + var code: String = inner.get("code", INTERNAL_ERROR) + var message: String = inner.get("message", "") + return make(code, "%s: %s" % [prefix, message]) diff --git a/addons/godot_ai/utils/error_codes.gd.uid b/addons/godot_ai/utils/error_codes.gd.uid new file mode 100644 index 0000000..fcc1e82 --- /dev/null +++ b/addons/godot_ai/utils/error_codes.gd.uid @@ -0,0 +1 @@ +uid://d2klnglf5p861 diff --git a/addons/godot_ai/utils/fuzzy_suggestions.gd b/addons/godot_ai/utils/fuzzy_suggestions.gd new file mode 100644 index 0000000..de7cc19 --- /dev/null +++ b/addons/godot_ai/utils/fuzzy_suggestions.gd @@ -0,0 +1,39 @@ +@tool +extends RefCounted + +## Shared fuzzy ranking for typo suggestions. + + +static func rank( + needle: String, + candidates: Array, + limit: int = 5, + threshold: float = 0.4, + substring_bonus: float = 0.5, + prefix_bonus: float = 1.0 +) -> Array[String]: + if needle.is_empty() or candidates.is_empty(): + return [] + var needle_lower := needle.to_lower() + var scored: Array = [] + for raw_candidate in candidates: + var candidate := str(raw_candidate) + var candidate_lower := candidate.to_lower() + var score := needle.similarity(candidate) + if prefix_bonus != 0.0 and candidate_lower.begins_with(needle_lower): + score += prefix_bonus + elif substring_bonus != 0.0 and ( + candidate_lower.contains(needle_lower) or needle_lower.contains(candidate_lower) + ): + score += substring_bonus + if score >= threshold: + scored.append([score, candidate]) + scored.sort_custom(func(a, b): + if a[0] == b[0]: + return a[1] < b[1] + return a[0] > b[0] + ) + var result: Array[String] = [] + for index in range(min(limit, scored.size())): + result.append(scored[index][1]) + return result diff --git a/addons/godot_ai/utils/fuzzy_suggestions.gd.uid b/addons/godot_ai/utils/fuzzy_suggestions.gd.uid new file mode 100644 index 0000000..c663d01 --- /dev/null +++ b/addons/godot_ai/utils/fuzzy_suggestions.gd.uid @@ -0,0 +1 @@ +uid://bxwaws6w0xw60 diff --git a/addons/godot_ai/utils/game_log_buffer.gd b/addons/godot_ai/utils/game_log_buffer.gd new file mode 100644 index 0000000..2f1b3b0 --- /dev/null +++ b/addons/godot_ai/utils/game_log_buffer.gd @@ -0,0 +1,105 @@ +@tool +class_name McpGameLogBuffer +extends McpStructuredLogRing + +## Ring buffer for game-process log lines (print, push_warning, push_error) +## ferried back from the playing game over the EngineDebugger channel. +## +## Larger cap than McpEditorLogBuffer because games can be noisy. `run_id` +## rotates at play-start, giving agents a stable cursor for "lines from +## this run" even when the game never reaches the mcp:hello boot beacon. +## +## Single-threaded — game_helper.gd drains its logger from `_process` and +## calls `append` from the main thread, so this subclass can use the base +## ring's lockless reads/writes directly. + +const MAX_LINES := 2000 + +var _run_id := "" +var _run_seq := 0 +var _error_warn_total := 0 +var _error_total := 0 + + +func _init() -> void: + super._init(MAX_LINES) + + +func append(level: String, text: String, details: Dictionary = {}) -> void: + var coerced_level := _coerce_level(level) + var entry := { + "source": "game", + "level": coerced_level, + "text": text, + "run_id": _run_id, + } + if not details.is_empty(): + entry["details"] = details.duplicate(true) + _append_entry(entry) + if coerced_level in ["warn", "error"]: + _error_warn_total += 1 + if coerced_level == "error": + _error_total += 1 + + +## Rotate the run identifier without dropping buffered entries. Called at +## play-start so even no-hello parse failures get a fresh current-run identity. +## Historical lines stay tagged with their original run_id and can still be +## queried explicitly. +func clear_for_new_run() -> String: + _run_id = _generate_run_id() + _error_warn_total = 0 + _error_total = 0 + return _run_id + + +func run_id() -> String: + return _run_id + + +func error_warn_total() -> int: + return _error_warn_total + + +func error_total() -> int: + return _error_total + + +## Warn-level lines for the current run: the combined error+warn tally minus +## the error-only tally. Feeds the `game_warn` watermark component so a run +## that only emitted push_warning is no longer reported as clean. +func warn_total() -> int: + return _error_warn_total - _error_total + + +func get_run_range(run_id: String, offset: int, count: int) -> Array[Dictionary]: + return get_run_page(run_id, offset, count).entries + + +func get_run_page(run_id: String, offset: int, count: int) -> Dictionary: + var entries := _entries_for_run(run_id) + var start := mini(maxi(0, offset), entries.size()) + var stop := mini(entries.size(), start + maxi(0, count)) + var out: Array[Dictionary] = [] + for i in range(start, stop): + out.append(entries[i]) + return { + "entries": out, + "total_count": entries.size(), + } + + +func _entries_for_run(run_id: String) -> Array[Dictionary]: + var out: Array[Dictionary] = [] + for entry in get_range(0, total_count()): + if str(entry.get("run_id", "")) == run_id: + out.append(entry) + return out + + +func _generate_run_id() -> String: + ## Opaque to agents — they only check equality. Time-based is plenty + ## unique within a single editor session; the local sequence protects + ## fast back-to-back test runs within the same millisecond. + _run_seq += 1 + return "r%d-%d" % [Time.get_ticks_msec(), _run_seq] diff --git a/addons/godot_ai/utils/game_log_buffer.gd.uid b/addons/godot_ai/utils/game_log_buffer.gd.uid new file mode 100644 index 0000000..6c7ce7d --- /dev/null +++ b/addons/godot_ai/utils/game_log_buffer.gd.uid @@ -0,0 +1 @@ +uid://biojw0xl64haw diff --git a/addons/godot_ai/utils/json_values.gd b/addons/godot_ai/utils/json_values.gd new file mode 100644 index 0000000..d745d02 --- /dev/null +++ b/addons/godot_ai/utils/json_values.gd @@ -0,0 +1,92 @@ +@tool +class_name McpJsonValues +extends RefCounted + +## Canonical JSON→Variant parsers for the wire shapes agents send. +## +## One parser family instead of five drifted per-handler copies (#714) — +## the canonical color set is the maintainer decision recorded on that +## issue. parse_color accepts: Color passthrough; "#rrggbb"/"#rrggbbaa" +## hex or named-color strings (two-sentinel Color.from_string +## validation); {r,g,b[,a]} dicts; [r,g,b[,a]] arrays. parse_vector2/3 +## accept the Vector passthrough, {x,y[,z]} dicts, and [x,y[,z]] arrays. +## +## Strict WITHIN each shape (the #123/#126 contract): wrong dict keys, +## wrong array lengths, or non-numeric components return null instead of +## guessing zeros — callers turn null into their own typed error. + +const COLOR_KEYS: Array[String] = ["r", "g", "b"] +const VECTOR2_KEYS: Array[String] = ["x", "y"] +const VECTOR3_KEYS: Array[String] = ["x", "y", "z"] + + +static func parse_color(value: Variant) -> Variant: + if value is Color: + return value + if value is String: + ## Color.from_string returns the fallback on parse failure — call + ## twice with distinct sentinels; agreement means a real parse. + var a := Color.from_string(value, Color(0, 0, 0, 0)) + var b := Color.from_string(value, Color(1, 1, 1, 1)) + if a != b: + return null + return a + if value is Dictionary: + var d: Dictionary = value + if not d.has_all(COLOR_KEYS): + return null + var alpha: Variant = d.get("a", 1.0) + if not (_is_number(d.r) and _is_number(d.g) and _is_number(d.b) and _is_number(alpha)): + return null + return Color(float(d.r), float(d.g), float(d.b), float(alpha)) + if value is Array: + var arr: Array = value + if arr.size() != 3 and arr.size() != 4: + return null + for item in arr: + if not _is_number(item): + return null + var a4 := float(arr[3]) if arr.size() == 4 else 1.0 + return Color(float(arr[0]), float(arr[1]), float(arr[2]), a4) + return null + + +static func parse_vector2(value: Variant) -> Variant: + if value is Vector2: + return value + if value is Dictionary: + var d: Dictionary = value + if not d.has_all(VECTOR2_KEYS) or not (_is_number(d.x) and _is_number(d.y)): + return null + return Vector2(float(d.x), float(d.y)) + if value is Array: + var arr: Array = value + if arr.size() != 2 or not (_is_number(arr[0]) and _is_number(arr[1])): + return null + return Vector2(float(arr[0]), float(arr[1])) + return null + + +static func parse_vector3(value: Variant) -> Variant: + if value is Vector3: + return value + if value is Dictionary: + var d: Dictionary = value + if not d.has_all(VECTOR3_KEYS): + return null + if not (_is_number(d.x) and _is_number(d.y) and _is_number(d.z)): + return null + return Vector3(float(d.x), float(d.y), float(d.z)) + if value is Array: + var arr: Array = value + if arr.size() != 3: + return null + for item in arr: + if not _is_number(item): + return null + return Vector3(float(arr[0]), float(arr[1]), float(arr[2])) + return null + + +static func _is_number(v: Variant) -> bool: + return v is int or v is float diff --git a/addons/godot_ai/utils/json_values.gd.uid b/addons/godot_ai/utils/json_values.gd.uid new file mode 100644 index 0000000..b3eeba9 --- /dev/null +++ b/addons/godot_ai/utils/json_values.gd.uid @@ -0,0 +1 @@ +uid://4wbf83hwckms diff --git a/addons/godot_ai/utils/log_backtrace.gd b/addons/godot_ai/utils/log_backtrace.gd new file mode 100644 index 0000000..3fdf838 --- /dev/null +++ b/addons/godot_ai/utils/log_backtrace.gd @@ -0,0 +1,113 @@ +@tool +class_name McpLogBacktrace +extends RefCounted + +## Helpers for interpreting Godot's `_log_error` virtual arguments. +## (Named `McpLogBacktrace`, not `ScriptBacktrace`: Godot ships a built-in +## `ScriptBacktrace` class — the type of `script_backtraces[i]` entries +## — so class_name'ing ours the same would collide. Verified against +## the engine's `--doctool` output in 4.6.) +## +## Both `editor_logger.gd` and `game_logger.gd` need to: +## - Map `error_type` (0=ERROR, 1=WARNING, 2=SCRIPT, 3=SHADER) to a +## two-bucket "error" / "warn" string so callers can filter without +## consulting the enum. +## - Fall back to `code` when `rationale` is empty — single-arg +## `push_error("msg")` leaves rationale empty and stuffs the user's +## string into `code`; without the fallback the user message is +## silently lost. The two-arg form `push_error(code, rationale)` +## populates both and rationale wins. +## - Remap the source location to the first frame of `script_backtraces[0]` +## when present. `push_error` / `push_warning` always report +## `file=core/variant/variant_utility.cpp`; the actual user GDScript +## caller is in the backtrace. +## +## Centralising the rules keeps the next push_error semantics shift +## (already happened once between 4.5 and 4.6, see PR #78) a one-place +## fix instead of a two-place hunt. + + +## Coalesce the per-virtual-arg shape Godot hands `_log_error` into a +## flat record. Always walks `script_backtraces` for the first non-empty +## frame; loggers that need to filter by source path call this first and +## then check the resolved `path` field. +## +## Returns: `{level, message, path, line, function, details}` +## - `level`: "error" or "warn" (warn iff `error_type == 1`). +## - `message`: `rationale` when non-empty, else `code`. +## - `path` / `line` / `function`: first backtrace frame when one is +## available; otherwise the original `file` / `line` / `function`. +## - `details`: original `_log_error` fields plus the first non-empty +## backtrace as frames, mirroring the debugger Errors tab context. +const ERROR_TYPE_NAMES := { + 0: "error", + 1: "warning", + 2: "script", + 3: "shader", +} + + +static func resolve_error( + function: String, + file: String, + line: int, + code: String, + rationale: String, + error_type: int, + script_backtraces: Array, +) -> Dictionary: + var src_file := file + var src_line := line + var src_function := function + var frames: Array[Dictionary] = [] + ## First non-empty frame wins, not just `script_backtraces[0]` — + ## chained errors can leave the leading entry empty with the actual + ## user frame in `script_backtraces[1]`. + for bt in script_backtraces: + if bt != null and bt.get_frame_count() > 0: + frames = _frames_from_backtrace(bt) + src_file = str(frames[0].get("path", "")) + src_line = int(frames[0].get("line", 0)) + src_function = str(frames[0].get("function", "")) + break + var message := rationale if not rationale.is_empty() else code + return { + "level": "warn" if error_type == 1 else "error", + "message": message, + "path": src_file, + "line": src_line, + "function": src_function, + "details": { + "message": message, + "code": code, + "rationale": rationale, + "error_type": error_type, + "error_type_name": _error_type_name(error_type), + "source": { + "path": file, + "line": line, + "function": function, + }, + "resolved": { + "path": src_file, + "line": src_line, + "function": src_function, + }, + "frames": frames, + }, + } + + +static func _frames_from_backtrace(bt) -> Array[Dictionary]: + var frames: Array[Dictionary] = [] + for i in bt.get_frame_count(): + frames.append({ + "path": bt.get_frame_file(i), + "line": bt.get_frame_line(i), + "function": bt.get_frame_function(i), + }) + return frames + + +static func _error_type_name(error_type: int) -> String: + return str(ERROR_TYPE_NAMES.get(error_type, "unknown")) diff --git a/addons/godot_ai/utils/log_backtrace.gd.uid b/addons/godot_ai/utils/log_backtrace.gd.uid new file mode 100644 index 0000000..4845ad8 --- /dev/null +++ b/addons/godot_ai/utils/log_backtrace.gd.uid @@ -0,0 +1 @@ +uid://b8t9kznr2pqxa diff --git a/addons/godot_ai/utils/log_buffer.gd b/addons/godot_ai/utils/log_buffer.gd new file mode 100644 index 0000000..34bd2b5 --- /dev/null +++ b/addons/godot_ai/utils/log_buffer.gd @@ -0,0 +1,67 @@ +@tool +class_name McpLogBuffer +extends RefCounted + +## Ring buffer for MCP log lines. Also prints to Godot console. + +const MAX_LINES := 500 + +## When false, `log()` still records into the ring buffer but does not echo the +## line to the Godot console. The test runner flips this off for the duration +## of a run so negative-path suites (which intentionally drive a 500-line ring +## fill and malformed-result error logging) don't bury an all-green run in +## console noise. Ring *contents* — what tests assert on via `get_recent()` / +## `total_logged()` — are unaffected. Engine-level C++ errors raised by +## negative-path tests are not routed through here and still surface. +static var console_echo := true + +var _lines: Array[String] = [] +## Monotonic count of every line ever passed to `log()` since the last +## `clear()`. Distinct from `_lines.size()`, which is bounded at MAX_LINES. +## Consumers that need to detect "new lines arrived" (e.g. `LogViewer.tick`) +## must track this rather than the bounded size — once the ring fills, the +## size stays at MAX_LINES on every subsequent append, so a size-based +## cursor would freeze and the consumer would stop seeing new entries. +var _total_logged: int = 0 +var enabled := true + + +## `echo=false` records the line into the ring (so the dock's log panel shows +## it) without printing to the Godot console. Used for high-frequency +## machine-driven lines like readiness flips, which spammed the console of +## every install (#626) — filesystem scans toggle readiness on each import. +func log(msg: String, echo: bool = true) -> void: + var line := "MCP | %s" % msg + if enabled and console_echo and echo: + print(line) + _lines.append(line) + if _lines.size() > MAX_LINES: + _lines = _lines.slice(-MAX_LINES) + _total_logged += 1 + + +func get_recent(count: int = 50) -> Array[String]: + var start := maxi(0, _lines.size() - count) + var result: Array[String] = [] + result.assign(_lines.slice(start)) + return result + + +func clear() -> void: + _lines.clear() + ## Reset the monotonic counter so a viewer's `seq < _last_seq` shrink + ## detection still recognizes the clear. Callers that want a cumulative + ## ever-produced count across clears can wrap their own counter. + _total_logged = 0 + + +func total_count() -> int: + return _lines.size() + + +## Monotonic sequence — number of lines ever appended via `log()` since +## the last `clear()`. Strictly increases per append, even once the ring +## has filled and `total_count()` is pinned at MAX_LINES. See `_total_logged` +## for rationale. +func total_logged() -> int: + return _total_logged diff --git a/addons/godot_ai/utils/log_buffer.gd.uid b/addons/godot_ai/utils/log_buffer.gd.uid new file mode 100644 index 0000000..58341ca --- /dev/null +++ b/addons/godot_ai/utils/log_buffer.gd.uid @@ -0,0 +1 @@ +uid://ddkslse7511e6 diff --git a/addons/godot_ai/utils/mcp_adoption_label.gd b/addons/godot_ai/utils/mcp_adoption_label.gd new file mode 100644 index 0000000..3114037 --- /dev/null +++ b/addons/godot_ai/utils/mcp_adoption_label.gd @@ -0,0 +1,23 @@ +@tool +class_name McpAdoptionLabel +extends RefCounted + +## Outcome flag for `McpServerLifecycleManager.adopt_compatible_server`. +## Distinguishes a same-version managed adoption (we own the PID, can +## restart it) from an external compatible adoption (some other plugin +## instance / dev server owns the process; we just rendezvoused with it). +## +## Was a free-form string in PR 5; promoted to constants here because +## the seam now spans `server_lifecycle.gd`, `plugin.gd`'s log helper, +## the dock's restart-button gating, and the test suite. Stable strings +## keep log scrapes and characterization fixtures unaffected. + +## We have a PID we spawned (or re-acquired by reading the managed +## record + verifying liveness). `force_restart_server` and +## `prepare_for_update_reload` may target this PID. +const MANAGED := "managed" + +## A compatible godot-ai server is on the port but we don't own its +## PID — likely another plugin instance's spawn, or a developer-run +## `godot-ai --reload` server. We reuse it but won't kill it on stop. +const EXTERNAL := "external" diff --git a/addons/godot_ai/utils/mcp_adoption_label.gd.uid b/addons/godot_ai/utils/mcp_adoption_label.gd.uid new file mode 100644 index 0000000..aee58fe --- /dev/null +++ b/addons/godot_ai/utils/mcp_adoption_label.gd.uid @@ -0,0 +1 @@ +uid://klhsu1cuhcue diff --git a/addons/godot_ai/utils/mcp_client_refresh_state.gd b/addons/godot_ai/utils/mcp_client_refresh_state.gd new file mode 100644 index 0000000..fbc0b84 --- /dev/null +++ b/addons/godot_ai/utils/mcp_client_refresh_state.gd @@ -0,0 +1,107 @@ +@tool +class_name McpClientRefreshState +extends RefCounted + +## State machine for the dock's client-status refresh sweep. Single +## source of truth — supersedes the seven booleans + deadline previously +## scattered across `mcp_dock.gd` (`_client_status_refresh_in_flight`, +## `_client_status_refresh_pending`, `_client_status_refresh_pending_force`, +## `_client_status_refresh_timed_out`, `_client_status_refresh_started_msec`, +## `_client_status_refresh_deferred_until_filesystem_ready`, +## `_client_status_refresh_deferred_force`, +## `_client_status_refresh_deferred_initial`, +## `_client_status_refresh_shutdown_requested`). +## +## The ints are stable for tests; reordering is a breaking change. + +## No worker running, no pending request. Default state. +const IDLE := 0 +## A refresh request landed but the editor filesystem is busy +## (`EditorInterface.get_resource_filesystem().is_scanning()` is true); +## the dock parks the request and retries on the next `_process` after +## the scan settles. Held alongside two flags (force / initial) for +## what kind of refresh to retry; those live next to the state, not +## inside it, because they're requests not state. +const DEFERRED_FOR_FILESYSTEM := 1 +## Worker thread is alive and probing client status off-main. The +## dock paints "(checking...)" in the clients summary and accepts +## additional requests as `pending`. +const RUNNING := 2 +## Worker has been alive past CLIENT_STATUS_REFRESH_TIMEOUT_MSEC. The +## dock paints "(client probe still running)" and a forced refresh is +## allowed to abandon the worker into the orphan list and start a new +## sweep. The state stays RUNNING after a forced abandon-and-restart. +const RUNNING_TIMED_OUT := 3 +## `_exit_tree` / `_install_update` is draining workers. New refresh +## requests are rejected outright. Set once and not cleared (the dock +## instance is being torn down). +const SHUTTING_DOWN := 4 + +const _NAMES := { + IDLE: "idle", + DEFERRED_FOR_FILESYSTEM: "deferred_for_filesystem", + RUNNING: "running", + RUNNING_TIMED_OUT: "running_timed_out", + SHUTTING_DOWN: "shutting_down", +} + + +static func name_of(state: int) -> String: + return _NAMES.get(state, "unknown(%d)" % state) + + +## True when a worker thread should be alive in this state. Combined +## state — RUNNING or RUNNING_TIMED_OUT both have a worker running, but +## the timed-out flavor allows a force-refresh to abandon it. +static func has_worker_alive(state: int) -> bool: + return state == RUNNING or state == RUNNING_TIMED_OUT + + +## True while the status worker is still within its healthy budget. Once a +## refresh has timed out, the dock keeps the warning badge but must let users +## retry Configure / Configure all instead of stranding the controls behind an +## orphaned, uninterruptible worker. +static func should_disable_client_actions(state: int) -> bool: + return state == RUNNING + + +## True when the dock should reject new refresh spawns. Used by the +## dock's two refresh-spawn guards (the deferred refresh entrypoint and +## the status-refresh scheduler). +static func is_blocked_for_spawn(state: int) -> bool: + return state == SHUTTING_DOWN + + +## True when the summary label should show the in-flight badge. +static func should_show_checking_badge(state: int) -> bool: + return state == RUNNING or state == RUNNING_TIMED_OUT + + +## Transition table. Same shape as McpServerState — illegal transitions +## return false; callers `push_warning` and no-op. +static func can_transition(from: int, to: int) -> bool: + if from == to: + return true + ## Shutdown is sticky. + if from == SHUTTING_DOWN: + return false + ## Anything → SHUTTING_DOWN is legal (drain on _exit_tree / install). + if to == SHUTTING_DOWN: + return true + match from: + IDLE: + return to == RUNNING or to == DEFERRED_FOR_FILESYSTEM + DEFERRED_FOR_FILESYSTEM: + ## When the filesystem scan settles we either spawn a worker + ## (RUNNING) or roll back to IDLE if no rows need probing. + return to == RUNNING or to == IDLE + RUNNING: + ## Worker finishes -> IDLE. Worker outlives budget -> + ## RUNNING_TIMED_OUT. Forced respawn after orphan abandon + ## stays in RUNNING (covered by from == to above). + return to == IDLE or to == RUNNING_TIMED_OUT + RUNNING_TIMED_OUT: + ## Late-arriving worker result drops back to IDLE; forced + ## abandon-and-respawn drops back to RUNNING. + return to == IDLE or to == RUNNING + return false diff --git a/addons/godot_ai/utils/mcp_client_refresh_state.gd.uid b/addons/godot_ai/utils/mcp_client_refresh_state.gd.uid new file mode 100644 index 0000000..9e4129c --- /dev/null +++ b/addons/godot_ai/utils/mcp_client_refresh_state.gd.uid @@ -0,0 +1 @@ +uid://dv4tukg6eioww diff --git a/addons/godot_ai/utils/mcp_server_state.gd b/addons/godot_ai/utils/mcp_server_state.gd new file mode 100644 index 0000000..24597f4 --- /dev/null +++ b/addons/godot_ai/utils/mcp_server_state.gd @@ -0,0 +1,182 @@ +@tool +class_name McpServerState +extends RefCounted + +## State machine for the plugin's server-spawn / adopt / version-verify +## lifecycle. Single source of truth — supersedes the boolean-flag thicket +## (`_server_started_this_session`, `_awaiting_server_version`, +## `_server_version_deadline_ms`, `_connection_blocked`, +## `_can_recover_incompatible`, `_refresh_retried`, +## `_adoption_watch_deadline_ms`) and the older terminal-only +## McpSpawnState string union. +## +## The integer values matter — they're what `get_server_status()` +## surfaces, what the dock pattern-matches on, and what the test suites +## assert against. Reordering the enum is a breaking change. +## +## The transitions are documented in `can_transition()`. The lifecycle +## manager calls `set_state()` which: +## 1. Validates the transition (logs a warning + no-ops on illegal). +## 2. Preserves first-writer-wins among terminal diagnoses so a late +## CRASHED from the watch loop can't clobber an earlier +## PORT_EXCLUDED from the proactive Windows reservation check. + +## Fresh plugin instance, `_start_server` has not run yet. Default state. +const UNINITIALIZED := 0 +## Process spawned via OS.create_process; watch loop is observing the +## SPAWN_GRACE_MS window. Transitions directly to READY (handshake_ack +## verifies a compatible version), CRASHED (process died early), or +## INCOMPATIBLE (handshake reported a mismatch). +const SPAWNING := 1 +## (slot 2 reserved — keep wire-compat for clients pattern-matching +## numeric `editor_state.state` values; do not reuse.) +## Server is healthy and version-verified. Happy path. Includes both +## "spawned fresh" and "adopted compatible existing server" flavors — +## adoption flavor is recorded separately via `McpAdoptionLabel`. +const READY := 3 +## Live server on the HTTP port returned a version that doesn't match +## what this plugin expects, OR returned no `handshake_ack` inside the +## timeout. Connection is blocked; recovery requires a kill+respawn +## click via `recover_incompatible_server`. +const INCOMPATIBLE := 4 +## Spawned process exited inside the SPAWN_GRACE_MS window. Python +## traceback went to Godot's output log. Terminal — reload the plugin +## or restart the editor to retry. +const CRASHED := 5 +## No server command resolved: no `.venv` Python, no `uvx` on PATH, no +## system `godot-ai`. Terminal — install guidance shown in dock. +const NO_COMMAND := 6 +## Windows reserved the HTTP port via Hyper-V / WSL2 / Docker exclusion +## range. Caught proactively before bind. Terminal — port picker shown. +const PORT_EXCLUDED := 7 +## HTTP port held by a process we didn't spawn (no matching managed +## record). Plugin armed an adoption-confirmation watcher; if the foreign +## occupant turns out to be a compatible godot-ai server, +## `handle_server_version_verified` transitions to READY. If the +## adoption deadline expires without a connection, the watcher self- +## disarms but the state stays at FOREIGN_PORT — the dock keeps showing +## "port held by another process" until the user reloads. The version- +## check seam (separate from the adoption deadline) is what fires +## INCOMPATIBLE on a positive-but-mismatched handshake. +const FOREIGN_PORT := 8 +## Static re-entrancy guard fired (`_server_started_this_session` was +## already true). The plugin is being re-enabled within the same editor +## session; the previous instance still owns the spawn. Terminal — does +## NOT block READY paths, just records that this enable cycle no-op'd. +const GUARDED := 9 +## stop_server / prepare_for_update_reload in progress. Transitional — +## next state is STOPPED. +const STOPPING := 10 +## stop_server completed; `_server_pid` reset to -1, port may or may +## not be free. From here a fresh `start_server` call moves back through +## SPAWNING / READY. +const STOPPED := 11 + +const _NAMES := { + UNINITIALIZED: "uninitialized", + SPAWNING: "spawning", + READY: "ready", + INCOMPATIBLE: "incompatible", + CRASHED: "crashed", + NO_COMMAND: "no_command", + PORT_EXCLUDED: "port_excluded", + FOREIGN_PORT: "foreign_port", + GUARDED: "guarded", + STOPPING: "stopping", + STOPPED: "stopped", +} + + +## Human-readable label. Used in startup-trace logs and transition +## warnings. Falls back to `unknown()` for unrecognised values so +## a future enum addition won't crash the formatter. +static func name_of(state: int) -> String: + return _NAMES.get(state, "unknown(%d)" % state) + + +## True for any state the dock should render as a non-OK diagnostic +## panel. Used as the "should we hide the spawn-failure panel?" gate. +static func is_terminal_diagnosis(state: int) -> bool: + return ( + state == CRASHED + or state == NO_COMMAND + or state == PORT_EXCLUDED + or state == INCOMPATIBLE + or state == FOREIGN_PORT + ) + + +## True when the dock should consider the server unsuitable for client +## health checks (incompatible tool surface). Currently just INCOMPATIBLE +## — FOREIGN_PORT is transitional and may resolve to READY if the +## foreign occupant turns out to speak our handshake. +static func blocks_client_health(state: int) -> bool: + return state == INCOMPATIBLE + + +## Transition validation table. Returns true when `from -> to` is a +## legal transition the lifecycle manager should accept. Illegal +## transitions are silently no-op'd at the call site (with a +## `push_warning` log) — this preserves the first-writer-wins contract +## that prevents a late CRASHED from the watch loop overwriting an +## earlier PORT_EXCLUDED diagnosis. +static func can_transition(from: int, to: int) -> bool: + if from == to: + return true + ## Stop is always legal — teardown / install reload short-circuits + ## any in-flight state. + if to == STOPPING: + return true + if to == STOPPED and from == STOPPING: + return true + ## STOPPED can also be reached directly when `_server_pid <= 0` and + ## stop_server early-returns; treat it as legal from any state to + ## keep the teardown path forgiving. + if to == STOPPED: + return true + ## STOPPED -> any (re-arm via restart paths). + if from == STOPPED: + return true + ## GUARDED is sticky for the rest of this enable cycle; only stop is + ## legal out of it. Already covered by the stop checks above. + if from == GUARDED: + return false + ## Terminal diagnoses freeze further forward transitions. Recovery + ## goes through STOPPING (covered above), so any other target is + ## rejected — this is the first-writer-wins contract. + if ( + from == CRASHED + or from == NO_COMMAND + or from == PORT_EXCLUDED + or from == INCOMPATIBLE + ): + return false + ## UNINITIALIZED is the boot state — any target except STOPPING is + ## reachable directly (start_server's early branches set + ## terminal states without going through SPAWNING). + if from == UNINITIALIZED: + return true + ## In-flight forward transitions. + match from: + SPAWNING: + return ( + to == READY + or to == CRASHED + or to == FOREIGN_PORT + or to == INCOMPATIBLE + ) + FOREIGN_PORT: + return to == READY or to == INCOMPATIBLE + READY: + ## Late incompatibility detection (e.g. version verifier + ## re-arms after a foreign-port reconnect that turns out + ## to be incompatible after all). + return to == INCOMPATIBLE or to == CRASHED + STOPPING: + ## Recovery rollback: kill-then-respawn paths that fail to + ## free the port re-latch INCOMPATIBLE (so the dock keeps + ## the diagnostic UI) or fall back to UNINITIALIZED (clean + ## baseline for a follow-up `_set_incompatible_server`). + ## STOPPING -> STOPPED is handled by the early checks above. + return to == INCOMPATIBLE or to == UNINITIALIZED + return false diff --git a/addons/godot_ai/utils/mcp_server_state.gd.uid b/addons/godot_ai/utils/mcp_server_state.gd.uid new file mode 100644 index 0000000..dc5bef9 --- /dev/null +++ b/addons/godot_ai/utils/mcp_server_state.gd.uid @@ -0,0 +1 @@ +uid://d3ial4erjonlq diff --git a/addons/godot_ai/utils/mcp_startup_path.gd b/addons/godot_ai/utils/mcp_startup_path.gd new file mode 100644 index 0000000..130b8e1 --- /dev/null +++ b/addons/godot_ai/utils/mcp_startup_path.gd @@ -0,0 +1,34 @@ +@tool +class_name McpStartupPath +extends RefCounted + +## Branch-tag enum for `McpServerLifecycleManager.start_server`. Records +## which arm of the spawn / adopt / drift / recover decision tree the +## current `_enter_tree` walked. Surfaced via the startup trace log so +## a Windows port-reservation issue or a stale-record kill can be +## reconstructed from the editor output. +## +## Single-file constants, not an int enum, because the values land in +## startup-trace text and the strings are stable across releases (the +## CLAUDE.md "tool surface" entry references them by name). + +const UNSET := "" +## Re-entrancy guard fired; this enable cycle did not spawn or adopt. +const GUARDED := "guarded" +## Adopted a compatible existing server (managed or external). +const ADOPTED := "adopted" +## Spawned a fresh server process. +const SPAWNED := "spawned" +## OS.create_process returned -1 or proactive Windows reservation +## detected. Either way the spawn never produced a live process. +const CRASHED := "crashed" +## Windows port-exclusion check fired — port is blocked at the OS layer. +const RESERVED := "reserved" +## Server-command discovery returned an empty list — no .venv, no uvx, +## no system godot-ai. +const NO_COMMAND := "no_command" +## Drift-recovery kill fell through; we set INCOMPATIBLE and stayed. +const INCOMPATIBLE := "incompatible" +## Port was free at start; this is the prelude to SPAWNED but kept as +## a distinct path so adopt-vs-spawn is unambiguous in the trace. +const FREE := "free" diff --git a/addons/godot_ai/utils/mcp_startup_path.gd.uid b/addons/godot_ai/utils/mcp_startup_path.gd.uid new file mode 100644 index 0000000..fd01066 --- /dev/null +++ b/addons/godot_ai/utils/mcp_startup_path.gd.uid @@ -0,0 +1 @@ +uid://cikdvq2x4vs4x diff --git a/addons/godot_ai/utils/path_validator.gd b/addons/godot_ai/utils/path_validator.gd new file mode 100644 index 0000000..c181578 --- /dev/null +++ b/addons/godot_ai/utils/path_validator.gd @@ -0,0 +1,198 @@ +@tool +class_name McpPathValidator +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Validates `res://`-rooted paths against directory-traversal escape. +## +## Issue #347 (audit-v2 #3): handlers were accepting `res://../etc/passwd.gd` +## because the only check was `path.begins_with("res://")`. LLM-driven path +## generation (prompt injection, agent typos, untrusted issue/PR text in +## context) can produce traversal payloads for the write tools that produce +## arbitrary disk content (`script_create`, `filesystem_write_text`, +## `patch_script`) and for the matching reads (info disclosure surface). +## +## Two entry points: +## * `validate_resource_path` — for paths that name a `res://` disk file the +## plugin will read or (with `for_write`) write. This is the strict one. +## * `validate_loadable_path` — for paths handed to `ResourceLoader`, which +## also accepts `uid://` (an opaque resource-DB id that cannot express +## traversal) and `user://` (the per-project user data sandbox). Load +## handlers must use this so `uid://` references copied out of `.tscn` +## ExtResource / `.uid` sidecars and `user://` runtime assets keep loading. +## +## Error wrapping: callers should use `path_error` / `loadable_error`, which +## return a ready `ErrorCodes.make(VALUE_OUT_OF_RANGE, …)` dict (or null). A +## bad path is a value-domain error, and funneling every site through one +## wrapper keeps the error code consistent across all handlers. +## +## Known limitation: containment is lexical (`globalize_path` + `simplify_path` +## prefix match). It does NOT resolve symlinks — GDScript exposes no realpath. +## A symlink *inside* the project that points outside it can therefore defeat +## the under-root check. This matches the engine's own `res://` resolution and +## is accepted; the loopback trust boundary is the primary control. + + +# Cached project / user roots. `globalize_path` is stable across the editor's +# lifetime — caching avoids redundant resolution on every call. Matters most +# for `reimport`, which loops the validator over each path in a batch. +# Lazy-init on first call so static-load timing can't see a half-initialised +# ProjectSettings. +static var _cached_res_root: String = "" +static var _cached_user_root: String = "" + + +static func _res_root() -> String: + if _cached_res_root.is_empty(): + _cached_res_root = ProjectSettings.globalize_path("res://").simplify_path() + return _cached_res_root + + +static func _user_root() -> String: + if _cached_user_root.is_empty(): + _cached_user_root = ProjectSettings.globalize_path("user://").simplify_path() + return _cached_user_root + + +## True when `path` carries a codepoint that must never reach a filesystem API. +## +## Issue #889: the previous guard built its sentinel with `String.chr(0)`, and +## Godot emits `Unicode parsing error … Unexpected NUL character` while +## *constructing* that string. Every validated call — including reads that then +## failed with "File not found" — printed an alarming engine error that had +## nothing to do with the caller's path. Reading codepoints instead never +## materialises a NUL String, so the noise is gone. +## +## Both codepoints are rejected, for different reasons: +## * `0x0000` — a real embedded NUL can truncate a C string, so the path that +## is validated is not the path that gets opened. Current Godot cannot +## retain one in a String, making this a no-op today; it stays as +## defense-in-depth for any build or input path that can. +## * `0xFFFD` — what current Godot actually substitutes for a NUL or any other +## undecodable input. Once the engine has replaced the byte there is no way +## left to tell an attempted NUL from malformed UTF-8 from a literal +## replacement character, so the only safe reading at a security boundary is +## to refuse all three. A legitimate filename containing U+FFFD is rejected +## too; that false positive is deliberate and vanishingly rare. +static func _contains_invalid_path_codepoint(path: String) -> bool: + for i in path.length(): + var codepoint := path.unicode_at(i) + if codepoint == 0x0000 or codepoint == 0xFFFD: + return true + return false + + +## Returns "" when the path is a safe `res://`-rooted reference inside the +## project root. Returns a human-readable error message otherwise. +## Prefer `path_error` over calling this directly — it wraps the message in the +## canonical error code. +## +## Pass `for_write = true` for any handler that creates/overwrites the file +## (write_file, create_script, patch_script, ResourceSaver-backed saves, +## scene saves). Write callers additionally refuse the project manifest and +## startup override, plus the `.godot/` metadata dir. Reads default to +## `for_write = false`, which permits inspecting those files. +static func validate_resource_path(path: String, for_write: bool = false) -> String: + if path.is_empty(): + return "Missing required param: path" + if _contains_invalid_path_codepoint(path): + return "Path must not contain null bytes or invalid Unicode" + if not path.begins_with("res://"): + return "Path must start with res://" + var confine_err := _confine_under(path, _res_root(), "res://") + if not confine_err.is_empty(): + return confine_err + if for_write: + return _reject_sensitive_write(path) + return "" + + +## Returns "" when `path` is safe to hand to `ResourceLoader.load` / `.exists`. +## Accepts, in addition to confined `res://` paths: +## * `uid://` — an opaque 64-bit resource id; it cannot express a path +## and the engine only ever resolves it to a resource already in the +## project, so there is nothing to confine. +## * `user://…` — the per-project user data dir, confined under its root the +## same way `res://` is (so `user://../…` can't escape the sandbox). +static func validate_loadable_path(path: String) -> String: + if path.is_empty(): + return "Missing required param: path" + if _contains_invalid_path_codepoint(path): + return "Path must not contain null bytes or invalid Unicode" + if path.begins_with("uid://"): + return "" + if path.begins_with("user://"): + return _confine_under(path, _user_root(), "user://") + if path.begins_with("res://"): + return _confine_under(path, _res_root(), "res://") + return "Path must start with res://, uid://, or user://" + + +## Shared traversal + under-root containment. `root` must already be simplified. +static func _confine_under(path: String, root: String, label: String) -> String: + if ".." in path: + return "Path must not contain '..' (path traversal not allowed)" + var globalized := ProjectSettings.globalize_path(path).simplify_path() + # Append a separator so `/proj_evil/...` can't pretend to be inside `/proj` + # via prefix match. `globalized == root` covers the bare `res://` / `user://`. + if globalized != root and not globalized.begins_with(root + "/"): + return "Path must resolve under %s root" % label + return "" + + +## Refuse writes that would clobber project-critical files. The path is already +## confirmed `res://`-rooted and traversal-free by the caller. +## +## Comparisons are case-folded: macOS (APFS) and Windows (NTFS) are +## case-insensitive by default, so `res://Project.godot` resolves to the real +## `project.godot` and must be refused too. +## +## `.import` sidecars are deliberately NOT blocked — editing an asset's import +## options then re-importing is a legitimate, recoverable workflow (the file is +## source-controlled). The blocked set is the startup-execution surface only: +## the manifest, its `override.cfg` shadow, and the `.godot/` cache dir. +static func _reject_sensitive_write(path: String) -> String: + var file_lower := path.get_file().to_lower() + if file_lower == "project.godot": + return "Refusing to write res://project.godot (project manifest)" + if file_lower == "override.cfg": + return "Refusing to write res://override.cfg (startup config override)" + # Reject the `.godot/` editor-metadata dir at any depth. Split drops empty + # segments so a trailing slash can't hide a segment from the check. + var segments := path.trim_prefix("res://").split("/", false) + for segment in segments: + if segment.to_lower() == ".godot": + return "Refusing to write under res://.godot/ (editor metadata)" + # Reject the currently-loaded plugin's own script tree. Overwriting a + # loaded .gd here (plus the immediate reimport triggered by update_file()) + # can SIGABRT the editor mid-call, or silently corrupt the installed + # plugin so the next enable fails to resolve scripts. + if segments.size() >= 2 and segments[0].to_lower() == "addons" and segments[1].to_lower() == "godot_ai": + return "Refusing to write under res://addons/godot_ai/ (overwriting a loaded plugin script can crash the editor)" + return "" + + +## Validate a write/read `res://` path and return a ready error dict, or null +## when the path is fine. The single wrapper every handler should use so the +## error code (VALUE_OUT_OF_RANGE — a bad path is a value-domain error) stays +## consistent. `param_name` is prefixed onto the message for context. +static func path_error(path: String, param_name: String = "path", for_write: bool = false) -> Variant: + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: %s" % param_name) + var err := validate_resource_path(path, for_write) + if err.is_empty(): + return null + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "%s: %s" % [param_name, err]) + + +## Same as `path_error` but for paths handed to `ResourceLoader` (allows +## `uid://` / `user://`). Returns a ready error dict or null. An empty path is +## reported as MISSING_REQUIRED_PARAM rather than a value error. +static func loadable_error(path: String, param_name: String = "path") -> Variant: + if path.is_empty(): + return ErrorCodes.make(ErrorCodes.MISSING_REQUIRED_PARAM, "Missing required param: %s" % param_name) + var err := validate_loadable_path(path) + if err.is_empty(): + return null + return ErrorCodes.make(ErrorCodes.VALUE_OUT_OF_RANGE, "%s: %s" % [param_name, err]) diff --git a/addons/godot_ai/utils/path_validator.gd.uid b/addons/godot_ai/utils/path_validator.gd.uid new file mode 100644 index 0000000..8ed4acf --- /dev/null +++ b/addons/godot_ai/utils/path_validator.gd.uid @@ -0,0 +1 @@ +uid://blxntmd65ljyu diff --git a/addons/godot_ai/utils/port_resolver.gd b/addons/godot_ai/utils/port_resolver.gd new file mode 100644 index 0000000..789cfc6 --- /dev/null +++ b/addons/godot_ai/utils/port_resolver.gd @@ -0,0 +1,370 @@ +@tool +class_name McpPortResolver +extends RefCounted + +## Pure-static port discovery / OS-specific scrapers. No instance state, +## no editor dependencies. plugin.gd has thin instance shims that wrap +## these and increment the cold-start trace counters. + +## Canonical pid-file path. plugin.gd::SERVER_PID_FILE re-exports this so +## external readers and tests can use either name. +const SERVER_PID_FILE := "user://godot_ai_server.pid" +const WindowsPortReservation := preload("res://addons/godot_ai/utils/windows_port_reservation.gd") + + +static func can_bind_local_port(port: int) -> bool: + var server := TCPServer.new() + var err := server.listen(port, "127.0.0.1") + if err == OK: + server.stop() + return true + return false + + +## True when `port` is bound on 127.0.0.1. Probes via TCPServer first, +## falls back to OS scraping. Callers that want per-scraper trace +## counters should call `is_port_in_use_via_scrape` with a trace hook +## after their own `can_bind_local_port` probe. +static func is_port_in_use(port: int) -> bool: + if can_bind_local_port(port): + ## On POSIX, an IPv6 wildcard listener can coexist with a + ## successful 127.0.0.1 bind probe. Confirm with lsof so startup + ## sees the same listener set that shutdown/recovery would see. + if OS.get_name() != "Windows": + return is_port_in_use_via_scrape(port) + return false + return is_port_in_use_via_scrape(port) + + +## `trace` mirrors `find_all_pids_on_port`'s hook: one call per OS +## invocation with the counter name of the scraper that actually ran, so +## a wrapping caller's startup trace sees a genuine PowerShell fallback +## as `powershell`, not as a silent extra second under `netstat`. +static func is_port_in_use_via_scrape(port: int, trace: Callable = Callable()) -> bool: + var output: Array = [] + if OS.get_name() == "Windows": + _trace(trace, "netstat") + var exit_code := OS.execute("netstat", ["-ano"], output, true) + if exit_code == 0 and output.size() > 0: + var stdout := str(output[0]) + if parse_windows_netstat_listening(stdout, port): + return true + ## A healthy dump with no listener row IS the answer — don't + ## pay the ~1.2s powershell.exe spawn to confirm "not in use" + ## (see find_all_pids_on_port for the cost rationale). + if windows_netstat_dump_parseable(stdout): + return false + ## Fallback: netstat can be absent or unparseable on + ## stripped/locale-odd Windows installs. + _trace(trace, "powershell") + return not find_listener_pids_windows(port).is_empty() + _trace(trace, "lsof") + var exit_code := OS.execute("lsof", ["-ti:%d" % port, "-sTCP:LISTEN"], output, true) + return exit_code == 0 and output.size() > 0 and not output[0].strip_edges().is_empty() + + +## Return the PID currently listening on the given TCP port, or 0 if +## the port is free. Thin convenience wrapper around `find_all_pids_on_port` +## — the per-OS scraping logic lives in one place. +static func find_pid_on_port(port: int, trace: Callable = Callable()) -> int: + var pids := find_all_pids_on_port(port, trace) + return pids[0] if not pids.is_empty() else 0 + + +## Returns every PID bound LISTEN on `port`. Used by the kill paths so +## both the uvicorn reloader parent AND its worker child are caught when +## both bind the same port. +## +## `trace` is an optional Callable that fires once per OS invocation with +## a counter name (`"netstat"` / `"powershell"` / `"lsof"`) so the plugin +## can keep its cold-start trace accurate. The Windows path may fall +## through netstat → PowerShell, and a wrapping caller can't see which +## scraper actually ran without the hook. +static func find_all_pids_on_port(port: int, trace: Callable = Callable()) -> Array[int]: + if OS.get_name() == "Windows": + var output: Array = [] + _trace(trace, "netstat") + var exit_code := OS.execute("netstat", ["-ano"], output, true) + if exit_code == 0 and not output.is_empty(): + var stdout := str(output[0]) + var netstat_pids := parse_windows_netstat_pids(stdout, port) + if not netstat_pids.is_empty(): + return netstat_pids + ## An empty per-port parse from a healthy dump IS the answer + ## ("no listener"). Confirming it through the PowerShell probe + ## costs a powershell.exe spawn (~1.2s measured) against ~30ms + ## for the netstat scrape — two such confirmations dominated a + ## ~7s Windows startup walk. Only fall through when the dump + ## itself is unusable (netstat absent, or so format-odd that + ## zero TCP rows parse). + if windows_netstat_dump_parseable(stdout): + var no_listeners: Array[int] = [] + return no_listeners + _trace(trace, "powershell") + return find_listener_pids_windows(port) + var output: Array = [] + _trace(trace, "lsof") + var exit_code := OS.execute("lsof", ["-ti:%d" % port, "-sTCP:LISTEN"], output, true) + if exit_code != 0 or output.is_empty(): + var empty: Array[int] = [] + return empty + return parse_lsof_pids(str(output[0])) + + +static func _trace(trace: Callable, counter: String) -> void: + if trace.is_valid(): + trace.call(counter) + + +static func find_listener_pids_windows(port: int) -> Array[int]: + var script := ( + "Get-NetTCPConnection -LocalPort %d -State Listen " + + "-ErrorAction SilentlyContinue | " + + "Select-Object -ExpandProperty OwningProcess" + ) % port + var output: Array = [] + var exit_code := execute_windows_powershell(script, output) + return windows_listener_pids_from_execute_result(exit_code, output) + + +static func execute_windows_powershell(script: String, output: Array) -> int: + var args := ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script] + for exe in windows_powershell_candidates(): + output.clear() + var exit_code := OS.execute(exe, args, output, true) + if exit_code == 0: + return exit_code + return -1 + + +static func windows_powershell_candidates() -> Array[String]: + var candidates: Array[String] = [] + var system_root := OS.get_environment("SystemRoot") + if system_root.is_empty(): + system_root = "C:/Windows" + system_root = system_root.replace("\\", "/").trim_suffix("/") + candidates.append(system_root + "/System32/WindowsPowerShell/v1.0/powershell.exe") + candidates.append("powershell.exe") + candidates.append("pwsh.exe") + return candidates + + +static func windows_listener_pids_from_execute_result(exit_code: int, output: Array) -> Array[int]: + var empty: Array[int] = [] + if exit_code == 0 and not output.is_empty(): + return parse_pid_lines(str(output[0])) + return empty + + +static func windows_listener_execute_result_in_use(exit_code: int, output: Array) -> bool: + return not windows_listener_pids_from_execute_result(exit_code, output).is_empty() + + +## Pure parser for `lsof -ti` output — newline-separated decimal PIDs. +## Empty lines and non-numeric tokens are dropped. Duplicates pass +## through (uvicorn reloader + worker can produce the same PID twice +## across runs but typically two distinct PIDs). +static func parse_lsof_pids(raw: String) -> Array[int]: + var pids: Array[int] = [] + for line in raw.strip_edges().split("\n", false): + var stripped := line.strip_edges() + if stripped.is_valid_int(): + pids.append(int(stripped)) + return pids + + +static func parse_pid_lines(raw: String) -> Array[int]: + var pids: Array[int] = [] + for line in raw.strip_edges().split("\n", false): + var stripped := line.strip_edges() + if stripped.is_valid_int(): + var pid := int(stripped) + if pid > 0 and not pids.has(pid): + pids.append(pid) + return pids + + +## Parse a Windows `netstat -ano` dump and return PIDs of rows whose +## local address ends with `:port` AND state is `LISTENING`. Substring +## matching the whole dump is wrong: a remote address containing +## `:port` would false-positive against an unrelated ESTABLISHED row. +static func parse_windows_netstat_pid(stdout: String, port: int) -> int: + var pids := parse_windows_netstat_pids(stdout, port) + return pids[0] if not pids.is_empty() else 0 + + +static func parse_windows_netstat_pids(stdout: String, port: int) -> Array[int]: + var pids: Array[int] = [] + var port_suffix := ":%d" % port + for line in stdout.split("\n"): + var s := line.strip_edges() + if s.is_empty(): + continue + var fields := split_on_whitespace(s) + if fields.size() < 5: # proto, local, remote, state, pid + continue + ## Locale-independent listener signal (mirrors script/_dev_env.py): + ## the state column is localized ("LISTENING"/"ABHÖREN"/"ÉCOUTE"...), + ## but a listener's FOREIGN address is always the wildcard ":0". + if not fields[2].ends_with(":0"): + continue + if not fields[1].ends_with(port_suffix): + continue + var pid_str := fields[fields.size() - 1] + if pid_str.is_valid_int(): + var pid := int(pid_str) + if pid > 0 and not pids.has(pid): + pids.append(pid) + return pids + + +static func parse_windows_netstat_listening(stdout: String, port: int) -> bool: + return parse_windows_netstat_pid(stdout, port) > 0 + + +## True when `stdout` looks like a healthy `netstat -ano` dump: at least +## one row parses as a TCP connection (proto column literally "TCP", an +## address containing ":", an integer PID in the last column). Locale- +## independent — protocol names are never localized, unlike the state +## column. Gates whether an empty per-port parse can be trusted as "no +## listener": a live Windows host always carries TCP rows (svchost/RPC +## listen on 135 at minimum), so a dump with zero parseable rows means +## netstat itself is absent/broken and the PowerShell fallback must run. +static func windows_netstat_dump_parseable(stdout: String) -> bool: + for line in stdout.split("\n"): + var fields := split_on_whitespace(line.strip_edges()) + if fields.size() < 5: + continue + if fields[0].to_upper() != "TCP": + continue + if fields[1].find(":") < 0: + continue + if fields[fields.size() - 1].is_valid_int(): + return true + return false + + +## `String.split(" ", false)` only splits on single spaces; netstat +## columns are separated by runs of spaces / tabs. Collapse manually. +static func split_on_whitespace(s: String) -> PackedStringArray: + var out: PackedStringArray = [] + var cur := "" + for i in s.length(): + var c := s.substr(i, 1) + if c == " " or c == "\t": + if not cur.is_empty(): + out.append(cur) + cur = "" + else: + cur += c + if not cur.is_empty(): + out.append(cur) + return out + + +static func read_pid_file() -> int: + if not FileAccess.file_exists(SERVER_PID_FILE): + return 0 + var f := FileAccess.open(SERVER_PID_FILE, FileAccess.READ) + if f == null: + return 0 + var content := f.get_as_text().strip_edges() + f.close() + if content.is_empty() or not content.is_valid_int(): + return 0 + var pid := int(content) + return pid if pid > 0 else 0 + + +static func clear_pid_file() -> void: + if FileAccess.file_exists(SERVER_PID_FILE): + DirAccess.remove_absolute(ProjectSettings.globalize_path(SERVER_PID_FILE)) + + +## `kill -0` returns 0 for both running and zombie processes; Godot +## never `waitpid`s on `OS.create_process` children, so a fast-failing +## uvx launcher lingers as a zombie forever and `kill -0` would block +## the spawn-failure branch in check_server_health from firing. Use +## `ps -o stat=` instead. State codes: R/S/D/I/T (live), Z (zombie). #172. +static func pid_alive(pid: int) -> bool: + if pid <= 0: + return false + if OS.get_name() == "Windows": + var output: Array = [] + var exit_code := OS.execute("tasklist", ["/FI", "PID eq %d" % pid, "/NH", "/FO", "CSV"], output, true) + if exit_code != 0 or output.is_empty(): + return false + for line in output: + if str(line).find("\"%d\"" % pid) >= 0: + return true + return false + var output: Array = [] + var exit_code := OS.execute("ps", ["-p", str(pid), "-o", "stat="], output, true) + if exit_code != 0 or output.is_empty(): + return false + var stat := str(output[0]).strip_edges() + return not stat.is_empty() and not stat.begins_with("Z") + + +## Poll until the given port is no longer bound, or the timeout elapses. +## Used after `OS.kill` so we don't race the port-in-use check on rebind. +## NOTE: plugin.gd::_wait_for_port_free (and _is_port_in_use) is a +## deliberate line-for-line fork of this pair kept for _ProofPlugin +## isolation — keep the two in sync when editing either. +static func wait_for_port_free(port: int, timeout_s: float) -> void: + var deadline := Time.get_ticks_msec() + int(timeout_s * 1000.0) + while is_port_in_use(port): + if Time.get_ticks_msec() >= deadline: + push_warning("MCP | port %d still in use after %.1fs — proceeding anyway" % [port, timeout_s]) + return + OS.delay_msec(100) + + +## Choose a non-Windows-reserved WS port. Returns `configured` when free; +## otherwise the first non-excluded port within `span` of it. Optional +## `log_buffer` is a duck-typed sink (`log(String)`) that gets the +## remap notice so users see why the port shifted. +static func resolve_ws_port(configured: int, max_port: int, log_buffer = null) -> int: + var resolved := WindowsPortReservation.suggest_non_excluded_port( + configured, + 2048, + max_port + ) + if resolved != configured: + var message := "WebSocket port %d is reserved by Windows; using %d" % [configured, resolved] + print("MCP | %s" % message) + if log_buffer != null: + log_buffer.log(message) + return resolved + + +## Trust the cached ws_port from the managed record only when the record +## is current ownership proof — i.e. record version matches the installed +## plugin. Otherwise a stale record from an older install (e.g. a 9500 +## value pre-Windows-reservation collision) would mislead the +## compatibility check into killing an unrelated external process. #259. +static func resolved_ws_port_for_existing_server( + record_ws_port: int, + record_version: String, + current_version: String, + fresh_resolved: int +) -> int: + if record_ws_port <= 0: + return fresh_resolved + if current_version.is_empty() or record_version != current_version: + return fresh_resolved + return record_ws_port + + +static func resolve_ws_port_from_output( + configured_port: int, + netsh_output: String, + max_port: int, + span: int = 2048 +) -> int: + return WindowsPortReservation.suggest_non_excluded_port_from_output( + netsh_output, + configured_port, + span, + max_port + ) diff --git a/addons/godot_ai/utils/port_resolver.gd.uid b/addons/godot_ai/utils/port_resolver.gd.uid new file mode 100644 index 0000000..54a3d73 --- /dev/null +++ b/addons/godot_ai/utils/port_resolver.gd.uid @@ -0,0 +1 @@ +uid://pk0212qfh61x diff --git a/addons/godot_ai/utils/resource_io.gd b/addons/godot_ai/utils/resource_io.gd new file mode 100644 index 0000000..cfac90f --- /dev/null +++ b/addons/godot_ai/utils/resource_io.gd @@ -0,0 +1,277 @@ +@tool +class_name McpResourceIO +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Shared helpers for "save a Resource to .tres" and the mutually-exclusive +## path-vs-resource_path param validation that every resource-authoring +## handler needs. Extracted to remove 4-way duplication across +## resource_handler, environment_handler, texture_handler, and curve_handler. +## Also home to the shared write-a-text-file path + deferred import-settle +## completion used by both script_handler.create_script and +## filesystem_handler.write_file (#714). + +# Bounded settle window for `ResourceLoader.exists(path)` after a fresh text +# write registers with the filesystem, so an agent calling +# create_script/write_file -> attach_script back-to-back doesn't race the +# editor's import pipeline (#261, extended to write_file by #714). Polled once +# per frame, with an elapsed-time cap below the dispatcher's deferred timeouts +# for both commands. If import is still not visible at the cap, we still +# return committed data instead of letting the already-written file surface +# as DEFERRED_TIMEOUT. +const IMPORT_SETTLE_MAX_FRAMES := 300 +const IMPORT_SETTLE_MAX_MSEC := 3500 + + +## Validate that exactly one of {path, resource_path} is provided. +## +## When `require_property` is true (default), also requires a non-empty +## `property` param when `path` is given — this matches the semantics of +## "assign a resource to node.property" (resource_create, texture tools, +## curve_set_points). Pass false for tools where the path itself IS the +## target (environment_create assigning to WorldEnvironment.environment). +## +## Returns null on success or an error dict on failure. +static func validate_home(params: Dictionary, require_property: bool = true) -> Variant: + var node_path: String = params.get("path", "") + var property: String = params.get("property", "") + var resource_path: String = params.get("resource_path", "") + var has_node_target := not node_path.is_empty() + var has_file_target := not resource_path.is_empty() + + if has_node_target and has_file_target: + var both_msg := "Provide either path+property or resource_path, not both" if require_property else "Provide either path or resource_path, not both" + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, both_msg) + if not has_node_target and not has_file_target: + var none_msg := "Must provide either path+property (assign inline) or resource_path (save .tres)" if require_property else "Must provide either path or resource_path" + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, none_msg) + if require_property and has_node_target and property.is_empty(): + return ErrorCodes.make(ErrorCodes.INVALID_PARAMS, "Missing required param: property (required when path is given)") + return null + + +## Save `res` to `resource_path` as a .tres/.res file. +## +## Handles: res:// prefix validation, overwrite check, parent-directory +## creation, ResourceSaver.save error reporting, and the post-save +## EditorFileSystem.update_file() so the dock picks up the change. +## +## `label` is the human-readable resource-kind for error messages (e.g. +## "Environment", "Gradient texture", "Curve"). `extra_fields` is merged +## into the success response alongside the standard fields +## (`resource_path`, `overwritten`, `undoable: false`, `reason`). Passing +## a `reason` key in `extra_fields` overrides the default — useful for +## tools that edit existing files rather than creating fresh ones. +## +## `pause_target` should be the handler's `McpConnection`. When supplied, +## `pause_processing` is flipped on around `ResourceSaver.save()` so the +## dispatcher's WebSocket pump can't re-enter while Godot pumps +## `Main::iteration()` for the resource-save's progress UI / script-class +## update task. Without this guard a queued command landing during the +## save can trigger another `save_to_disk` that tries to add the same +## `update_scripts_classes` editor task — "Task already exists" → null +## deref → SIGSEGV. Same family of bug as godotengine/godot#118545 and +## the same mitigation as `SceneHandler`'s `save_scene*` wraps. See +## issue #288. +## +## Returns either an error dict or a {"data": {...}} success dict — ready +## for the handler to return directly. +static func save_to_disk( + res: Resource, + resource_path: String, + overwrite: bool, + label: String, + extra_fields: Dictionary = {}, + pause_target: McpConnection = null, +) -> Dictionary: + var path_err = McpPathValidator.path_error(resource_path, "resource_path", true) + if path_err != null: + return path_err + + var existed_before := FileAccess.file_exists(resource_path) + if existed_before and not overwrite: + return ErrorCodes.make( + ErrorCodes.INVALID_PARAMS, + "%s already exists at %s (pass overwrite=true to replace)" % [label, resource_path] + ) + # Captured BEFORE the overwrite below so a resave of an already-uid'd file + # (overwrite=true) can restore its own uid instead of losing it — see + # ensure_uid's doc comment. + var prior_uid := ResourceLoader.get_resource_uid(resource_path) if existed_before else ResourceUID.INVALID_ID + + var dir_path := resource_path.get_base_dir() + var mkdir_err := DirAccess.make_dir_recursive_absolute(dir_path) + if mkdir_err != OK and mkdir_err != ERR_ALREADY_EXISTS: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to create directory %s: %s" % [dir_path, error_string(mkdir_err)] + ) + + if pause_target != null: + pause_target.pause_processing = true + var save_err := ResourceSaver.save(res, resource_path) + if pause_target != null: + pause_target.pause_processing = false + if save_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Failed to save %s to %s: %s" % [label, resource_path, error_string(save_err)] + ) + var uid_err := ensure_uid(resource_path, prior_uid) + if uid_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "%s saved to %s but failed to write its uid: %s" % [label, resource_path, error_string(uid_err)] + ) + + var efs := EditorInterface.get_resource_filesystem() + if efs != null: + efs.update_file(resource_path) + + var data := { + "resource_path": resource_path, + "overwritten": existed_before, + "undoable": false, + "reason": "File creation is persistent; delete the file manually to revert", + } + attach_cleanup_hint(data, existed_before, [resource_path]) + # merge with overwrite=true so callers (e.g. curve_set_points editing an + # existing .tres) can supply a domain-specific `reason`. + data.merge(extra_fields, true) + return {"data": data} + + +## Save `res` to `resource_path` with the same `pause_processing` re-entrancy +## guard as `save_to_disk` (see its doc for the #288 SIGSEGV background), for +## call sites that need to pick their own error handling / overwrite policy +## instead of `save_to_disk`'s full validate+mkdir+overwrite-guard bundle +## (undo/redo callables reloading-mutating-resaving an existing resource, +## `apply_to_node`'s inline-then-save branch). Returns the raw +## `ResourceSaver.save` error code. +static func guarded_save(res: Resource, resource_path: String, pause_target: McpConnection) -> int: + var prior_uid := ResourceLoader.get_resource_uid(resource_path) if FileAccess.file_exists(resource_path) else ResourceUID.INVALID_ID + if pause_target != null: + pause_target.pause_processing = true + var save_err := ResourceSaver.save(res, resource_path) + if pause_target != null: + pause_target.pause_processing = false + if save_err != OK: + return save_err + return ensure_uid(resource_path, prior_uid) + + +## Make `resource_path` carry a stable uid after a successful +## `ResourceSaver.save()`, matching what Godot's own "New Scene"/"New +## Resource" editor flows always embed. A bare `ResourceSaver.save()` call +## does neither on its own: a brand-new file gets no `uid=` at all, and +## resaving a file that already had one silently drops it (#737). Call this +## immediately after every successful save. +## +## `prior_uid` is whatever `ResourceLoader.get_resource_uid(resource_path)` +## returned BEFORE this save overwrote the file (pass `ResourceUID.INVALID_ID` +## for a brand-new path). Reusing the prior id — instead of always minting a +## fresh one — keeps any `uid://...` references elsewhere in the project +## resolving to the same file. +## +## Returns the `Error` from `ResourceSaver.set_uid()` so callers can surface a +## uid-write failure instead of silently reporting success on a file that +## didn't end up with the uid it was supposed to get. +static func ensure_uid(resource_path: String, prior_uid: int) -> Error: + var id := prior_uid + if id == ResourceUID.INVALID_ID: + id = ResourceUID.create_id() + return ResourceSaver.set_uid(resource_path, id) + + +## Attach a `cleanup.rm` hint listing `paths` to `data` — only when the call +## just created a new file (`existed_before == false`). On overwrite the field +## is omitted because the caller already had the file on disk, and handing +## them a cleanup list would invite dropping user content instead of just +## scratch artifacts. Used by write-and-return handlers (create_script, +## filesystem_write_text, resource_create/save_to_disk) so callers running +## transient smoke tests can rm artifacts without tracking paths. See #82. +static func attach_cleanup_hint(data: Dictionary, existed_before: bool, paths: Array) -> void: + if existed_before: + return + data["cleanup"] = {"rm": paths} + + +## Shared write-a-text-file path (#714): parent-directory mkdir, write + +## flush with an explicit error check so a truncated write (disk full, +## permission flip mid-write) surfaces as an error instead of plain success. +## Deliberately does NOT call `EditorFileSystem.update_file()` — callers +## register the file themselves after assembling their response fields, so +## the registration comment (the dsarno/godot#6 scan-stacking rationale) +## stays next to the call. Returns null on success or an error dict ready +## to return from the handler. +static func write_text_to_disk(path: String, content: String) -> Variant: + var dir_path := path.get_base_dir() + if not DirAccess.dir_exists_absolute(dir_path): + var err := DirAccess.make_dir_recursive_absolute(dir_path) + if err != OK: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to create directory: %s" % dir_path) + + var file := FileAccess.open(path, FileAccess.WRITE) + if file == null: + return ErrorCodes.make(ErrorCodes.INTERNAL_ERROR, "Failed to open file for writing: %s" % path) + + file.store_string(content) + file.flush() + var write_err := file.get_error() + file.close() + if write_err != OK: + return ErrorCodes.make( + ErrorCodes.INTERNAL_ERROR, + "Write failed for %s (%s); file may be truncated" % [path, error_string(write_err)] + ) + return null + + +# `static` is load-bearing: the deferred completion captures no `self`, so the +# coroutine survives even if the calling handler RefCounted is freed mid-await. +# Under concurrent create storms with editor_reload_plugin fired during the +# burst, an instance-method coroutine is otherwise GC'd between `await` and +# resume, producing "Resumed function ... after await, but class instance is +# gone" errors and dropping the response. Keep this function static and +# parameterise everything it needs explicitly — do not reference instance +# state. Shared by create_script and write_file's fresh-`.gd` path (#714). +static func finish_text_write_deferred( + connection: McpConnection, + request_id: String, + path: String, + data: Dictionary, +) -> void: + if not is_instance_valid(connection): + return + var tree := connection.get_tree() + if tree == null: + return + var deadline_ms := Time.get_ticks_msec() + IMPORT_SETTLE_MAX_MSEC + # Let _dispatch() return DEFERRED_RESPONSE and register the request before + # this coroutine can send a committed result. ResourceLoader.exists(path) + # may already be true on fast imports; without this handoff the connection + # treats the response as late/unregistered and drops it, then the dispatcher + # times out a file that was already written (#324). The deadline starts + # before this await so a slow handoff frame is counted against the bounded + # settle window. + await tree.process_frame + var frames := 0 + while ( + frames < IMPORT_SETTLE_MAX_FRAMES + and Time.get_ticks_msec() < deadline_ms + and not ResourceLoader.exists(path) + ): + await tree.process_frame + frames += 1 + # If the plugin tears down (_exit_tree frees the connection) during the + # await, is_instance_valid() goes false and we drop the response silently — + # the server's request timeout will surface the failure to the caller. + if not is_instance_valid(connection): + return + var payload := data.duplicate() + var settled := ResourceLoader.exists(path) + payload["import_settled"] = settled + payload["import_settle"] = "settled" if settled else "timeout" + payload["import_pending"] = not settled + connection.send_deferred_response(request_id, {"data": payload}) diff --git a/addons/godot_ai/utils/resource_io.gd.uid b/addons/godot_ai/utils/resource_io.gd.uid new file mode 100644 index 0000000..94da4c9 --- /dev/null +++ b/addons/godot_ai/utils/resource_io.gd.uid @@ -0,0 +1 @@ +uid://de2rwdoa4wabf diff --git a/addons/godot_ai/utils/scene_path.gd b/addons/godot_ai/utils/scene_path.gd new file mode 100644 index 0000000..782aea1 --- /dev/null +++ b/addons/godot_ai/utils/scene_path.gd @@ -0,0 +1,155 @@ +@tool +class_name McpScenePath +extends RefCounted + +const ErrorCodes := preload("res://addons/godot_ai/utils/error_codes.gd") + +## Utility for converting between Godot internal node paths and clean +## scene-relative paths like /Main/Camera3D. + + +## Return a clean path relative to the scene root (e.g. /Main/Camera3D). +## Returns "" when `node` is not the scene root or a descendant of it — +## without the ancestry guard, get_path_to() returns an empty NodePath that +## concatenates into a plausible-looking but invalid "/Main/". +static func from_node(node: Node, scene_root: Node) -> String: + if scene_root == null or node == null: + return "" + if node == scene_root: + return "/" + scene_root.name + if not scene_root.is_ancestor_of(node): + return "" + var relative := scene_root.get_path_to(node) + return "/" + scene_root.name + "/" + str(relative) + + +## Resolve a clean scene path like "/Main/Camera3D" to the actual node. +## +## Accepts forms relative to the edited scene root: +## "/Main" — explicit root prefix (canonical) +## "/Main/Camera3D" — descendant path +## "Camera3D" — bare relative to scene_root +## "World/Ground" — nested bare relative to scene_root +## +## Also accepts SceneTree-style "/root/[/...]" as an alias for +## the edited scene root. Agents reach for /root/Foo right after creating a +## scene because that's where scenes live at runtime; we honor it so the call +## doesn't fail with a confusing "not found" error. The alias only kicks in +## when the segment after /root matches the scene root's name — paths like +## "/root/@EditorNode@.../Main/..." (returned by Node.get_path() in the editor) +## fall through to the absolute-path fallback unchanged. +static func resolve(scene_path: String, scene_root: Node) -> Node: + if scene_root == null: + return null + + ## Bare "/" alias: the most natural first guess for "the scene root". + ## There is exactly one edited-scene root, so the alias is unambiguous; + ## without it, "/" falls through to get_node_or_null("/") → null and + ## every call costs the agent a NODE_NOT_FOUND round trip (issue #624). + if scene_path == "/": + return scene_root + + ## /root/[/...] alias: strip the /root prefix and recurse. + ## Match the scene root by name explicitly so we don't capture editor- + ## internal paths that legitimately live under /root. + var alias_prefix := "/root/" + scene_root.name + if scene_path == alias_prefix or scene_path.begins_with(alias_prefix + "/"): + return resolve(scene_path.substr(5), scene_root) # keep leading slash + + var root_prefix := "/" + scene_root.name + if scene_path == root_prefix: + return scene_root + if scene_path.begins_with(root_prefix + "/"): + var relative := scene_path.substr(root_prefix.length() + 1) + return scene_root.get_node_or_null(relative) + + # Try as-is (relative path, or absolute SceneTree path). + return scene_root.get_node_or_null(scene_path) + + +## Return the edited scene root, or an error dict if the editor has no open +## scene or the open scene doesn't match `expected_scene_file`. +## +## `expected_scene_file` is the caller's `scene_file` parameter — an empty +## string means "target whatever is currently edited" (current behaviour, +## no guard). A non-empty value must match `scene_file_path` on the current +## edited scene root exactly, or we return EDITED_SCENE_MISMATCH so the +## caller can re-open the right scene. +## +## Shape on success: {"node": }. Shape on error matches +## `ErrorCodes.make()` so callers can propagate the result directly. +static func require_edited_scene(expected_scene_file: String) -> Dictionary: + var root := EditorInterface.get_edited_scene_root() + if root == null: + # Mirrors the structured payload that the Python-side require_writable + # gate attaches for `playing` / `importing`. Together these cover the + # three recoverable editor *states* (playing / importing / no_scene) + # — the EDITOR_NOT_READY paths an AI caller can act on. Other + # EDITOR_NOT_READY callsites describing internal-state failures + # ("EditorFileSystem not available" etc.) carry sub_code + retryable + # via ErrorCodes.make_not_ready (#651 stage 1) but intentionally + # omit the hint — there's no useful caller action to name. + var err := ErrorCodes.make(ErrorCodes.EDITOR_NOT_READY, "No scene open") + err["error"]["data"] = { + "sub_code": ErrorCodes.SUB_EDITOR_NO_SCENE, + "editor_state": "no_scene", + "retryable": false, + "hint": ( + "No scene is open. Call scene_open with a scene path " + + "(e.g. \"res://main.tscn\") before issuing scene-mutating tools." + ), + } + return err + if not expected_scene_file.is_empty() and root.scene_file_path != expected_scene_file: + var actual := root.scene_file_path if not root.scene_file_path.is_empty() else "" + return ErrorCodes.make( + ErrorCodes.EDITED_SCENE_MISMATCH, + ( + "Expected edited scene \"%s\" but \"%s\" is active. " + + "Call scene_open(\"%s\") first, or omit scene_file to target the active scene." + ) % [expected_scene_file, actual, expected_scene_file], + ) + return {"node": root} + + +## Format a "parent not found" error that names the path convention. +## Agents routinely try /root/Foo or absolute SceneTree paths; the bare +## "Parent not found: X" gave them no hint that paths are scene-relative. +## Wording is generic ("Paths are relative...") so the helper works for any +## param name (parent_path, new_parent, …). +static func format_parent_error(path: String, scene_root: Node) -> String: + if scene_root == null: + return "Parent not found: %s. No edited scene is open." % path + var root_name := str(scene_root.name) + return "Parent not found: %s. Paths are relative to the edited scene root (e.g. \"/%s\" or \"\"), not the SceneTree. Scene root is \"/%s\"." % [path, root_name, root_name] + + +## Format a "node not found" error that names the path convention and, when +## possible, suggests a corrected path. Agents routinely pass /root/Foo +## (runtime SceneTree) or unprefixed names; the bare "Node not found: X" +## gives no hint that paths are edited-scene-relative. +## +## Suggestion logic (highest-confidence first): +## 1. /root/[/...] where is not the scene root → suggest //[/...] +## 2. path doesn't start with "/" → suggest "//" +## 3. otherwise no concrete "did you mean", just the convention reminder. +static func format_node_error(path: String, scene_root: Node) -> String: + if scene_root == null: + return "Node not found: %s. No edited scene is open." % path + var root_name := str(scene_root.name) + var suggestion := "" + + if path.begins_with("/root/"): + var after_root := path.substr(6) # "/root/" is 6 chars + # Only suggest if the segment after /root/ isn't already the scene root + # (resolve() handles /root//... as an alias, so a failure + # with that prefix means a deeper segment is wrong — no clean rewrite). + var first_seg := after_root.split("/")[0] + if first_seg != root_name and not first_seg.is_empty(): + suggestion = "/" + root_name + "/" + after_root + elif not path.begins_with("/") and not path.is_empty(): + suggestion = "/" + root_name + "/" + path + + if suggestion.is_empty(): + return "Node not found: %s. Paths are relative to the edited scene root (e.g. \"/%s/Child\"), not runtime /root/... paths. Scene root is \"/%s\"." % [path, root_name, root_name] + return "Node not found: %s. Did you mean \"%s\"? Paths are relative to the edited scene root, not runtime /root/... paths. Scene root is \"/%s\"." % [path, suggestion, root_name] diff --git a/addons/godot_ai/utils/scene_path.gd.uid b/addons/godot_ai/utils/scene_path.gd.uid new file mode 100644 index 0000000..85795a9 --- /dev/null +++ b/addons/godot_ai/utils/scene_path.gd.uid @@ -0,0 +1 @@ +uid://c1irdrss0amex diff --git a/addons/godot_ai/utils/screenshot_encode.gd b/addons/godot_ai/utils/screenshot_encode.gd new file mode 100644 index 0000000..e3b0210 --- /dev/null +++ b/addons/godot_ai/utils/screenshot_encode.gd @@ -0,0 +1,38 @@ +@tool +class_name McpScreenshotEncode +extends RefCounted + +## Shared downscale + PNG + base64 block for the screenshot paths (#716). +## +## Two call sites straddle the editor/game process boundary — the editor's +## take_screenshot (editor_handler) and the game-process autoload +## (runtime/game_helper) — and were maintained as manually synchronized +## copies. Pure static, no editor APIs, so it loads safely in the game +## process too. + + +## Downscale `image` in place so its longest edge is at most +## `max_resolution` (0 = no cap), then PNG-encode. Returns +## {base64, width, height, original_width, original_height}. +static func downscale_and_encode(image: Image, max_resolution: int) -> Dictionary: + var original_width := image.get_width() + var original_height := image.get_height() + + if max_resolution > 0: + var longest := maxi(original_width, original_height) + if longest > max_resolution: + var scale := float(max_resolution) / float(longest) + ## Clamp to 1px min: extreme aspect ratios at very small + ## max_resolution could otherwise compute a zero dimension and + ## crash image.resize(). + var new_w := maxi(1, int(original_width * scale)) + var new_h := maxi(1, int(original_height * scale)) + image.resize(new_w, new_h, Image.INTERPOLATE_LANCZOS) + + return { + "base64": Marshalls.raw_to_base64(image.save_png_to_buffer()), + "width": image.get_width(), + "height": image.get_height(), + "original_width": original_width, + "original_height": original_height, + } diff --git a/addons/godot_ai/utils/screenshot_encode.gd.uid b/addons/godot_ai/utils/screenshot_encode.gd.uid new file mode 100644 index 0000000..0bcdac2 --- /dev/null +++ b/addons/godot_ai/utils/screenshot_encode.gd.uid @@ -0,0 +1 @@ +uid://cl0xhoxwsbmow diff --git a/addons/godot_ai/utils/server_lifecycle.gd b/addons/godot_ai/utils/server_lifecycle.gd new file mode 100644 index 0000000..2abc497 --- /dev/null +++ b/addons/godot_ai/utils/server_lifecycle.gd @@ -0,0 +1,2197 @@ +@tool +class_name McpServerLifecycleManager +extends RefCounted + +## Server spawn / stop / respawn / adopt / recover orchestration plus the +## update-reload handoff. Owns the server-state machine +## (`McpServerState`), version-check seam (`McpServerVersionCheck`), +## adoption metadata, and connection-blocked / dev-mismatch flags. +## +## State previously lived on plugin.gd; PR 6 (#297) moved it here so +## PR 7 (UpdateManager extraction) can absorb the same encapsulation +## pattern. The plugin still owns the physical editor surfaces +## (Connection, Dock, Timer, EditorSettings I/O) and exposes them via +## `_host.()` shims; the test fixtures override those shims to +## drive the manager without touching the editor. +## +## `_host` is untyped to honor the self-update field-storage policy +## plugin.gd calls out near `_connection`. +var _host + +const UvCacheCleanup := preload("res://addons/godot_ai/utils/uv_cache_cleanup.gd") +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") +const PortResolver := preload("res://addons/godot_ai/utils/port_resolver.gd") +const WindowsPortReservation := preload("res://addons/godot_ai/utils/windows_port_reservation.gd") +const McpServerStateScript := preload("res://addons/godot_ai/utils/mcp_server_state.gd") +const McpStartupPathScript := preload("res://addons/godot_ai/utils/mcp_startup_path.gd") +const McpAdoptionLabelScript := preload("res://addons/godot_ai/utils/mcp_adoption_label.gd") +const McpServerVersionCheckScript := preload("res://addons/godot_ai/utils/server_version_check.gd") + +# ---- State (owned here, was on plugin.gd through PR 5) --------------- + +## Single source of truth for the server-spawn/adopt/version lifecycle. +## See `McpServerState` for the transition table. +var _server_state: int = McpServerStateScript.UNINITIALIZED + +## OS-level state populated only when WE spawned the process. +var _server_pid: int = -1 +## keep_server_on_exit (#800): whether the RUNNING server was launched with +## the keep-alive env opt-outs (no owner pid, NO_IDLE_EXIT staged). Editor +## teardown routes on this, never on the live setting — a server spawned +## without the opt-outs must die with the editor even if the user enabled +## the setting mid-session, or the owner-PID watchdog reaps it seconds +## later and the preserved record goes stale (the #774 scenario). Set at +## spawn, recovered from the managed-server record on adoption. +var _server_keep_alive := false +var _server_spawn_ms: int = 0 +var _server_exit_ms: int = 0 +## Elapsed-since-spawn when the pid-file first appeared. The warm watch window +## starts here, not at process creation: a cold uvx download may consume most +## of the cold-start budget before Python starts and publishes the file. +var _server_pid_published_elapsed_ms: int = 0 +## Elapsed-since-spawn at the first watch tick that saw the spawn PID dead, or +## 0 when it is alive / has been healed onto the real PID. Only meaningful +## while a Windows trampoline handoff is being waited out (#797): it preserves +## the true exit time so a diagnosis raised after the wait still reports when +## the process actually died. Reset per spawn alongside `_server_spawn_ms`. +var _spawn_dead_since_ms: int = 0 + +## Version metadata. `expected_version` is what the plugin shipped with; +## `actual_version` is what the live server reported via handshake_ack. +var _server_expected_version: String = "" +var _server_actual_version: String = "" +var _server_actual_name: String = "" + +## Diagnostic + recovery flags surfaced to the dock via `get_status()`. +var _server_status_message: String = "" +## #647: when a post-crash probe pins the failure on a specific port held +## by a foreign process, this names that port (HTTP or WS) so the dock's +## status line and port-picker gating don't blame the wrong one. Zero when +## no conflict was diagnosed. +var _conflict_port: int = 0 +var _can_recover_incompatible: bool = false +var _connection_blocked: bool = false + +## One-shot guard for the stale-uvx-index recovery (#172). Reset at the +## top of `start_server` so each fresh spawn attempt gets its own +## refresh budget. +var _refresh_retried: bool = false + +## One-shot guard for the spawn-lost-port-race re-adoption (see +## `_diagnose_spawn_fast_exit`). #805: the budget is per RECOVERY, not per +## walk — a walk the re-adopt arm itself triggered must NOT refresh it +## (`_readopt_walk_pending` skips the top-of-walk reset), or a flapping +## godot-ai occupant sustains spawn → fast-exit → re-walk forever. The +## budget refreshes on the paths that prove recovery: a fresh +## user/plugin-initiated walk, a successful `adopt_compatible_server`, +## or a spawn that survives to publish its pid-file. +var _readopt_after_spawn_exit_retried: bool = false + +## #805: set by the re-adopt arm just before it re-runs `start_server`, +## consumed by the top of `_start_server_impl` to skip that walk's +## `_readopt_after_spawn_exit_retried` reset. Never true outside that +## one triggered walk. +var _readopt_walk_pending: bool = false + +## Rounds of weak-proof (`status_name`-tier) recovery available against a +## brand-verified stale-VERSION godot-ai occupant. Zero by default: the +## startup walk may only kill via strong ownership proof. Armed by an +## explicit user action that already authorizes replacing the old backend — +## the post-self-update startup (`authorize_stale_recovery` from plugin.gd, +## consented by the Update click) and the dock's recovery click. This is +## what lets the walk finish an update against an attach-bridge-owned old +## server: bridges pinned to the previous version respawn it the moment it +## is killed, and each respawn is an external server with no strong proof, +## so without this budget every lost port race dead-ends in INCOMPATIBLE +## and the user is left toggling the plugin by hand. Never spent on a +## same-version or foreign occupant; each spent round re-proves brand at +## kill time. Reset on the proven recoveries — adoption and the verified +## compatible handshake — so leftover rounds can't authorize a kill in a +## later, unrelated episode. Pid-file publication deliberately does NOT +## reset it: the server writes that file before binding either port, so a +## bridge respawn can still steal the bind afterwards and the fast-exit +## needs its remaining rounds (#890 review P1). +var _stale_recovery_budget: int = 0 + +## Single owner for kill/drain/respawn recovery. Startup probing and the +## WebSocket version verdict observe the same backend from different async +## paths; a retry budget bounds how often they may act, but does not stop both +## paths acting at once. Keep one recovery transaction in flight and coalesce +## stale handshake verdicts into it so an older continuation cannot kill the +## fresh server that another continuation just spawned. +var _recovery_in_flight: bool = false +## Generation-scoped capability for the startup walk spawned by +## `_recover_incompatible_server_impl`. The outer recovery keeps +## `_recovery_in_flight` armed so handshakes and unrelated recovery calls still +## coalesce, while this token lets only that exact owned walk spend another +## bounded stale-recovery round if an attach bridge reclaims the port after the +## kill. A later walk created by invalidation gets a different generation and +## cannot inherit the authority. +var _recovery_owned_startup_generation: int = -1 + +## Bounded deadline for the foreign-port adoption-confirmation watcher. +## Zero when disarmed. +var _adoption_watch_deadline_ms: int = 0 + +## Branch-tag from the most recent `start_server` walk. See +## `McpStartupPath`. Drives the startup-trace log. +var _startup_path: String = McpStartupPathScript.UNSET + +## Version-check seam. Lazily constructed on `arm_version_check` so +## tests that exercise the manager without a connection don't have to +## stub it out. +var _version_check + +## #678: when true, the blocking primitives on the startup path (port +## scrapes, per-PID brand shells, the HTTP status probe, kill + port-drain +## waits) run on a WorkerThreadPool thread while the main thread keeps +## pumping frames — the editor stays responsive during plugin init/reload +## on a contended port; the dock panel just arrives a beat later. The +## plugin enables this in production. Default false: unit tests (and any +## legacy caller) keep the historical fully-synchronous behavior, where +## the startup coroutines never actually suspend and call-then-assert +## still works. +var defer_blocking_work: bool = false + +## Cancellation for in-flight async startup work: bumped by `stop_server` +## (and therefore by `_exit_tree` and update-reload prep), checked after +## every await so a suspended `start_server` can't resurrect state — or +## spawn a server — after teardown started. +var _async_generation: int = 0 + +## Re-entrancy guard: with startup a coroutine, a second `start_server` +## call (respawn watch, dock button) can land mid-flight. +var _start_in_flight: bool = false + + +func _init(host) -> void: + _host = host + + +## The worker thread of the walk's current `_run_blocking` call, while it +## runs. `_invalidate_async_startup` JOINS it (bounded by the blocking +## op's own timeout) so no worker can still be executing a plugin method +## when `_exit_tree` frees the plugin — a mid-call free is use-after-free +## on the worker, which wedged the editor on macOS during rapid reload +## churn (main CI, post-#682). Null when no blocking work is in flight. +var _active_blocking_thread: Thread = null + + +## Run `work` off the main thread and suspend until it completes (#678). +## Falls back to inline execution when `defer_blocking_work` is off, or +## when no SceneTree is available to pump frames against. +## +## Uses a dedicated Thread (the dock's #238/#239 worker pattern) rather +## than WorkerThreadPool: `wait_to_finish()` hands the return value back +## without a shared mutable container, and this plugin has already seen +## WorkerThreadPool tasks SIGABRT under concurrency (see the notes in +## script_handler.gd / filesystem_handler.gd). `wait_to_finish` after +## `is_alive()` goes false joins an already-dead thread, so it never +## blocks the main thread. +## +## Returns null (without joining) when `_invalidate_async_startup` took +## ownership of the thread mid-flight — the walk is stale at that point +## and must bail. Callers therefore assign the result to an untyped +## local and bail on `_async_stale(...) or result == null` BEFORE any +## typed use — a typed assignment (or a bool()/int() constructor, both +## of which have no Nil form) trips on the null first. The null check is +## not redundant with the generation check: a caller that loses the slot +## without a generation bump — an invariant violation, but exactly what +## a concurrent fire-and-forget `_run_blocking` user produces — must +## still unwind instead of crashing on the Nil. +func _run_blocking(work: Callable) -> Variant: + if not defer_blocking_work: + return work.call() + var tree := Engine.get_main_loop() + if not (tree is SceneTree): + return work.call() + var thread := Thread.new() + if thread.start(work) != OK: + return work.call() + _active_blocking_thread = thread + while thread.is_alive(): + await (tree as SceneTree).process_frame + if _active_blocking_thread != thread: + ## Teardown/invalidation already joined this thread; the + ## result belongs to a cancelled walk. All resumes and joins + ## happen on the main thread, so this check cannot race. + return null + if _active_blocking_thread != thread: + return null + _active_blocking_thread = null + return thread.wait_to_finish() + + +func _async_stale(generation: int) -> bool: + return generation != _async_generation + + +## Cancel any in-flight async startup walk AND release the re-entrancy +## guard so the very next `start_server()` call walks fresh (#682 review). +## Every one-shot kill-and-restart path must call this before its +## follow-up start: without the generation bump the suspended walk +## resumes against post-kill reality (stale live-status snapshots), and +## without releasing the guard the follow-up start is silently swallowed. +## The cancelled walk unwinds via its post-await staleness checks and +## must NOT clear the guard itself — a newer walk may already own it +## (see the generation check in `start_server`). +## +## Also JOINS the walk's in-flight worker thread (bounded by that op's +## own timeout: lsof/netstat scrape, ≤800ms status probe, or kill + +## port-drain wait). `stop_server` runs this from `_exit_tree`, so once +## it returns no worker thread can still be executing a method of the +## plugin that is about to be freed — the macOS reload-churn wedge. +func _invalidate_async_startup() -> void: + _async_generation += 1 + _start_in_flight = false + var thread := _active_blocking_thread + _active_blocking_thread = null + if thread != null: + thread.wait_to_finish() + + +# ---- Public state accessors -------------------------------------------- + +func get_state() -> int: + return _server_state + + +func get_status_dict() -> Dictionary: + return { + "state": _server_state, + "exit_ms": _server_exit_ms, + "actual_name": _server_actual_name, + "actual_version": _server_actual_version, + "expected_version": _server_expected_version, + "message": _server_status_message, + "can_recover_incompatible": _can_recover_incompatible, + "connection_blocked": _connection_blocked, + "conflict_port": _conflict_port, + "keep_alive": _server_keep_alive, + "stale_recovery_budget": _stale_recovery_budget, + } + + +## Arm the bounded stale-occupant recovery (see `_stale_recovery_budget`). +## Called before the startup walk when a completed self-update is detected +## (plugin.gd) and by the dock recovery click — both are user actions that +## already authorize replacing the previous-version backend. `max()` so a +## click landing on an already-armed post-update episode never shrinks the +## remaining rounds. +func authorize_stale_recovery(rounds: int = 2) -> void: + _stale_recovery_budget = maxi(_stale_recovery_budget, rounds) + + +## True when a spent round of stale-occupant recovery may target the live +## occupant: budget remains and the occupant is a VERIFIED godot-ai whose +## version differs from ours. An empty version (foreign or unverified +## occupant) never qualifies — those stay on the strong-proof-only path. +func _stale_recovery_available(live_version: String, expected_version: String) -> bool: + if _stale_recovery_budget <= 0: + return false + if live_version.is_empty(): + return false + return live_version != expected_version + + +func get_server_pid() -> int: + return _server_pid + + +func get_startup_path() -> String: + return _startup_path + + +func get_adoption_watch_deadline_ms() -> int: + return _adoption_watch_deadline_ms + + +func is_awaiting_server_version() -> bool: + return _version_check != null and _version_check.is_active() + + +func is_connection_blocked() -> bool: + return _connection_blocked + + +# ---- State-machine entry points --------------------------------------- + +## Validated transition. Returns true on success; false (and logs a +## warning) when the transition is illegal under `McpServerState`'s +## table. Callers that need first-writer-wins among terminal diagnoses +## use `set_terminal_diagnosis` instead — that helper silently no-ops +## without warning when the diagnosis would be a regression. +func transition_state(target: int) -> bool: + if _server_state == target: + return true + if not McpServerStateScript.can_transition(_server_state, target): + push_warning( + "MCP | rejected illegal state transition %s -> %s" + % [ + McpServerStateScript.name_of(_server_state), + McpServerStateScript.name_of(target), + ] + ) + return false + _server_state = target + return true + + +## First-writer-wins mutator for terminal diagnoses (CRASHED, +## NO_COMMAND, PORT_EXCLUDED, INCOMPATIBLE, FOREIGN_PORT). Used during +## spawn to make sure a late watch-loop CRASHED doesn't clobber an +## earlier proactive PORT_EXCLUDED. Silent no-op when the current state +## is already a terminal diagnosis — the existing diagnosis is kept. +func set_terminal_diagnosis(target: int) -> bool: + if not McpServerStateScript.is_terminal_diagnosis(target): + push_warning( + "MCP | set_terminal_diagnosis called with non-terminal %s" + % McpServerStateScript.name_of(target) + ) + return false + if McpServerStateScript.is_terminal_diagnosis(_server_state): + return false + _server_state = target + return true + + +# ---- Adoption confirmation watcher ------------------------------------- + +## Arm the FOREIGN_PORT adoption-confirmation watcher. SPAWN_GRACE_MS +## ahead of `now`; `tick_adoption_watch` self-disarms after this expires +## so per-frame cost drops back to zero on a permanent foreign occupant. +func arm_adoption_watch() -> void: + _adoption_watch_deadline_ms = ( + Time.get_ticks_msec() + int(_host.SPAWN_GRACE_MS) + ) + + +func tick_adoption_watch(now_msec: int) -> void: + if _adoption_watch_deadline_ms > 0 and now_msec >= _adoption_watch_deadline_ms: + _adoption_watch_deadline_ms = 0 + + +# ---- Server version-check seam ---------------------------------------- + +func arm_version_check(connection, expected_version: String) -> void: + if _version_check == null: + _version_check = McpServerVersionCheckScript.new(self) + var expected := _resolve_expected_version(expected_version) + _server_expected_version = expected + _version_check.arm(connection, expected) + + +func disarm_version_check() -> void: + if _version_check != null: + _version_check.disarm() + + +func get_version_check(): + return _version_check + + +## Resolves a possibly-empty expected version to the plugin's shipping +## version. Manager methods that are called via test fixtures may +## receive an empty string when the test never seeded +## `_server_expected_version`, so this is the one place that fallback +## lives. +func _resolve_expected_version(supplied: String) -> String: + if not supplied.is_empty(): + return supplied + return _expected_server_version() + + +func _expected_server_version() -> String: + return ClientConfigurator.get_plugin_version() + + +## Called by McpServerVersionCheck when handshake_ack carries a version +## string. Decides compatible vs incompatible and transitions the state. +func handle_server_version_verified(expected_version: String, version: String) -> void: + _server_actual_name = "godot-ai" + _server_actual_version = version + var expected := _resolve_expected_version(expected_version) + _server_expected_version = expected + var compatibility := _server_version_compatibility(version, expected) + if compatibility.get("compatible", false): + _can_recover_incompatible = false + ## A verified compatible handshake ends any stale-recovery episode — + ## leftover authorized rounds must not survive into a later walk. + _stale_recovery_budget = 0 + ## Foreign-port and post-spawn handshakes both clear to READY + ## on a successful handshake. Late re-arms from READY also land + ## here and self-confirm. + transition_state(McpServerStateScript.READY) + _host._update_process_enabled() + return + ## A stale handshake is expected while the startup/recovery owner is already + ## replacing that exact old backend. Do not let the connection-side verdict + ## invalidate the startup walk and launch a second kill transaction. The + ## active owner re-probes the listener before acting and will either replace + ## it or leave the normal incompatible diagnosis on failure. + if _recovery_in_flight and version != expected: + print("MCP | stale godot-ai v%s handshake coalesced into active recovery" % version) + return + var live := {"version": version, "status_code": 200, "name": "godot-ai"} + ## Connection propagation + version-check disarm + process re-evaluation + ## all live inside _set_incompatible_server now (#691) so the startup-walk + ## recovery-failure and force-restart-failure paths get them too. + _set_incompatible_server(live, expected, ClientConfigurator.http_port()) + ## Post-update the WebSocket usually reaches the OLD backend before the + ## startup walk finishes its probes — this verdict then cancels the walk + ## (the `_invalidate_async_startup` in `_set_incompatible_server`'s + ## fire-and-forget arm) and used to strand the update at INCOMPATIBLE + ## even though the Update click already authorized replacing that + ## backend. With authorized rounds left and a VERIFIED stale version, + ## spend one and fire the same recovery flow the dock's Restart click + ## runs — via the plugin wrapper so the connection unblocks on success, + ## with `user_initiated=false` so the trigger can only spend, never + ## re-arm. The INCOMPATIBLE latch it gates on is synchronous: the + ## `_set_incompatible_server` head above runs before its first await. + if _stale_recovery_available(version, expected) and _host.has_method("recover_incompatible_server"): + _stale_recovery_budget -= 1 + print( + "MCP | stale godot-ai v%s answered the WS handshake — replacing it (update/recovery authorized, %d retry round(s) left)" + % [version, _stale_recovery_budget] + ) + ## Fire-and-forget coroutine: this verdict lands on the main thread + ## from `_process`, and the recovery owns the flow from here + ## (mirroring the recovery click). + _host.recover_incompatible_server(false, version) + + +func handle_server_version_unverified(expected_version: String) -> void: + var expected := _resolve_expected_version(expected_version) + _server_expected_version = expected + var live := {"version": "", "status_code": 0, "error": "missing_handshake_ack"} + _set_incompatible_server(live, expected, ClientConfigurator.http_port()) + + +# ---- Compatibility / version helpers (pure) --------------------------- + +## Plugin and server speak a single, version-coupled protocol — new commands +## and response fields are added together. Treating dev-mode mismatches as +## "compatible" silently adopts a stale server whose code may differ from the +## live source tree (e.g. another worktree on a different branch holding +## port 8000). Strict match in all modes routes mismatches through +## `recover_strong_port_occupant`, which kills the branded port-holder and +## lets `start_server` spawn fresh against the current source. +static func _server_version_compatibility( + actual_version: String, + expected_version: String +) -> Dictionary: + if actual_version.is_empty(): + return {"compatible": false, "reason": "unknown"} + if actual_version == expected_version: + return {"compatible": true, "reason": "exact"} + return {"compatible": false, "reason": "version_mismatch"} + + +static func _server_status_compatibility( + actual_version: String, + expected_version: String, + actual_ws_port: int, + expected_ws_port: int, +) -> Dictionary: + var version_result := _server_version_compatibility(actual_version, expected_version) + if not bool(version_result.get("compatible", false)): + return version_result + if actual_ws_port != expected_ws_port: + return {"compatible": false, "reason": "ws_port_mismatch"} + return version_result + + +static func _managed_record_has_version_drift(record_version: String, current_version: String) -> bool: + return not record_version.is_empty() and record_version != current_version + + +# ---- Incompatible-server bookkeeping ---------------------------------- + +func _set_incompatible_server( + live: Dictionary, + expected_version: String, + port: int, + caller_owns_worker_slot := false +) -> void: + ## Latches the incompatible diagnosis into manager state and asks + ## the dock to re-sweep client rows so they don't show stale green. + ## Threads the caller's `live` snapshot through the recovery proof + ## helper so we don't double-probe the port (~500ms each). + ## + ## Coroutine (#712): the recovery-proof evaluation (port scrapes + + ## per-PID brand shells) and the free-port bind probes run via + ## `_run_blocking` — these fire in exactly the contended/crashed + ## scenarios #678 de-blocked, so they must not stall the main thread + ## either. Everything user-visible (status message, connection block, + ## version-check disarm) is latched synchronously before the first + ## await; only the recovery verdict and the suggested-port diagnostic + ## arrive with the worker. + ## + ## `_run_blocking` tracks a single active worker, so the tail below + ## needs exclusive ownership of that slot. The startup walk awaits + ## this call with `caller_owns_worker_slot=true` — it already owns the + ## slot and serializes the tail behind its own blocking ops. Sync + ## callers (the handshake verdicts via `handle_server_version_*`, the + ## force-restart failure arm) fire-and-forget the tail and leave the + ## flag false, so the head takes ownership for them: a handshake + ## verdict lands from `_process` while a startup walk can still be + ## suspended in `_run_blocking`, and starting the tail's worker then + ## would steal the slot — the walk's op is orphaned from the + ## `_invalidate_async_startup` join guarantee and its resume gets a + ## null without a generation bump (the Nil-into-Dictionary crash on + ## the incompatible-occupant walk). Cancelling the walk first mirrors + ## the recovery click (#712): the diagnosis in hand supersedes + ## whatever the walk was still probing for. + if not caller_owns_worker_slot: + _invalidate_async_startup() + transition_state(McpServerStateScript.INCOMPATIBLE) + _connection_blocked = true + _server_expected_version = expected_version + _server_actual_name = str(live.get("name", "")) + _server_actual_version = _live_version_for_message(live) + _server_status_message = _incompatible_server_message( + live, expected_version, port, int(_host._resolved_ws_port) + ) + ## Conservative default until the off-thread proof lands: the dock + ## paints "not recoverable" rather than offering a kill we have not + ## yet proven ownership for. + _can_recover_incompatible = false + _host._refresh_dock_client_statuses() + ## Propagate the verdict to the live connection (#691). Pre-#678 the + ## startup walk finished synchronously before `_connection` existed, so + ## plugin.gd captured the INCOMPATIBLE verdict when constructing it. + ## Post-#678 the walk suspends at its first `_run_blocking` and the + ## plugin snapshots the pre-walk defaults (`connect_blocked=false`) — so + ## a verdict landing later (startup-walk recovery failure, handshake + ## mismatch, force-restart failure) must reach the connection here, or + ## it keeps dialing the WS port forever. Also disarm the version check: + ## the diagnosis already landed, so leaving the check armed keeps + ## per-frame `_process` on for the plugin's whole lifetime. + if _host._connection != null: + _host._connection.connect_blocked = true + _host._connection.connect_block_reason = _server_status_message + _host._connection.disconnect_from_server() + disarm_version_check() + _host._update_process_enabled() + + ## Off-thread recovery proof (#712), mirroring recover_strong_port_occupant: + ## the EditorSettings record is read on the main thread up front and + ## injected as record_override — EditorSettings is main-thread-only. + var async_gen := _async_generation + var record: Dictionary = _host._read_managed_server_record() + var proof_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {"proof": "", "pids": []} + return _host._evaluate_recovery_port_occupant_proof(port, live, record) + ) + if _async_stale(async_gen) or proof_result == null: + return + var proof: Dictionary = proof_result + var proof_name := str(proof.get("proof", "")) + _can_recover_incompatible = not proof_name.is_empty() + print("MCP | proof: %s" % (proof_name if _can_recover_incompatible else "(none)")) + if not _can_recover_incompatible: + ## Non-recoverable: a foreign / unprovable occupant holds the port and + ## we have no ownership proof, so we must NOT kill it — surface a + ## concrete free port the user can switch to instead (the same hint + ## the dock crash body renders). Logging it to the editor output also + ## lets `ci-stale-server-smoke --mode foreign` assert this upstream + ## classification from CI. Reservation-aware on Windows; the bind + ## probes behind suggest_free_port also run off-thread (#712). + var suggested_result: Variant = await _run_blocking(func() -> Variant: + return ClientConfigurator.suggest_free_port(port + 1) + ) + if _async_stale(async_gen) or suggested_result == null: + return + print("MCP | port %d occupant not recoverable (no ownership proof); suggested free port %d (set godot_ai/http_port)" % [port, int(suggested_result)]) + ## Second sweep so the dock's recovery affordance reflects the verdict + ## that just landed. + _host._refresh_dock_client_statuses() + + +static func _incompatible_server_message( + live: Dictionary, + expected_version: String, + port: int, + expected_ws_port: int +) -> String: + var version := _live_version_for_message(live) + var actual_ws_port := _live_ws_port_for_message(live) + ## `package_path` is a v2.4.4+ field — older servers omit it. Suffix + ## the message with "(loaded from )" when present so the user + ## can tell *which* `src/godot_ai/` is serving the port without + ## walking the process tree. See #416. + var package_path := _live_package_path_for_message(live) + var path_suffix := " (loaded from %s)" % package_path if not package_path.is_empty() else "" + ## After a plugin update, the usual occupant is a backend kept alive by + ## AI-client attach bridges still pinned to the previous version (their + ## leases outrank us — #669/#839, we must not kill it). Name that repair + ## first; "stop the old server" alone reads as a dead end when the server + ## respawns the moment the user kills it. + var repair := ( + "If AI-client attach bridges are keeping it alive, run Configure all to " + + "repin them, then restart those client apps — the old server exits on " + + "its own. Otherwise stop it manually or change both HTTP and WS ports." + ) + if not version.is_empty(): + if actual_ws_port > 0 and actual_ws_port != expected_ws_port: + return ( + "Port %d is occupied by godot-ai server v%s using WS port %d%s; " + + "plugin expects v%s with WS port %d. %s" + ) % [port, version, actual_ws_port, path_suffix, expected_version, expected_ws_port, repair] + return ( + "Port %d is occupied by godot-ai server v%s%s; plugin expects v%s. %s" + ) % [port, version, path_suffix, expected_version, repair] + var status_code := int(live.get("status_code", 0)) + if status_code > 0: + return ( + "Port %d is occupied by an unverified server (status endpoint returned HTTP %d); " + + "plugin expects godot-ai v%s. Stop the other server or change both HTTP and WS ports." + ) % [port, status_code, expected_version] + return ( + "Port %d is occupied by another process; plugin expects godot-ai v%s. " + + "Stop the other process or change both HTTP and WS ports." + ) % [port, expected_version] + + +static func _live_status_identifies_godot_ai(live: Dictionary) -> bool: + return str(live.get("name", "")) == "godot-ai" + + +static func _live_version_for_message(live: Dictionary) -> String: + if live.has("name") and str(live.get("name", "")) != "godot-ai": + return "" + return str(live.get("version", "")) + + +static func _live_ws_port_for_message(live: Dictionary) -> int: + if live.has("name") and str(live.get("name", "")) != "godot-ai": + return 0 + return int(live.get("ws_port", 0)) + + +static func _live_package_path_for_message(live: Dictionary) -> String: + ## Only trust the path when the live snapshot confirms a godot-ai + ## server — a probe of some unrelated HTTP service could in theory + ## return a `package_path` JSON field, and we don't want to mislabel + ## that as "godot-ai loaded from …" in the incompatible banner. + if live.has("name") and str(live.get("name", "")) != "godot-ai": + return "" + return str(live.get("package_path", "")) + + +# ---- start_server / spawn watch / respawn ----------------------------- + + +## Sets GODOT_AI_DISABLE_TELEMETRY in the process environment for the +## upcoming OS.create_process call if: (a) neither GODOT_AI_DISABLE_TELEMETRY +## nor DISABLE_TELEMETRY is already set to a *truthy* value (a falsey "0" does +## NOT count — it must not suppress a dock UI opt-out), and (b) the effective +## McpSettings.telemetry_enabled() is false. Returns true if the var was +## injected so the caller can unset it after spawning. +func _inject_telemetry_env() -> bool: + ## If telemetry is already disabled by a *truthy* env var, leave the env as + ## the user/CI set it — the post-spawn cleanup unsets what we inject, so + ## injecting here would strip their own var from the editor process. A + ## *falsey* value (e.g. DISABLE_TELEMETRY=0) must NOT count as "handled": + ## fall through so a dock UI opt-out still reaches the spawned server. The + ## truthy test mirrors McpSettings.telemetry_enabled() and the Python server. + if McpSettings.env_truthy("GODOT_AI_DISABLE_TELEMETRY") or McpSettings.env_truthy("DISABLE_TELEMETRY"): + return false + if not McpSettings.telemetry_enabled(): + OS.set_environment("GODOT_AI_DISABLE_TELEMETRY", "true") + return true + return false + + +## Set GODOT_AI_OWNER_PID to this editor's PID for the next OS.create_process, +## so the spawned server can self-reap if this editor crashes. Returns true if +## set (caller must unset right after spawning — keep it out of the persistent +## editor env). No-op on Windows, where the server's reaper is disabled. +func _set_owner_pid_env() -> bool: + if OS.get_name() == "Windows": + return false + ## keep_server_on_exit (#800): a server meant to outlive editors must not + ## self-reap when this editor dies — don't hand it an owner pid at all. + if ClientConfigurator.keep_server_on_exit(): + return false + OS.set_environment("GODOT_AI_OWNER_PID", str(OS.get_process_id())) + return true + + +## Mark the next OS.create_process as plugin-spawned so the server arms its +## session-idle self-terminate backstop (#498): with zero editor sessions for +## a grace window, it exits on its own. Unlike the owner-PID reaper this is +## pure session-count on the server side, so it is set on EVERY platform — +## including Windows, where owner-PID is skipped; this marker is what finally +## gives Windows orphan coverage (#497). Same env-channel rationale and same +## tight scoping as _set_owner_pid_env: callers unset it right after spawning +## so a later manually-started dev server can never inherit it and idle-kill +## itself. +func _set_plugin_spawned_env() -> void: + OS.set_environment("GODOT_AI_PLUGIN_SPAWNED", "1") + + +## keep_server_on_exit (#800): opt the spawned server out of the +## session-idle self-terminate backstop (#498) via its existing +## GODOT_AI_NO_IDLE_EXIT escape hatch — a keep-alive server sits at zero +## sessions between editor runs by design, which is exactly what the +## backstop reaps. Returns true if set (same tight scoping as +## _set_owner_pid_env: callers unset right after spawning, and only when +## WE set it, so a user's own NO_IDLE_EXIT env is never stripped). +func _set_keep_alive_env() -> bool: + if not ClientConfigurator.keep_server_on_exit(): + return false + OS.set_environment("GODOT_AI_NO_IDLE_EXIT", "1") + return true + + +## Generate a fresh per-launch WS handshake auth token (#690) and stage it +## in the env for the next OS.create_process, same channel and same tight +## scoping as _set_owner_pid_env (callers unset right after spawning — the +## secret must not linger in the editor env). The caller hands the returned +## token to the host on successful spawn so the connection echoes it in the +## handshake and the managed-server record persists it across reloads. +func _set_ws_token_env() -> String: + var token := Crypto.new().generate_random_bytes(32).hex_encode() + OS.set_environment("GODOT_AI_WS_TOKEN", token) + return token + + +## Branch table (recorded version is the "is this ours?" signal — uvx +## launcher PIDs go stale; #135/#137): +## port free -> spawn fresh, record PID +## port in use, record matches + live ok -> adopt port owner (heals PID) +## port in use, record drifts -> kill owner + respawn +## port in use, no verified live match -> block adoption + warn +## +## #678: this is a coroutine in production (`defer_blocking_work`) — the +## port scrapes, status probes, and kill-drain waits run off the main +## thread and the state machine resumes between frames, so the editor +## stays responsive when the port is contended. With the flag off (unit +## tests) nothing suspends and the call completes synchronously. +func start_server() -> void: + if _start_in_flight: + return + _start_in_flight = true + var gen := _async_generation + await _start_server_impl(gen) + ## Only release the guard if this walk is still the current one — a + ## cancelled (stale) walk unwinding here must not clobber the guard a + ## newer walk armed after `_invalidate_async_startup`. + if gen == _async_generation: + _start_in_flight = false + ## Walk-completion continuation lives HERE — on the RefCounted + ## manager, kept alive by its own suspended state — never on the + ## plugin: resuming a coroutine of a freed Node errors out, and + ## reload churn frees plugin instances while walks are suspended. + if is_instance_valid(_host) and _host.has_method("_finish_startup_trace_after_walk"): + _host._finish_startup_trace_after_walk() + + +func _start_server_impl(async_gen: int) -> void: + if _host._server_started_this_session: + ## Static flag persists across disable/enable cycles in one editor + ## session — re-entrant spawn guard for plugin-reload-during-update. + _startup_path = McpStartupPathScript.GUARDED + transition_state(McpServerStateScript.GUARDED) + return + + _refresh_retried = false + if _readopt_walk_pending: + ## #805: this walk was triggered by the fast-exit re-adopt arm. + ## Keep the spent budget: if this walk ends up spawning and that + ## spawn fast-exits against a live godot-ai again, the occupant is + ## flapping and the diagnosis must latch terminal instead of + ## re-walking forever. Recovery paths (adoption, healthy spawn) + ## refresh the budget explicitly. + _readopt_walk_pending = false + else: + _readopt_after_spawn_exit_retried = false + _conflict_port = 0 + + var port := ClientConfigurator.http_port() + var ws_port := ClientConfigurator.ws_port() + var current_version := _expected_server_version() + _server_expected_version = current_version + + ## The worker closures re-check the host: the plugin can be freed while + ## a bounded shell probe is still running, and the generation check only + ## protects state after resume, not calls inside the task (#682 review). + var port_in_use_result: Variant = await _run_blocking(func() -> Variant: + return is_instance_valid(_host) and _host._is_port_in_use(port) + ) + if _async_stale(async_gen) or port_in_use_result == null: + return + var port_in_use := bool(port_in_use_result) + if not port_in_use: + ## #745: after an editor crash (or under multi-editor churn) the + ## managed server keeps running, yet the bind probe can still say + ## "free" (Windows lets a SO_REUSEADDR bind succeed over a live + ## listener; the scrape fallback can fail transiently). The HTTP + ## status probe is the authoritative tie-breaker and runs + ## UNCONDITIONALLY: the pid-file evidence gate that used to guard it + ## goes stale exactly when it's needed most — same-named test + ## projects share one app_userdata dir, so another editor's walk can + ## clear or overwrite the pid-file, and blind-spawning here produced + ## the reproduced duplicate-spawn + 4003 token loop. A live godot-ai + ## answer forces the adopt/recover branch below; an unresponsive + ## port falls through to the normal spawn path at the cost of one + ## fast connection-refused probe (off-thread in production). + var evidence_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {} + return _host._probe_live_server_status_for_port(port) + ) + if _async_stale(async_gen) or evidence_result == null: + return + var evidence: Dictionary = evidence_result + if _live_status_identifies_godot_ai(evidence): + port_in_use = true + if port_in_use: + var record: Dictionary = _host._read_managed_server_record() + var record_version := str(record.get("version", "")) + var record_ws_port := int(record.get("ws_port", 0)) + _host._set_resolved_ws_port(PortResolver.resolved_ws_port_for_existing_server( + record_ws_port, + record_version, + current_version, + int(_host._resolve_ws_port()) + )) + ws_port = int(_host._resolved_ws_port) + ## Untyped first: a cancelled walk gets null back (see _run_blocking) + ## and must reach the staleness check before any typed cast. + var live_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {} + return _host._probe_live_server_status_for_port(port) + ) + if _async_stale(async_gen) or live_result == null: + return + var live: Dictionary = live_result + var live_version := str(_host._verified_status_version(live)) + var live_ws_port := int(_host._verified_status_ws_port(live)) + var compatibility: Dictionary = _server_status_compatibility( + live_version, + current_version, + live_ws_port, + ws_port, + ) + if compatibility.get("compatible", false): + _server_actual_name = "godot-ai" + _server_actual_version = live_version + _can_recover_incompatible = false + ## A matching version is compatibility evidence, not ownership + ## evidence (#759/#764). A stale EditorSettings record can name a + ## dead PID while an unrelated compatible server owns the port. + ## Retain managed ownership only when the recorded PID is itself + ## the live, branded listener. + var adoption_proof_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {"proof": "", "pids": []} + return _host._evaluate_strong_port_occupant_proof(port, live, record) + ) + if _async_stale(async_gen) or adoption_proof_result == null: + return + var adoption_proof: Dictionary = adoption_proof_result + var proof_pids: Array[int] = [] + proof_pids.assign(adoption_proof.get("pids", [])) + var owner := int(proof_pids[0]) if not proof_pids.is_empty() else 0 + var record_owns_listener := str(adoption_proof.get("proof", "")) == "managed_record" + var owner_label := adopt_compatible_server( + record_version, + current_version, + owner, + record_owns_listener + ) + _host._server_started_this_session = true + _startup_path = McpStartupPathScript.ADOPTED + transition_state(McpServerStateScript.READY) + print(_compatible_adoption_log_message( + owner_label, + int(_server_pid), + owner, + str(_server_actual_version), + live_ws_port, + current_version + )) + return + if bool(_managed_record_has_version_drift(record_version, current_version)): + print("MCP | managed server v%s does not match plugin v%s, restarting" + % [record_version, current_version]) + ## One transaction owns strong-proof recovery and the bounded stale-version + ## fallback. The WS handshake path can observe the same old server while + ## these awaits are suspended; `_recovery_in_flight` makes that verdict + ## coalesce here instead of starting a competing kill/respawn. + var recovered: bool = await _recover_startup_port_occupant( + port, live, live_version, current_version, async_gen + ) + if _async_stale(async_gen): + return + if not recovered: + _host._server_started_this_session = true + var post_recovery_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {} + return _host._probe_live_server_status_for_port(port) + ) + if _async_stale(async_gen) or post_recovery_result == null: + return + var post_recovery_live: Dictionary = post_recovery_result + ## Awaited with caller_owns_worker_slot=true (#712): the + ## diagnosis tail runs its own _run_blocking proof, and the walk + ## stays the single owner of the active-worker slot by + ## serializing that tail behind this await instead of letting it + ## re-take the slot. The status message is latched before the + ## tail's first await, so the push_warning below reads the final + ## text either way. + await _set_incompatible_server(post_recovery_live, current_version, port, true) + if _async_stale(async_gen): + return + _startup_path = McpStartupPathScript.INCOMPATIBLE + push_warning(str(_server_status_message)) + return + else: + _startup_path = McpStartupPathScript.FREE + + _host._set_resolved_ws_port(_host._resolve_ws_port()) + ws_port = _host._resolved_ws_port + + _host._startup_trace_count("server_command_discovery") + ## CLI-finder discovery shells out (which/where, login shell) on cache + ## misses — the same #238/#239 family the dock already runs off-thread. + var server_cmd_result: Variant = await _run_blocking(func() -> Variant: + return ClientConfigurator.get_server_command() + ) + if _async_stale(async_gen) or server_cmd_result == null: + return + var server_cmd: Array = server_cmd_result + if server_cmd.is_empty(): + set_terminal_diagnosis(McpServerStateScript.NO_COMMAND) + _startup_path = McpStartupPathScript.NO_COMMAND + push_warning("MCP | could not find server command") + return + + var cmd: String = server_cmd[0] + var args: Array[String] = [] + args.assign(server_cmd.slice(1)) + args.append_array(_host._build_server_flags(port, ws_port)) + + ## Wipe any stale pid-file so a failed launch can't leave last + ## session's PID for `_find_managed_pid` to read. + _host._clear_pid_file() + + ## Proactive Windows port-reservation check (#146) — bind would + ## fail silently with WinError 10013 inside a Hyper-V / WSL2 / + ## Docker exclusion range; netstat shows nothing. + if WindowsPortReservation.is_port_excluded(port): + _host._server_started_this_session = true + set_terminal_diagnosis(McpServerStateScript.PORT_EXCLUDED) + _startup_path = McpStartupPathScript.RESERVED + push_warning("MCP | port %d is reserved by Windows (Hyper-V / WSL2 / Docker)" % port) + return + + ## ---- Spawn-time env-mutation window (#691) ------------------------- + ## From here to the post-spawn unsets below, the editor's process-global + ## environment is mutated around OS.create_process (which has no + ## per-child env parameter). Two invariants keep this safe: + ## 1. The window is SYNCHRONOUS main-thread code — no `await` between + ## the first setenv and the last unsetenv — and worker dispatch also + ## only happens on the main thread, so no new worker can start inside + ## the window. + ## 2. Already-running workers never call OS.get_environment: every env + ## read reachable from a worker (path templates, config_home_override, + ## CLI finder, mode_override/startup-trace) routes through + ## McpPathTemplate.env_lookup, which serves worker threads from a + ## main-thread-warmed snapshot. A concurrent glibc getenv during + ## setenv can return a freed pointer — process-fatal. + ## Residual (accepted): a worker's own OS.execute child (CLI status + ## probe) launched while this window is open inherits the temp vars — + ## rare, and tame next to the crash class above. + var injected_telemetry_env := _inject_telemetry_env() + + ## PYTHONPATH handling for dev checkouts: when the editor is launched + ## against a worktree whose `src/godot_ai/__version__` differs from the + ## root repo's editable install, the dev-venv python's `sitecustomize` + ## adds the *root repo's* `src/` to `sys.path`. The spawned server then + ## reports the root repo's version, the plugin's compatibility check + ## flags it as incompatible, and the user gets a Restart-Server loop + ## with no exit. `start_dev_server` already prepends the worktree's + ## `src/` for its --reload spawn; mirror that here for the auto-spawn + ## path so the same worktree-vs-root version skew is impossible. Gated + ## on `is_dev_checkout()` so production user installs (no nearby `src/`) + ## are untouched. See #418. + var worktree_src := "" + var prev_pythonpath := "" + var pythonpath_set := false + if ClientConfigurator.is_dev_checkout(): + worktree_src = ClientConfigurator.find_worktree_src_dir( + ProjectSettings.globalize_path("res://") + ) + if not worktree_src.is_empty(): + prev_pythonpath = OS.get_environment("PYTHONPATH") + var sep := ";" if OS.get_name() == "Windows" else ":" + var new_pp := ( + worktree_src + if prev_pythonpath.is_empty() + else worktree_src + sep + prev_pythonpath + ) + OS.set_environment("PYTHONPATH", new_pp) + pythonpath_set = true + + ## Tell the spawned server which editor owns it so it can self-reap if we + ## die without a clean stop_server (crash / hard-kill). Passed via env, not + ## a CLI flag, so an older server (staggered user-mode upgrade) silently + ## ignores an unknown var instead of failing argparse. Scoped tightly around + ## create_process and unset right after (like PYTHONPATH below): the child + ## inherits it, but it must NOT linger in the editor env, or a later + ## non-reload `godot-ai` subprocess (dev server, future spawn) would inherit + ## it and wrongly arm a reaper keyed to this editor. + ## Skipped on Windows: the server's reaper is POSIX-only for now (Windows + ## process-liveness/self-shutdown isn't live-validated yet). The server + ## gates on this too. + var owner_env_set := _set_owner_pid_env() + _set_plugin_spawned_env() + var keep_alive_env_set := _set_keep_alive_env() + var ws_token := _set_ws_token_env() + + _server_pid = OS.create_process(cmd, args) + var spawned_pid := int(_server_pid) + + if owner_env_set: + OS.unset_environment("GODOT_AI_OWNER_PID") + OS.unset_environment("GODOT_AI_PLUGIN_SPAWNED") + if keep_alive_env_set: + OS.unset_environment("GODOT_AI_NO_IDLE_EXIT") + OS.unset_environment("GODOT_AI_WS_TOKEN") + + ## Restore PYTHONPATH immediately — the spawned child has already + ## copied the env, so the editor's own process state returns to + ## baseline. Leaving it set would leak to any later OS.create_process + ## from unrelated paths. + if pythonpath_set: + if prev_pythonpath.is_empty(): + OS.unset_environment("PYTHONPATH") + else: + OS.set_environment("PYTHONPATH", prev_pythonpath) + + if injected_telemetry_env: + OS.unset_environment("GODOT_AI_DISABLE_TELEMETRY") + + if spawned_pid > 0: + _server_spawn_ms = Time.get_ticks_msec() + _server_exit_ms = 0 + _server_pid_published_elapsed_ms = 0 + _spawn_dead_since_ms = 0 + _server_keep_alive = keep_alive_env_set + _host._server_started_this_session = true + transition_state(McpServerStateScript.SPAWNING) + ## The child copied the env, so this token is what the server will + ## verify handshakes against — adopt it BEFORE writing the record + ## (the record write persists _ws_auth_token). + _host._set_ws_auth_token(ws_token) + ## Record the launcher PID so same-session + ## prepare_for_update_reload has something to kill. The next + ## editor start's adopt branch heals it to the real port owner. + _host._write_managed_server_record(spawned_pid, current_version, _server_keep_alive) + _startup_path = McpStartupPathScript.SPAWNED + ## Log "PYTHONPATH prefix=" rather than "PYTHONPATH=" so the line + ## isn't misleading when an existing PYTHONPATH was present — + ## we prepended `worktree_src`, not replaced. Keeps the log + ## compact (worktree_src is the actionable piece; the full + ## prev_pythonpath can be 5+ entries long on dev machines). + var suffix := " (PYTHONPATH prefix=%s)" % worktree_src if not worktree_src.is_empty() else "" + print("MCP | started server (PID %d, v%s): %s %s%s" % [spawned_pid, current_version, cmd, " ".join(args), suffix]) + _host._start_server_watch() + else: + _server_status_message = "" + set_terminal_diagnosis(McpServerStateScript.CRASHED) + _startup_path = McpStartupPathScript.CRASHED + push_warning("MCP | failed to start server") + + +## Is the watched spawn PID's death still explainable as a launcher handoff +## rather than a server exit? (#797) +## +## Observed on Windows 11 with a uv-created venv: one boot in four logged +## "server exited after 5146ms" while the real server kept running and was +## then adopted. The watched PID had died on a healthy boot, and because the +## server had not yet written its pid-file there was nothing to heal onto, so +## the watch crossed SPAWN_GRACE_MS and reported an exit — rescued only by the +## crash-survivor adoption path. +## +## A uv venv's `python.exe` is a shim rather than the interpreter, and the real +## server does run under a *different* PID than the one `OS.create_process` +## hands back. But the original report's suspected mechanism — that the shim +## exits once its child is up — is **disproven**, not merely unconfirmed. A +## 12-boot run on Windows 11 with a uv venv found the spawned trampoline alive +## on every boot, with the child owning both the pid-file and the listener; a +## CI runner showed the same. The shim is a live parent for the process's whole +## life, so it is not what kills the watched PID. +## +## Two consequences worth keeping straight. First, this gate is keyed to the +## observable condition — watched PID dead, no pid-file yet — not to any theory +## of why it died, so it stays correct whatever the cause. Second, and less +## comfortable: in that same 12-boot run the false "server exited" line never +## appeared AND the watched PID never died, so the guard never fired. Those +## clean boots are evidence the symptom did not reproduce, NOT evidence this +## guard fixes it. The true cause of the original 1-in-4 report is still +## unknown; if it resurfaces, start from that rather than from the trampoline. +## +## `real_pid <= 0` means no pid-file exists yet, and that reliably means "this +## server has not published one" rather than "stale leftover": `start_server` +## wipes the pid-file immediately before every spawn. So an absent pid-file +## plus a dead spawn PID inside the window is the handoff signature. +## +## Deliberately gated to Windows. POSIX uv venvs exec rather than trampoline, +## so a dead spawn PID there really is a dead server, and delaying its +## diagnosis would only slow down honest crash reporting on the platforms +## where this cannot happen. `os_name` is a parameter rather than an +## `OS.get_name()` call so the Windows path is exercisable from any host. +static func is_spawn_handoff_pending( + os_name: String, real_pid: int, elapsed_ms: int, window_ms: int +) -> bool: + if os_name != "Windows": + return false + if real_pid > 0: + return false + return elapsed_ms < window_ms + + +## First-write-wins stamp for the elapsed time at which the spawn PID was first +## observed dead (#797). +## +## A diagnosis raised after waiting out a handoff must still report when the +## process actually exited, not when the wait gave up — the point of #797 is an +## honest log line. Returns the existing stamp once one is set, so later ticks +## in the same wait cannot overwrite it; `<= 0` means "not yet stamped", +## matching how the field is cleared per spawn. +static func first_death_stamp(current_stamp_ms: int, elapsed_ms: int) -> int: + return current_stamp_ms if current_stamp_ms > 0 else elapsed_ms + + +## One-line forensic snapshot taken the moment a spawn is judged to have +## fast-exited (#797). +## +## #797 reported `server exited after 5146ms` on a healthy Windows boot, once +## in four. It is still unexplained: a 12-boot run on the reported +## configuration reproduced neither the symptom nor its suspected mechanism — +## the uv trampoline was alive on every boot, with the child owning the +## pid-file and the listener, so the shim's exit is ruled out as the cause. +## What killed that watched PID is unknown, and the log line at the time +## carried no evidence to answer it with. +## +## So capture the state at the moment of judgement rather than asking the next +## person to reproduce a 1-in-4 bug under observation. Everything here is read +## through seams the surrounding diagnosis already uses, on a path that only +## runs when a spawn is being declared dead, so it costs nothing in the +## healthy case. +## Deliberately does NOT scrape the port for listener PIDs. This runs from the +## 1 Hz watch loop, on a live frame, so a `_find_all_pids_on_port` subprocess +## here would stall the editor for a diagnostic. Deferring it via +## `_run_blocking` was the alternative and is worse: that helper is +## `await`-based, so it would turn this, `_diagnose_spawn_fast_exit` and +## `check_server_health` into coroutines — making the watch callback resume +## across arbitrary frames while its branches set terminal state and trigger +## re-adoption walks. That is the teardown-ordering hazard +## `_invalidate_async_startup` exists to contain, and it is not worth taking +## on for a log line. +## +## Little is lost: the probe on the very next line already establishes whether +## a godot-ai server answers on the port, and `_diagnose_spawn_port_conflict` +## names a foreign occupant when there is one. If you are tempted to add the +## PID list back, put it behind that existing conflict path rather than here. +func _log_spawn_exit_forensics() -> void: + var spawn_pid := int(_server_pid) + var pid_file_pid := int(_host._read_pid_file_for_proof()) + ## Computed here rather than accepted as a parameter. The caller's + ## `elapsed` IS `_spawn_dead_since_ms` — #837 passes the true death time so + ## the user-facing "server exited after Nms" line stays honest — so taking + ## it would make these two fields report the same number, collapsing the + ## exact distinction they exist to record. + var diagnosed_at_ms := 0 + if int(_server_spawn_ms) > 0: + diagnosed_at_ms = Time.get_ticks_msec() - int(_server_spawn_ms) + _host._log_buffer.log(format_spawn_exit_forensics({ + "os": OS.get_name(), + "launch_mode": ClientConfigurator.get_server_launch_mode(), + "elapsed_ms": diagnosed_at_ms, + ## Differs from elapsed_ms when a Windows handoff window was waited out + ## (#824/#837): the true death time versus when we gave up on it. + "first_dead_ms": int(_spawn_dead_since_ms), + "spawn_pid": spawn_pid, + ## Re-read rather than trusted from the watch tick: if the spawn PID is + ## alive HERE, the death that triggered this was transient, which is a + ## different bug from a process that really exited. + "spawn_alive": spawn_pid > 0 and bool(_host._pid_alive_for_proof(spawn_pid)), + "pid_file_pid": pid_file_pid, + "pid_file_alive": pid_file_pid > 0 and bool(_host._pid_alive_for_proof(pid_file_pid)), + })) + + +## Render the forensic snapshot. Pure so the format is testable without a live +## editor, and kept to one line so it survives log truncation in a bug report. +static func format_spawn_exit_forensics(facts: Dictionary) -> String: + var spawn_pid := int(facts.get("spawn_pid", 0)) + var pid_file_pid := int(facts.get("pid_file_pid", 0)) + ## The single most diagnostic bit, stated rather than left to be inferred: + ## a live pid-file process while the watched one is gone is the launcher + ## handoff shape; both gone is a real crash. + var shape := "unknown" + var spawn_alive := bool(facts.get("spawn_alive", false)) + var file_alive := bool(facts.get("pid_file_alive", false)) + if spawn_alive: + shape = "watched_pid_still_alive" + elif file_alive and pid_file_pid != spawn_pid: + shape = "handoff_child_alive" + elif not file_alive and pid_file_pid <= 0: + shape = "no_pid_file_published" + else: + shape = "all_dead" + return ( + "#797 spawn-exit forensics: shape=%s os=%s launch=%s elapsed=%dms " + + "first_dead=%dms spawn_pid=%d(alive=%s) pid_file_pid=%d(alive=%s)" + ) % [ + shape, + str(facts.get("os", "")), + str(facts.get("launch_mode", "")), + int(facts.get("elapsed_ms", 0)), + int(facts.get("first_dead_ms", 0)), + spawn_pid, + str(spawn_alive), + pid_file_pid, + str(file_alive), + ] + + +## Watch-loop callback (1 Hz, cold-start budget until pid-file publication, +## then the warm budget from the publication tick). +## `--pid-file` is the source of truth on Windows / uvx where the +## launcher PID dies quickly after spawning the real interpreter. +func check_server_health() -> void: + if int(_server_pid) <= 0: + _host._stop_server_watch() + return + var elapsed := Time.get_ticks_msec() - int(_server_spawn_ms) + var real_pid := PortResolver.read_pid_file() + if real_pid > 0 and _server_pid_published_elapsed_ms == 0: + _server_pid_published_elapsed_ms = elapsed + var spawn_pid := int(_server_pid) + if real_pid > 0 and real_pid != spawn_pid and PortResolver.pid_alive(real_pid): + _spawn_dead_since_ms = 0 + _server_pid = real_pid + ## The spawn record initially contains the launcher PID so same-session + ## teardown can kill it. Heal it as soon as the server publishes its + ## authoritative PID; future adoption requires the recorded PID to be + ## the actual live listener (#759). + _host._write_managed_server_record(real_pid, _expected_server_version(), _server_keep_alive) + ## #805: the spawn survived to publish its pid-file — proven + ## recovery, so the fast-exit re-adopt budget refreshes. + ## + ## The stale-recovery budget is deliberately NOT reset here (#890 + ## review P1): the Python server writes its pid-file during import, + ## BEFORE uvicorn binds HTTP or the WebSocket listener starts + ## (src/godot_ai/__init__.py) — publication proves the child reached + ## that line, not that it owns either port. A bridge respawn can + ## still steal the bind after the pid-file lands, and zeroing here + ## left that fast-exit with no recovery round. The budget resets on + ## the genuinely proven recoveries: adoption and the verified + ## compatible handshake. + _readopt_after_spawn_exit_retried = false + elif not PortResolver.pid_alive(spawn_pid): + _spawn_dead_since_ms = first_death_stamp(_spawn_dead_since_ms, elapsed) + if is_spawn_handoff_pending( + OS.get_name(), real_pid, elapsed, int(_host.SPAWN_HANDOFF_MS) + ): + return + if elapsed >= int(_host.SPAWN_GRACE_MS) and not McpServerStateScript.is_terminal_diagnosis(_server_state): + _diagnose_spawn_fast_exit(_spawn_dead_since_ms) + return + var watch_elapsed := watch_window_elapsed_ms( + elapsed, real_pid, _server_pid_published_elapsed_ms + ) + if watch_elapsed >= watch_budget_ms( + real_pid, int(_host.SERVER_WATCH_MS), int(_host.SERVER_COLD_START_WATCH_MS) + ): + ## #896: past the budget we stop watching either way, but a spawn that + ## never published a pid-file did not "survive startup" — it just never + ## proved anything. Say so, or the only remaining signal is a silent + ## reconnect loop. + if real_pid <= 0: + print( + "MCP | server spawn never published a pid-file within %ds; " + % int(_host.SERVER_COLD_START_WATCH_MS / 1000) + + "no longer watching it. If the editor stays disconnected, " + + "check the Godot output log for the server's own errors." + ) + _host._stop_server_watch() + + +## How long to keep watching a spawn, given whether it has published its +## pid-file yet. +## +## Pure so tests can drive the decision without a live spawn. `pid_from_file` +## is the authoritative "the server got far enough to run" signal: the Python +## server writes it during import, before uvicorn binds. Until it appears, a +## live launcher PID proves only that `uvx` has not exited — on a cold start +## that is usually a download still in progress, not a started server. +static func watch_budget_ms(pid_from_file: int, warm_ms: int, cold_ms: int) -> int: + return warm_ms if pid_from_file > 0 else cold_ms + + +## Elapsed time in the currently-active watch window. Before startup proof, +## the window begins at process creation. Once the pid-file appears, begin a +## fresh warm watch window so a 45-second download still gets 30 seconds of +## early-exit coverage after Python starts. +static func watch_window_elapsed_ms( + spawn_elapsed_ms: int, pid_from_file: int, pid_published_elapsed_ms: int +) -> int: + if pid_from_file <= 0 or pid_published_elapsed_ms <= 0: + return spawn_elapsed_ms + return maxi(0, spawn_elapsed_ms - pid_published_elapsed_ms) + + +## The spawned server died inside the SPAWN_GRACE_MS window. Decide what +## that means, in order: +## 1. A live godot-ai server answers on the HTTP port -> our spawn lost +## a port race the bind probe never saw (#745 bind-trap: the walk +## thought the port was free, the duplicate exited unable to bind, +## and the token it staged in the record is now stale). Re-run the +## startup walk so the adopt/recover branch handles the survivor — +## latching CRASHED here left the connection redialing forever with +## a token the surviving server rejects (close code 4003). One +## re-adopt per recovery via `_readopt_after_spawn_exit_retried` +## (#805): the triggered walk preserves the spent budget, so a +## flapping occupant (alive at each fast-exit probe, gone by each +## walk's probes — sustained multi-editor churn) latches a specific +## CRASHED diagnosis on the second round instead of re-walking +## forever. Exception: a verified stale-VERSION occupant with +## `_stale_recovery_budget` rounds left keeps re-walking (each walk +## spends one round in its recovery arm), so a bridge-respawn race +## after a self-update converges instead of latching. +## 2. #647: foreign process on the HTTP or WS port -> FOREIGN_PORT with +## an actionable message (we can't read the child's "port already in +## use" stderr). Checked before the --refresh retry: respawning +## against an occupied port can only fail the same way. +## 3. #172: stale uvx index -> one `--refresh` respawn. +## 4. Otherwise -> CRASHED, pointing at the Godot output log. +func _diagnose_spawn_fast_exit(elapsed: int) -> void: + _log_spawn_exit_forensics() + var live: Dictionary = _host._probe_live_server_status_for_port( + ClientConfigurator.http_port() + ) + if _live_status_identifies_godot_ai(live): + ## Stale-version occupant with authorized recovery rounds left: allow + ## another re-adopt walk even after the #805 one-shot is spent. This is + ## the attach-bridge respawn race — a bridge pinned to the previous + ## version respawns its cached backend the instant the old server is + ## killed, and can beat our (possibly cold) spawn to the bind. Each + ## extra walk spends one `_stale_recovery_budget` round in its recovery + ## arm, so this stays bounded; the #805 flapping diagnosis below still + ## latches for same-version/unverified occupants and once the budget is + ## exhausted. + var stale_retry := _stale_recovery_available( + str(_host._verified_status_version(live)), _expected_server_version() + ) + if not _readopt_after_spawn_exit_retried or stale_retry: + if _readopt_after_spawn_exit_retried: + ## Second and later rounds ride the stale budget — spend HERE, + ## not only in the walk's recovery arm: an occupant that flaps + ## out of existence before each walk's probe (the #805 shape) + ## would otherwise re-walk without ever spending, and the + ## terminal latch below would never be reached. + _stale_recovery_budget -= 1 + _readopt_after_spawn_exit_retried = true + _readopt_walk_pending = true + _host._log_buffer.log( + "server exited after %dms but a live godot-ai server answers on port %d — re-running adoption" + % [elapsed, ClientConfigurator.http_port()] + ) + _host._stop_server_watch() + _server_pid = -1 + ## Clear the spawn guard so the re-walk isn't GUARDED away. The + ## walk's adopt arm re-sets it and fixes the stale token/record + ## (external adoption drops both; managed adoption re-records). + _host._server_started_this_session = false + ## Fire-and-forget (mirrors force_restart_server): the walk is a + ## coroutine in production; its continuation lives on the manager. + start_server() + return + ## #805: the re-adopt budget is spent and a live godot-ai still + ## answers while our spawns keep dying — a flapping occupant + ## (another editor's server starting/stopping under it). Re-walking + ## or respawning can only repeat the cycle; latch a terminal + ## diagnosis that names the actual conflict. Reload Plugin (a fresh + ## walk) refreshes the budget for a deliberate retry. + _server_exit_ms = elapsed + _server_status_message = ( + "The spawned server keeps exiting while another godot-ai server " + + "answers on port %d, and re-adoption was already attempted. " + + "Another editor may be repeatedly starting/stopping a server on " + + "this port. Stop the other process or pick a different port, " + + "then click Reload Plugin." + ) % ClientConfigurator.http_port() + set_terminal_diagnosis(McpServerStateScript.CRASHED) + disarm_version_check() + _host._update_process_enabled() + _host._log_buffer.log(str(_server_status_message)) + push_warning("MCP | %s" % _server_status_message) + _host._stop_server_watch() + return + var conflict := _diagnose_spawn_port_conflict(live) + if not conflict.is_empty(): + _server_exit_ms = elapsed + _server_status_message = str(conflict.get("message", "")) + _conflict_port = int(conflict.get("port", 0)) + set_terminal_diagnosis(McpServerStateScript.FOREIGN_PORT) + disarm_version_check() + _host._update_process_enabled() + _host._log_buffer.log(str(_server_status_message)) + push_warning("MCP | %s" % _server_status_message) + _host._stop_server_watch() + return + if bool(_host._should_retry_with_refresh()): + _refresh_retried = true + respawn_with_refresh() + return + _server_exit_ms = elapsed + ## Generic crash: clear any stale per-state message so the dock's + ## CRASHED body falls back to its launch-mode copy instead of text + ## from an earlier diagnosis. + _server_status_message = "" + set_terminal_diagnosis(McpServerStateScript.CRASHED) + disarm_version_check() + _host._update_process_enabled() + _host._log_buffer.log("server exited after %dms — see Godot output log" % int(_server_exit_ms)) + _host._stop_server_watch() + + +## #647: post-crash port-conflict probe. Returns `{}` when no foreign +## conflict is detected (fall through to the CRASHED / retry path), or +## `{"message": String, "port": int}` when the HTTP or WS port is held by +## a process we can't identify as godot-ai. An occupant that *does* +## identify as godot-ai is deliberately not diagnosed here — that's the +## stale-server / adoption territory handled by `_diagnose_spawn_fast_exit`'s +## re-adopt arm (or the next `start_server` walk), not a foreign conflict. +## `pre_probed_live`: an HTTP status snapshot the caller already has on +## hand; non-empty skips the internal ~500ms probe (the probe helper never +## returns a bare `{}`, so the sentinel is unambiguous). +func _diagnose_spawn_port_conflict(pre_probed_live: Dictionary = {}) -> Dictionary: + var http_port := ClientConfigurator.http_port() + if bool(_host._is_port_in_use(http_port)): + var live: Dictionary = ( + pre_probed_live + if not pre_probed_live.is_empty() + else _host._probe_live_server_status_for_port(http_port) + ) + if _live_status_identifies_godot_ai(live): + return {} + return { + "message": ( + "Port %d is in use by another application. Stop it or change " + + "the port in Editor Settings (godot_ai/http_port)." + ) % http_port, + "port": http_port, + } + var ws_port := int(_host._resolved_ws_port) + if ws_port > 0 and bool(_host._is_port_in_use(ws_port)): + return { + "message": ( + "WebSocket port %d is in use by another application. Stop it " + + "or change the port in Editor Settings (godot_ai/ws_port)." + ) % ws_port, + "port": ws_port, + } + return {} + + +## Retry the spawn with uvx `--refresh` prepended (PyPI index can lag a +## fresh publish ~10 min — #172). One-shot per session via _refresh_retried. +func respawn_with_refresh() -> void: + _host._startup_trace_count("server_command_discovery") + var server_cmd := ClientConfigurator.get_server_command(true) + if server_cmd.is_empty(): + return + var cmd: String = server_cmd[0] + var args: Array[String] = [] + args.assign(server_cmd.slice(1)) + args.append_array(_host._build_server_flags(ClientConfigurator.http_port(), int(_host._resolved_ws_port))) + _host._clear_pid_file() + _host._log_buffer.log("retrying with --refresh (PyPI index may be stale)") + var injected_telemetry_env := _inject_telemetry_env() + ## Set owner PID for THIS spawn too (don't rely on it lingering from + ## start_server) — and unset right after, same scoping as start_server. + var owner_env_set := _set_owner_pid_env() + _set_plugin_spawned_env() + var keep_alive_env_set := _set_keep_alive_env() + var ws_token := _set_ws_token_env() + _server_pid = OS.create_process(cmd, args) + if owner_env_set: + OS.unset_environment("GODOT_AI_OWNER_PID") + OS.unset_environment("GODOT_AI_PLUGIN_SPAWNED") + if keep_alive_env_set: + OS.unset_environment("GODOT_AI_NO_IDLE_EXIT") + OS.unset_environment("GODOT_AI_WS_TOKEN") + if injected_telemetry_env: + OS.unset_environment("GODOT_AI_DISABLE_TELEMETRY") + var spawn_pid := int(_server_pid) + if spawn_pid > 0: + _server_spawn_ms = Time.get_ticks_msec() + _server_exit_ms = 0 + _server_pid_published_elapsed_ms = 0 + _spawn_dead_since_ms = 0 + _server_keep_alive = keep_alive_env_set + var current_version := _expected_server_version() + _host._set_ws_auth_token(ws_token) + _host._write_managed_server_record(spawn_pid, current_version, _server_keep_alive) + print("MCP | retried server (PID %d, v%s): %s %s" % [spawn_pid, current_version, cmd, " ".join(args)]) + else: + ## OS.create_process returned -1 on the retry — surface CRASHED + ## rather than loop. `_refresh_retried` is already true. + _server_status_message = "" + set_terminal_diagnosis(McpServerStateScript.CRASHED) + disarm_version_check() + _host._update_process_enabled() + _host._log_buffer.log("refresh retry failed to spawn — see Godot output log") + _host._stop_server_watch() + + +func adopt_compatible_server( + record_version: String, + current_version: String, + owner: int, + record_owns_listener: bool = false +) -> String: + _server_actual_name = "godot-ai" + _can_recover_incompatible = false + ## #805: adoption (managed or external) is a proven recovery — the + ## session now has a live compatible server. Refresh the fast-exit + ## re-adopt budget so a later, unrelated port race can heal again. + _readopt_after_spawn_exit_retried = false + ## The stale-recovery episode (if any) is over: leftover authorized + ## rounds must not carry into a later, unrelated walk where they could + ## weak-proof-kill a server the user deliberately started. + _stale_recovery_budget = 0 + if record_version == current_version and owner > 0 and record_owns_listener: + ## Managed adoption keeps the record's token (loaded into + ## _ws_auth_token at plugin startup) — the running server was + ## spawned with it and still verifies against it (#690). Version + ## equality alone is deliberately insufficient: the record must also + ## identify the live branded listener (#759/#764). + _server_pid = owner + ## Recover the keep-alive launch flag from the record the spawning + ## session persisted — a keep-alive survivor adopted here must + ## detach again on THIS session's exit, and only the record knows + ## how the process was actually launched. + _server_keep_alive = bool(_host._read_managed_server_record().get("keep_alive", false)) + _host._write_managed_server_record(owner, current_version, _server_keep_alive) + return McpAdoptionLabelScript.MANAGED + _server_pid = -1 + _server_keep_alive = false + ## External server: we didn't spawn it and don't know its token (it + ## most likely has none — dev servers aren't launched with one). Drop + ## ours so the handshake omits the field instead of sending a stale + ## token the server would reject. + _host._set_ws_auth_token("") + _host._clear_managed_server_record() + _host._clear_pid_file() + return McpAdoptionLabelScript.EXTERNAL + + +static func _compatible_adoption_log_message( + owner_label: String, + owned_pid: int, + observed_owner_pid: int, + live_version: String, + live_ws_port: int, + current_version: String +) -> String: + if owner_label == McpAdoptionLabelScript.MANAGED: + return "MCP | adopted managed server (PID %d, live v%s, WS %d, plugin v%s)" % [ + owned_pid, + live_version, + live_ws_port, + current_version + ] + return "MCP | adopted external server owner_pid=%d (live v%s, WS %d, plugin v%s)" % [ + observed_owner_pid, + live_version, + live_ws_port, + current_version + ] + + +## Single-owner recovery transaction for the contended startup walk. Strong +## ownership proof gets first refusal; only a user-authorized, verified version +## drift may fall back to weak proof. Keeping the flag across both awaits is +## what lets the WS handshake path coalesce instead of cancelling this walk. +func _recover_startup_port_occupant( + port: int, + live: Dictionary, + live_version: String, + current_version: String, + async_gen: int, +) -> bool: + var owns_recovery := not _recovery_in_flight + var is_owned_startup := ( + _recovery_in_flight and async_gen == _recovery_owned_startup_generation + ) + if not owns_recovery and not is_owned_startup: + return false + if owns_recovery: + _recovery_in_flight = true + ## Forward `live` so the strong proof helper reuses our snapshot. The kill + ## invalidates it; every later consumer re-probes before using live status. + var recovered: bool = await recover_strong_port_occupant(port, 3.0, live) + if not _async_stale(async_gen) and not recovered and _stale_recovery_available( + live_version, current_version + ): + _stale_recovery_budget -= 1 + print( + "MCP | stale godot-ai v%s holds port %d — replacing it (update/recovery authorized, %d retry round(s) left)" + % [live_version, port, _stale_recovery_budget] + ) + recovered = await _recover_stale_port_occupant_impl(port, 3.0) + ## A nested recovery-owned startup must leave the outer transaction armed; + ## only the path that acquired ownership here may release it. + if owns_recovery: + _recovery_in_flight = false + return recovered + + +## `pre_kill_live` is forwarded into the proof helper so it doesn't +## re-probe a port the caller already probed. The kill invalidates the +## snapshot — callers MUST re-probe before consuming live-status data +## after this returns. +## +## #678: coroutine in production — the proof evaluation (port scrapes + +## per-PID brand shells) and the kill + port-drain wait run off the main +## thread. The EditorSettings record is read on the main thread up front +## and injected into the proof helper; record/pid-file clears stay on the +## main thread after the awaits. +func recover_strong_port_occupant(port: int, wait_s: float, pre_kill_live: Dictionary = {}) -> bool: + var async_gen := _async_generation + var record: Dictionary = _host._read_managed_server_record() + var proof_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {"proof": "", "pids": []} + return _host._evaluate_strong_port_occupant_proof(port, pre_kill_live, record) + ) + if _async_stale(async_gen) or proof_result == null: + return false + var proof: Dictionary = proof_result + var targets: Array[int] = [] + targets.assign(proof.get("pids", [])) + if targets.is_empty(): + return false + + print("MCP | strong proof: %s" % str(proof.get("proof", ""))) + var freed_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return false + ## verify_brand=true: the proof above ran in a separate _run_blocking + ## task with main-thread frames in between — re-check each target at + ## kill time so a PID recycled inside that gap isn't killed (#686). + var killed: Array = _host._kill_processes_and_windows_spawn_children(targets, true) + if not killed.is_empty(): + print("MCP | killed pids %s on port %d" % [str(killed), port]) + _host._wait_for_port_free(port, wait_s) + return not bool(_host._is_port_in_use(port)) + ) + if _async_stale(async_gen) or freed_result == null: + return false + if not bool(freed_result): + return false + + _host._clear_managed_server_record() + _host._clear_pid_file() + return true + + +## Weak-proof sibling of `recover_strong_port_occupant`, reserved for the +## bounded stale-version episode (`_stale_recovery_budget` — callers gate on +## `_stale_recovery_available` and spend a round BEFORE calling). Uses the +## recovery-tier proof (`status_name` allowed) because the target is an +## external previous-version server with no managed record or pid-file to +## prove strong ownership with — the same authority the dock's recovery +## click exercises, here spent under an equally explicit user action (the +## Update click / a recovery click's retry). The kill still brand-verifies +## every PID at kill time (#686), so a recycled or unrelated PID on the +## port is never killed. No pre-probed `live` parameter on purpose: a prior +## failed strong recovery may have partially changed the port's state, so +## the worker re-probes — and re-verifies STALENESS on that fresh snapshot +## (#890 CodeRabbit): the caller's version gate ran on an earlier probe, +## and a same-version server that took the port in the interval must abort +## this recovery, not be killed by it. +func recover_stale_port_occupant(port: int, wait_s: float) -> bool: + if _recovery_in_flight: + return false + _recovery_in_flight = true + var recovered := await _recover_stale_port_occupant_impl(port, wait_s) + _recovery_in_flight = false + return recovered + + +func _recover_stale_port_occupant_impl(port: int, wait_s: float) -> bool: + var async_gen := _async_generation + var record: Dictionary = _host._read_managed_server_record() + ## Resolved on the main thread: the worker must not touch EditorSettings. + var expected_version := _expected_server_version() + var proof_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {"proof": "", "pids": []} + var live: Dictionary = _host._probe_live_server_status_for_port(port) + var live_version := str(_host._verified_status_version(live)) + if live_version.is_empty() or live_version == expected_version: + return {"proof": "", "pids": []} + return _host._evaluate_recovery_port_occupant_proof(port, live, record) + ) + if _async_stale(async_gen) or proof_result == null: + return false + var proof: Dictionary = proof_result + var targets: Array[int] = [] + targets.assign(proof.get("pids", [])) + if targets.is_empty(): + return false + + print("MCP | stale-occupant proof: %s" % str(proof.get("proof", ""))) + var freed_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return false + ## Warm the current-version uv env in parallel with the kill + port + ## drain below (#890 review P1): on the release that first ships this + ## code the OLD updater ran the update, so no click-time pre-warm + ## happened and the respawn would resolve cold — exactly the race + ## this episode exists to win. Detached fire-and-forget via the host + ## seam (stubbed in tests); worker-safe (CliFinder is mutex-guarded, + ## no EditorSettings access). + _host._prewarm_server_package(expected_version) + var killed: Array = _host._kill_processes_and_windows_spawn_children(targets, true) + if not killed.is_empty(): + print("MCP | killed pids %s on port %d" % [str(killed), port]) + _host._wait_for_port_free(port, wait_s) + return not bool(_host._is_port_in_use(port)) + ) + if _async_stale(async_gen) or freed_result == null: + return false + if not bool(freed_result): + return false + + _host._clear_managed_server_record() + _host._clear_pid_file() + return true + + +## Editor-exit teardown chooser (#800): detach only when the RUNNING +## server was launched keep-alive (_server_keep_alive, set at spawn / +## recovered on adoption) — never on the live setting, which may have +## been toggled after spawn. Flag clear → stop_server kills as always, +## so enabling the setting mid-session takes effect on the next server +## start instead of leaving a record that points at a soon-reaped PID. +func teardown_for_editor_exit() -> void: + if _server_keep_alive: + detach_server() + return + ## #824: a backend we spawned may be keeping one or more MCP clients alive + ## through their `godot-ai attach` bridges. Killing it because *this* editor + ## is closing takes the server out from under them: an in-flight call can + ## become TRANSPORT_OUTCOME_UNKNOWN, and every bridge has to establish a new + ## backend before the next editor can reconnect. A live lease means the + ## backend has consumers beyond this editor, so hand it over instead. + var leased := active_lease_count_at_exit() + if leased > 0: + ## Give up kill authority along with the process: dropping the managed + ## record means the next editor adopts it through the external branch + ## rather than as a managed server it may kill. The server's own + ## pid-file is deliberately left in place — it is the backend's + ## publication, not our claim on it, and adoption reads it. + ## + ## The Python side remains the reaper of record: a plugin-spawned + ## backend keeps its idle backstop armed (only keep_server_on_exit + ## disarms it) and that backstop is lease-aware, so this defers the + ## stop to "no editors AND no leases AND grace elapsed" rather than + ## leaking the process. + _host._clear_managed_server_record() + detach_server( + "detaching server: %d attach lease(s) still held, leaving it to the " + % leased + + "server's own idle reaper" + ) + return + stop_server() + + +## Active attach-bridge leases on the backend this editor manages, or 0 when +## there is nothing to consult (#824). +## +## Returns 0 — preserving the historical kill-on-exit behavior — for every +## uncertain case: no managed PID, a probe that fails or times out, a server +## that does not identify as godot-ai, or one too old to publish the field. +## That direction is deliberate. A false 0 costs what today already costs +## (the backend is stopped and bridges reconnect); a false positive would +## leave a process running on a guess. +## +## Bounded by the status probe's own timeout (SERVER_STATUS_PROBE_TIMEOUT_MS), +## which is what keeps editor exit from hanging on a wedged HTTP server. +func active_lease_count_at_exit() -> int: + var pid := int(_server_pid) + if pid <= 0: + return 0 + ## Only a process we can still prove is our godot-ai server earns the + ## benefit of the doubt. The lease count comes from whoever answers on the + ## port, which is not by itself proof that it IS the process we are about + ## to stop — another editor's backend, or an attach-owned one, could hold + ## the port after ours died. Requiring the same alive+branded proof + ## `stop_server` uses before its kill closes that gap: without it, a + ## stranger's leases could talk this editor out of stopping its own server. + ## + ## Failing this check is harmless either way. A dead PID has nothing to + ## kill, and a recycled-but-unbranded PID is rejected by stop_server's own + ## gate (#686) — both land on the historical path. + if not _host._pid_alive_for_proof(pid): + return 0 + if not _host._pid_cmdline_is_godot_ai_for_proof(pid): + return 0 + return active_lease_count( + _host._probe_live_server_status_for_port(ClientConfigurator.http_port()) + ) + + +## Read the advisory lease count out of a `/godot-ai/status` payload. +## +## Gated on the payload identifying as godot-ai, so an unrelated process +## answering on the port cannot talk this editor out of a clean stop. A +## missing field means an older backend that predates #824; it reads as 0, +## which keeps that pairing on today's behavior. +static func active_lease_count(live: Dictionary) -> int: + if not _live_status_identifies_godot_ai(live): + return 0 + var raw: Variant = live.get("active_lease_count") + if raw == null: + return 0 + return maxi(0, int(raw)) + + +## keep_server_on_exit (#800): editor teardown that leaves the server +## running. Mirrors stop_server's bookkeeping — cancel in-flight async +## startup, stop the watch, settle on STOPPED — but kills nothing and +## PRESERVES the managed-server record + pid-file, so the next editor +## session's start_server walk adopts the survivor through the existing +## record-matches branch (#758/#774). Explicit stops (dock Restart, +## update reload) still route through stop_server and kill as before. +## `log_reason` names why the server is being left alive; the default is the +## keep_server_on_exit wording this function was written for. #824 reuses the +## same bookkeeping for the active-lease handover, and a shared log line would +## have reported the wrong cause for it. +func detach_server( + log_reason: String = "keep_server_on_exit: leaving server running" +) -> void: + _invalidate_async_startup() + _host._stop_server_watch() + var detached_pid := int(_server_pid) + _server_pid = -1 + _server_pid_published_elapsed_ms = 0 + transition_state(McpServerStateScript.STOPPED) + if detached_pid > 0: + print("MCP | %s (PID %d)" % [log_reason, detached_pid]) + + +func stop_server() -> void: + ## Cancel any in-flight async startup (#678): a suspended start_server + ## resuming after teardown must not resurrect state or spawn a server. + _invalidate_async_startup() + _host._stop_server_watch() + if int(_server_pid) <= 0: + transition_state(McpServerStateScript.STOPPED) + return + transition_state(McpServerStateScript.STOPPING) + ## Kill the tracked PID AND the real Python PID — they differ for the + ## uvx tier (the launcher exits before its child) and on Windows + ## `OS.kill` is `TerminateProcess` which doesn't walk the child tree. + var port := ClientConfigurator.http_port() + var killed: Array = [] + var candidates: Array[int] = [] + ## Re-verify the tracked PID at kill time (#686): nothing clears + ## `_server_pid` when the server dies mid-session (`check_server_health` + ## stops watching after SERVER_WATCH_MS), so hours later the kernel may + ## have recycled this PID to an unrelated process. Every other candidate + ## in this function is brand-gated; the tracked seed must be too. A false + ## negative is fail-safe: the port stays held and the record is preserved, + ## so the next start_server's drift branch retries the kill. + var tracked_pid := int(_server_pid) + if ( + tracked_pid > 0 + and _host._pid_alive_for_proof(tracked_pid) + and _host._pid_cmdline_is_godot_ai_for_proof(tracked_pid) + ): + candidates.append(tracked_pid) + var real_pid := int(_host._find_managed_pid(port)) + ## Add the real Python PID only if it isn't already tracked and proves out + ## as ours — re-appending an already-present PID just produces a duplicate + ## kill candidate. + if real_pid > 0 and not candidates.has(real_pid) and _host._pid_cmdline_is_godot_ai_for_proof(real_pid): + candidates.append(real_pid) + var listener_pids: Array = _host._find_all_pids_on_port(port) + for pid in listener_pids: + var listener_pid := int(pid) + if candidates.has(listener_pid): + continue + if _host._pid_cmdline_is_godot_ai_for_proof(listener_pid): + candidates.append(listener_pid) + killed = _host._kill_processes_and_windows_spawn_children(candidates) + if not killed.is_empty(): + print("MCP | stopped server (PID %s)" % str(killed)) + _server_pid = -1 + _server_keep_alive = false + _server_pid_published_elapsed_ms = 0 + _host._wait_for_port_free(port, 2.0) + ## Preserve record/pid-file when port is still held — the drift + ## branch on the next start_server retries the kill (#159 follow-up). + _host._finalize_stop_if_port_free(port) + transition_state(McpServerStateScript.STOPPED) + + ## Server's `_pydantic_core.pyd` hard-link is now released — sweep + ## stale uvx builds before they trip the next attach launcher. + UvCacheCleanup.purge_stale_builds() + + +## Kill the server, reset the re-entrancy guard so the re-enabled plugin +## spawns fresh (#132). User-mode only kills via strong proof. +func prepare_for_update_reload() -> void: + stop_server() + _host._server_started_this_session = false + if ClientConfigurator.is_dev_checkout(): + return + + var port := ClientConfigurator.http_port() + if not bool(_host._is_port_in_use(port)): + return + + var proof: Dictionary = _host._evaluate_strong_port_occupant_proof(port) + var targets: Array[int] = [] + targets.assign(proof.get("pids", [])) + if targets.is_empty(): + return + + _host._kill_processes_and_windows_spawn_children(targets) + _host._wait_for_port_free(port, 3.0) + if not bool(_host._is_port_in_use(port)): + _host._clear_managed_server_record() + _host._clear_pid_file() + + +# ---- Recovery click ---------------------------------------------------- + +## Returns true when a pure-state probe says recovery is allowed: +## current state is INCOMPATIBLE, the port is still held, and the +## incompatible diagnosis latched an ownership proof. Pure-state in the +## sense that nothing is killed — that's `recover_incompatible_server`. +## +## Consults the `_can_recover_incompatible` verdict that +## `_set_incompatible_server` computed off-thread instead of re-running +## the proof's port scrapes + per-PID brand shells on the main thread +## (#712): the dock polls this on refresh, and +## `recover_incompatible_server` re-proves at kill time anyway, so a +## stale latch can never kill an unproven occupant — worst case is a +## recovery click that comes back false. The port liveness re-check is +## a single local bind probe, cheap enough to stay synchronous. +func can_recover_incompatible_server() -> bool: + if _server_state != McpServerStateScript.INCOMPATIBLE: + return false + if not _can_recover_incompatible: + return false + return bool(_host._is_port_in_use(ClientConfigurator.http_port())) + + +func recover_incompatible_server(stale_version: String = "") -> bool: + if _recovery_in_flight: + return false + _recovery_in_flight = true + var recovered := await _recover_incompatible_server_impl(stale_version) + _recovery_in_flight = false + return recovered + + +func _recover_incompatible_server_impl(stale_version: String = "") -> bool: + if _server_state != McpServerStateScript.INCOMPATIBLE: + return false + + var port := ClientConfigurator.http_port() + ## Cancel any suspended contended-port walk BEFORE the off-thread proof + ## (#712): `_run_blocking` tracks a single active worker for the + ## teardown join, so starting ours while another walk's worker is alive + ## would orphan that thread from the join guarantee. This also releases + ## the guard so the respawn at the bottom isn't silently swallowed + ## (#682 review). The user's recovery click owns the flow from here. + _invalidate_async_startup() + var async_gen := _async_generation + ## EditorSettings record read on the main thread, injected so the + ## worker never touches EditorSettings (#712, mirroring + ## recover_strong_port_occupant). + var record: Dictionary = _host._read_managed_server_record() + var proof_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return {"proof": "", "pids": []} + var live: Dictionary = {} + if not stale_version.is_empty(): + ## Automatic recovery was authorized by a handshake from this exact + ## old version. Re-probe at proof time and refuse if that occupant has + ## already been replaced; a delayed old handshake must never target the + ## freshly-started current server via its new pid-file proof. + live = _host._probe_live_server_status_for_port(port) + var current_live_version := str(_host._verified_status_version(live)) + if current_live_version != stale_version: + return {"proof": "", "pids": []} + return _host._evaluate_recovery_port_occupant_proof(port, live, record) + ) + if _async_stale(async_gen) or proof_result == null: + return false + var proof: Dictionary = proof_result + var targets: Array[int] = [] + targets.assign(proof.get("pids", [])) + if targets.is_empty(): + return false + print("MCP | proof: %s" % str(proof.get("proof", ""))) + + ## Move into STOPPING so the post-kill respawn passes the + ## first-writer-wins guards. + transition_state(McpServerStateScript.STOPPING) + ## Main-thread read for the worker below (EditorSettings-backed). + var recovery_expected_version := _expected_server_version() + var freed_result: Variant = await _run_blocking(func() -> Variant: + if not is_instance_valid(_host): + return false + ## Warm the current-version uv env in parallel with the kill + drain + ## so the respawn below wins the bind race even when no click-time + ## pre-warm ran (#890 review P1 — the transition release's update runs + ## the OLD updater). Same rationale and seam as + ## recover_stale_port_occupant. + _host._prewarm_server_package(recovery_expected_version) + ## verify_brand=true: the proof above ran in a separate + ## _run_blocking task with main-thread frames in between — re-check + ## each target at kill time so a PID recycled inside that gap isn't + ## killed (#686, mirroring recover_strong_port_occupant). + var killed: Array = _host._kill_processes_and_windows_spawn_children(targets, true) + if not killed.is_empty(): + print("MCP | killed pids %s on port %d" % [str(killed), port]) + _host._wait_for_port_free(port, 5.0) + return not bool(_host._is_port_in_use(port)) + ) + if _async_stale(async_gen) or freed_result == null: + return false + if not bool(freed_result): + ## Kill failed; re-latch INCOMPATIBLE so the dock keeps the + ## diagnostic UI. + transition_state(McpServerStateScript.INCOMPATIBLE) + return false + + UvCacheCleanup.purge_stale_builds() + _host._clear_managed_server_record() + _host._clear_pid_file() + transition_state(McpServerStateScript.STOPPED) + _connection_blocked = false + _server_status_message = "" + _conflict_port = 0 + _server_actual_version = "" + _server_actual_name = "" + _can_recover_incompatible = false + _host._server_started_this_session = false + _server_pid = -1 + _server_pid_published_elapsed_ms = 0 + ## Await the respawn walk: the plugin gates its connection unblock on + ## the post-walk state (SPAWNING/READY), so returning true while the + ## walk is still suspended would leave the connection blocked forever + ## after a successful recovery click (#682 review). + ## NOTE: arming the stale-recovery budget for the click lives in the + ## plugin wrapper (`plugin.gd::recover_incompatible_server`), NOT here — + ## the automatic handshake-mismatch trigger reuses this manager flow and + ## must only SPEND budget; re-arming inside it would unbound the + ## kill/respawn loop against a persistent bridge respawner. + ## Keep the outer transaction armed while the respawn walk runs so stale WS + ## handshakes and unrelated recovery calls still coalesce. Grant only this + ## owned startup walk permission to spend a remaining recovery round if the + ## old attach bridge reclaims the port between the kill and the respawn. + var owned_startup_gen := _async_generation + _recovery_owned_startup_generation = owned_startup_gen + await start_server() + if _recovery_owned_startup_generation == owned_startup_gen: + _recovery_owned_startup_generation = -1 + return true + + +## Restart authorisation — a live PID means we spawned/adopted, a +## non-empty managed record is the cross-session proof used by the +## drift branch. +func can_restart_managed_server() -> bool: + if _server_pid > 0: + return true + var record: Dictionary = _host._read_managed_server_record() + return not str(record.get("version", "")).is_empty() + + +func has_managed_server() -> bool: + return _server_pid > 0 + + +## Reset state for a force-restart. Drops the managed record, clears +## the pid-file, and resets the spawn guard so the follow-up +## `start_server()` walks the spawn arm. +func reset_for_force_restart() -> void: + ## The user's explicit restart takes over: cancel any suspended + ## contended-port walk and release the re-entrancy guard so the + ## follow-up start isn't silently swallowed (#682 review). + _invalidate_async_startup() + _host._clear_managed_server_record() + _host._clear_pid_file() + _host._server_started_this_session = false + _server_pid = -1 + transition_state(McpServerStateScript.UNINITIALIZED) + + +## Ownership-checked kill of the port occupant + respawn. Driven from +## the dock's "Restart Server" button when the plugin adopted a foreign +## server whose version drifted from the plugin. +func force_restart_server() -> void: + if not can_restart_managed_server(): + push_warning("MCP | refusing to kill server on port %d without managed-server ownership proof" + % ClientConfigurator.http_port()) + return + var port := ClientConfigurator.http_port() + ## Kill every LISTENER on the port, not just the first one. A dev + ## server run via `uvicorn --reload` owns port 8000 through both a + ## reloader parent AND a worker child — killing only one (or zero, + ## if the single-pid parse fell over on multi-line lsof output) leaves + ## the other holding the port past `_wait_for_port_free`'s window. + ## + ## Brand-gate each raw listener PID (#686): `can_restart_managed_server()` + ## only proves we once managed *a* server, not that the port's current + ## occupants are ours — an adopted server that exited on its own can be + ## replaced on the port by an unrelated dev tool before the user clicks + ## Restart. Unbranded PIDs fall through to `_set_incompatible_server` + ## below instead of being killed. + transition_state(McpServerStateScript.STOPPING) + var restart_targets: Array[int] = [] + for pid in _host._find_all_pids_on_port(port): + var listener_pid := int(pid) + if _host._pid_cmdline_is_godot_ai_for_proof(listener_pid): + restart_targets.append(listener_pid) + _host._kill_processes_and_windows_spawn_children(restart_targets) + _host._wait_for_port_free(port, 5.0) + if _host._is_port_in_use(port): + ## Kill failed; clean baseline for the follow-up + ## `_set_incompatible_server`. + transition_state(McpServerStateScript.UNINITIALIZED) + _set_incompatible_server( + _host._probe_live_server_status_for_port(port), + _expected_server_version(), + port + ) + return + ## Same rationale as `stop_server`: the server child python just + ## released its `pydantic_core` mapping, so this is the only window in + ## which the hard-linked copies under `builds-v0\.tmp*` are deletable. + ## Sweep before respawning so the next uvx attach build doesn't + ## inherit the same cleanup-failure path that triggered the restart. + UvCacheCleanup.purge_stale_builds() + reset_for_force_restart() + start_server() diff --git a/addons/godot_ai/utils/server_lifecycle.gd.uid b/addons/godot_ai/utils/server_lifecycle.gd.uid new file mode 100644 index 0000000..8e62667 --- /dev/null +++ b/addons/godot_ai/utils/server_lifecycle.gd.uid @@ -0,0 +1 @@ +uid://bwfx8b0w2mgf6 diff --git a/addons/godot_ai/utils/server_version_check.gd b/addons/godot_ai/utils/server_version_check.gd new file mode 100644 index 0000000..4bb1371 --- /dev/null +++ b/addons/godot_ai/utils/server_version_check.gd @@ -0,0 +1,126 @@ +@tool +class_name McpServerVersionCheck +extends RefCounted + +## Standalone polling seam for the post-connection server-version +## handshake gate. Extracted from `plugin.gd` so the lifecycle manager +## stays focused on spawn/adopt/stop and the version-verify dance has +## its own home. +## +## The seam itself does NOT transition `McpServerState` on arm/disarm — +## the version check runs concurrently with whatever spawn-state the +## caller had latched (typically FOREIGN_PORT during adoption +## confirmation, or no-op directly to READY for a fresh spawn). Result +## transitions land on the manager via `handle_server_version_verified` +## (READY / INCOMPATIBLE) or `handle_server_version_unverified` +## (INCOMPATIBLE on deadline expiry); arm() leaves the state alone so a +## FOREIGN_PORT diagnosis isn't accidentally cleared before the +## handshake actually arrives. +## +## Owns the deadline timer (`_deadline_ms`) and requires the manager to +## feed it `tick(now_msec)` from the plugin's `_process` while +## `is_active()` is true. +## +## Decoupled from the connection's signal surface: `tick()` polls +## `_connection.is_connected` and `_connection.server_version` directly. +## A same-release signal addition plus a new consumer is shape-coupled work +## for old two-phase runners; they can parse the consumer while the +## McpConnection Script object still reflects v(N). We still null-check +## `_connection` because `disarm()` releases it. + +## How long to wait after the WebSocket opens before declaring the +## handshake_ack overdue. This is the sole owner of the 5s budget +## — kept at this layer so the version-check seam is self-contained. +const TIMEOUT_MS := 5 * 1000 + +## Untyped on purpose for the same self-update field-storage reason +## plugin.gd's fields are untyped. `_connection` is the live +## `McpConnection`; `_manager` is `McpServerLifecycleManager`. +## `_connection` is null between disarm() and the next arm() — the +## seam can spend most of the plugin's life dormant and we don't want +## to pin a Node that may be queue_freed in `_exit_tree`. `_manager` is +## set once at construction and held for the seam's lifetime (the +## manager owns this instance, so the cycle is short). +var _connection +var _manager +var _active: bool = false +var _deadline_ms: int = 0 +var _expected_version: String = "" + + +func _init(manager) -> void: + _manager = manager + + +## Arm the version-check. Marks the seam active, (re)attaches the +## connection it should poll, and starts watching for +## `_connection.server_version`. Does NOT transition manager state — +## the version check runs concurrently with whatever spawn-state was +## latched (e.g. FOREIGN_PORT during adoption confirmation, READY for +## a fresh spawn). Result transitions land on the manager via +## `handle_server_version_verified` / `_unverified` once the handshake +## (or its deadline) lands. +## +## The deadline starts the moment the connection actually opens, not at +## arm-time, because uvx cold-starts can take ~30s to bind the +## WebSocket and we don't want to count that against the handshake. +func arm(connection, expected_version: String) -> void: + _active = true + _deadline_ms = 0 + _expected_version = expected_version + _connection = connection + + +## Disarm without firing a verdict. Used when the manager moves on +## (e.g. recovery click → STOPPING). Releases the connection / +## manager references so the seam doesn't pin them past the active +## window — the plugin can spend most of its life with the version +## check disarmed, and `_connection` is a Node that may be queue_free'd +## by `_exit_tree`. Caller has already transitioned state, so we don't +## touch the manager. +func disarm() -> void: + _active = false + _deadline_ms = 0 + _connection = null + + +## True while the version-check needs `_process` ticks. Plugin uses +## this to gate `set_process(true)`. +func is_active() -> bool: + return _active + + +## Per-frame tick from the plugin's `_process`. No-op when disarmed. +## Returns true when the check finished this tick (verified or +## unverified) so the plugin can re-evaluate `set_process` enable. +func tick(now_msec: int) -> bool: + if not _active: + return false + if _connection == null: + return false + if not bool(_connection.is_connected): + return false + if _deadline_ms == 0: + _deadline_ms = now_msec + TIMEOUT_MS + var server_version := str(_connection.server_version) + if not server_version.is_empty(): + _complete_with_version(server_version) + return true + if now_msec >= _deadline_ms: + _complete_unverified() + return true + return false + + +func _complete_with_version(version: String) -> void: + _active = false + _deadline_ms = 0 + if _manager != null: + _manager.handle_server_version_verified(_expected_version, version) + + +func _complete_unverified() -> void: + _active = false + _deadline_ms = 0 + if _manager != null: + _manager.handle_server_version_unverified(_expected_version) diff --git a/addons/godot_ai/utils/server_version_check.gd.uid b/addons/godot_ai/utils/server_version_check.gd.uid new file mode 100644 index 0000000..7baacfd --- /dev/null +++ b/addons/godot_ai/utils/server_version_check.gd.uid @@ -0,0 +1 @@ +uid://ciqldbuaq8i8u diff --git a/addons/godot_ai/utils/settings.gd b/addons/godot_ai/utils/settings.gd new file mode 100644 index 0000000..9ce2c68 --- /dev/null +++ b/addons/godot_ai/utils/settings.gd @@ -0,0 +1,135 @@ +@tool +class_name McpSettings +extends RefCounted + +## Shared EditorSettings key constants for the godot_ai/* namespace. +## +## Centralised here so lightweight files (e.g. telemetry.gd) can reference +## settings keys without pulling in the full client_configurator.gd dep tree. +## All keys must keep their raw string values stable across releases because +## they are persisted in the user's editor_settings-4.tres. + +const SETTING_HTTP_PORT := "godot_ai/http_port" +## Comma-separated list of tool domains excluded from the server at spawn time. +const SETTING_EXCLUDED_DOMAINS := "godot_ai/excluded_domains" +const SETTING_TELEMETRY_ENABLED := "godot_ai/telemetry_enabled" +## Comma-separated CIDRs / bare IPs passed to the server as `--allow-host` +## at spawn time (#507, server core #421). Empty means loopback-only. +const SETTING_ALLOW_HOSTS := "godot_ai/allow_remote_hosts" +## Whether MCP log lines echo to the Godot console (dock "Log" toggle). +## The dock's ring-buffer log panel keeps recording regardless. +const SETTING_MCP_LOGGING := "godot_ai/mcp_logging" +## Which scope CLI-configured clients register the server in. Claude Code's +## `--scope user` writes the global block of ~/.claude.json, which that client +## loads in EVERY workspace — so the server gets spawned in unrelated, +## non-Godot projects. `project` writes /.mcp.json instead, so the +## entry travels with the project. Defaults to `user` to preserve the +## historical behaviour for existing installs. +const SETTING_CLIENT_SCOPE := "godot_ai/mcp_client_scope" + +## Scopes accepted for SETTING_CLIENT_SCOPE. These are the values the Claude +## Code CLI's `--scope` flag takes; an unrecognised setting falls back to +## DEFAULT_CLIENT_SCOPE rather than passing junk to the CLI. +const CLIENT_SCOPES := ["user", "project", "local"] +const DEFAULT_CLIENT_SCOPE := "user" + + +## Returns true if the string value is truthy +## ("1", "true", "yes", "on", case-insensitive, whitespace-trimmed). +static func truthy(value: String) -> bool: + return value.strip_edges().to_lower() in ["1", "true", "yes", "on"] + + +## Returns true if the named environment variable is set to a truthy value. +static func env_truthy(var_name: String) -> bool: + return truthy(OS.get_environment(var_name)) + + +## #691: EditorInterface / EditorSettings are not thread-safe, and the dock +## runs Configure / Remove on a worker Thread (mcp_dock.gd +## `_run_client_action_worker` -> McpClientConfigurator -> McpCliStrategy +## `_format_args` -> client_scope()). Same contract as +## McpClientConfigurator._editor_setting_lookup: the main thread does a live +## read and refreshes the snapshot; worker threads read the snapshot only, so +## a never-warmed value reads as null (unset) rather than touching +## EditorInterface off-thread. Warmed on the main thread by +## McpClientConfigurator.warm_env_snapshot() before each worker dispatch. +## +## Kept here rather than reusing the configurator's `_editor_setting_lookup` +## so utils/settings.gd stays free of the client_configurator.gd dep tree — +## see this file's header. +static var _client_scope_snapshot: Variant = null +static var _client_scope_mutex := Mutex.new() + + +static func _client_scope_setting() -> Variant: + if OS.get_thread_caller_id() == OS.get_main_thread_id(): + var live: Variant = null + if Engine.is_editor_hint(): + var es := EditorInterface.get_editor_settings() + if es != null and es.has_setting(SETTING_CLIENT_SCOPE): + live = es.get_setting(SETTING_CLIENT_SCOPE) + _client_scope_mutex.lock() + _client_scope_snapshot = live + _client_scope_mutex.unlock() + return live + _client_scope_mutex.lock() + var cached: Variant = _client_scope_snapshot + _client_scope_mutex.unlock() + return cached + + +## Main-thread pre-warm of the scope snapshot so the dock's Configure/Remove +## worker resolves `{scope}` from a value captured while EditorSettings access +## was safe. Idempotent; called from warm_env_snapshot(). +static func warm_client_scope() -> void: + _client_scope_setting() + + +## Returns the scope CLI clients should register the MCP server in, as +## substituted into `{scope}` in a descriptor's cli_register_template / +## cli_unregister_template. Safe to call from either thread (see +## _client_scope_setting). Unrecognised values fall back to +## DEFAULT_CLIENT_SCOPE so a hand-edited editor_settings-4.tres can never make +## the plugin shell out with a bad flag. +static func client_scope() -> String: + var value: Variant = _client_scope_setting() + ## String(null) is a hard error (#850) — an unset/never-warmed key must + ## short-circuit before the cast. + if value == null: + return DEFAULT_CLIENT_SCOPE + var raw := String(value).strip_edges().to_lower() + if raw in CLIENT_SCOPES: + return raw + return DEFAULT_CLIENT_SCOPE + + +## Returns true if telemetry should be active, checking in priority order: +## 1. GODOT_AI_DISABLE_TELEMETRY / DISABLE_TELEMETRY env vars +## 2. The godot_ai/telemetry_enabled EditorSetting written by the dock UI +## Defaults to true when neither source has set a preference. +static func telemetry_enabled() -> bool: + if env_truthy("GODOT_AI_DISABLE_TELEMETRY") or env_truthy("DISABLE_TELEMETRY"): + return false + var es := EditorInterface.get_editor_settings() + if es != null and es.has_setting(SETTING_TELEMETRY_ENABLED): + return bool(es.get_setting(SETTING_TELEMETRY_ENABLED)) + return true + + +## Returns whether MCP log lines should echo to the Godot console. Read at +## plugin startup (to apply the persisted choice to the log buffer and +## dispatcher) and by the dock's LogViewer toggle for its initial state. +## Defaults to true when the user has never touched the toggle. +static func mcp_logging_enabled() -> bool: + var es := EditorInterface.get_editor_settings() + if es != null and es.has_setting(SETTING_MCP_LOGGING): + return bool(es.get_setting(SETTING_MCP_LOGGING)) + return true + + +## Persist the dock "Log" toggle so the choice survives editor restarts (#626). +static func set_mcp_logging_enabled(enabled: bool) -> void: + var es := EditorInterface.get_editor_settings() + if es != null: + es.set_setting(SETTING_MCP_LOGGING, enabled) diff --git a/addons/godot_ai/utils/settings.gd.uid b/addons/godot_ai/utils/settings.gd.uid new file mode 100644 index 0000000..b8b1547 --- /dev/null +++ b/addons/godot_ai/utils/settings.gd.uid @@ -0,0 +1 @@ +uid://pefrtofs7ijw diff --git a/addons/godot_ai/utils/structured_log_ring.gd b/addons/godot_ai/utils/structured_log_ring.gd new file mode 100644 index 0000000..3e00b4e --- /dev/null +++ b/addons/godot_ai/utils/structured_log_ring.gd @@ -0,0 +1,156 @@ +@tool +class_name McpStructuredLogRing +extends RefCounted + +## Head-indexed circular buffer of structured log entries shared by +## game_log_buffer and editor_log_buffer. +## +## Once `_max_lines` (set in subclass `_init`) is reached, new appends +## overwrite the oldest slot at `_head`, keeping append O(1) on overflow +## — the previous slice() approach reallocated the full retained array +## on every drop, which a chatty game would pay for thousands of times +## per second. +## +## Lockless. Subclasses needing thread-safety (editor_log_buffer is +## written from any thread a Godot Logger virtual can fire on) wrap each +## public method with their own Mutex around the `_*_unlocked` helpers. +## Keeping the base lockless means the hot game-side path (single thread, +## called from _process) doesn't pay an unused mutex cost. +## +## Entry shape is owned by subclasses — `_append_entry` takes a +## ready-built Dictionary so each buffer can carry the fields it needs +## (game: `source/level/text`; editor: adds `path/line/function`). + +const VALID_LEVELS := ["info", "warn", "error"] + +var _max_lines: int +var _storage: Array[Dictionary] = [] +## Next write position within `_storage`. While filling (before first +## wrap) equals `_storage.size()`; once full, points at the oldest entry +## (the one about to be overwritten). +var _head := 0 +var _dropped_count := 0 +## Monotonic number of entries appended since this ring was created. Unlike +## `_storage.size()` and `_dropped_count`, this intentionally survives clear() +## so callers can use it as a stable "next entry to read" cursor. +var _appended_total := 0 + + +func _init(max_lines: int) -> void: + _max_lines = max_lines + + +## Append `entry` to the ring, evicting the oldest slot when full. +## Subclasses build the dict with their per-source shape and pass it in. +func _append_entry(entry: Dictionary) -> void: + if _storage.size() < _max_lines: + _storage.append(entry) + _head = _storage.size() % _max_lines + else: + ## Full — overwrite oldest in place, advance head, count the drop. + _storage[_head] = entry + _head = (_head + 1) % _max_lines + _dropped_count += 1 + _appended_total += 1 + + +## Lockless slice. Subclasses with a mutex wrap their `get_range` / +## `get_recent` overrides around this; the lockless base implementations +## of those public methods just delegate here. +func _get_range_unlocked(offset: int, count: int) -> Array[Dictionary]: + var size := _storage.size() + var start := maxi(0, offset) + var stop := mini(size, start + count) + var out: Array[Dictionary] = [] + for i in range(start, stop): + out.append(_storage[_logical_to_physical(i)]) + return out + + +func get_range(offset: int, count: int) -> Array[Dictionary]: + return _get_range_unlocked(offset, count) + + +func get_recent(count: int) -> Array[Dictionary]: + var size := _storage.size() + var start := maxi(0, size - count) + return _get_range_unlocked(start, size - start) + + +## Lockless cursor read. The cursor is the next sequence to read: calling +## get_since(appended_total()) after a snapshot returns only later appends. +func _get_since_unlocked(since_seq: int, limit: int = -1) -> Dictionary: + var size := _storage.size() + var oldest_seq := _appended_total - size + var start_seq := mini(maxi(since_seq, oldest_seq), _appended_total) + var start := start_seq - oldest_seq + var available := maxi(0, size - start) + var count := available + if limit >= 0: + count = mini(available, limit) + var entries := _get_range_unlocked(start, count) + var next_cursor := start_seq + entries.size() + return { + "cursor": since_seq, + "oldest_cursor": oldest_seq, + "next_cursor": next_cursor, + "appended_total": _appended_total, + "truncated": since_seq < oldest_seq, + "has_more": next_cursor < _appended_total, + "entries": entries, + } + + +func get_since(since_seq: int, limit: int = -1) -> Dictionary: + return _get_since_unlocked(since_seq, limit) + + +## Lockless accessors. Subclasses with a mutex use these under their lock +## so the field reads stay encapsulated in the base instead of leaking +## `_storage` / `_dropped_count` reach-through into the subclass. +func _total_count_unlocked() -> int: + return _storage.size() + + +func _dropped_count_unlocked() -> int: + return _dropped_count + + +func _appended_total_unlocked() -> int: + return _appended_total + + +func total_count() -> int: + return _total_count_unlocked() + + +func dropped_count() -> int: + return _dropped_count_unlocked() + + +func appended_total() -> int: + return _appended_total_unlocked() + + +## Translate a logical index (0 = oldest retained) to a physical +## `_storage` slot. Before the first wrap, storage-order is logical- +## order. After wrapping, the oldest entry lives at `_head`. +func _logical_to_physical(logical: int) -> int: + if _storage.size() < _max_lines: + return logical + return (_head + logical) % _max_lines + + +## Reset the ring to empty. Subclasses with a mutex wrap this with their +## lock; subclasses that surface `clear` to callers (McpEditorLogBuffer) +## return the prior size from their wrapper. +func _clear_storage() -> void: + _storage.clear() + _head = 0 + _dropped_count = 0 + + +## Coerce unknown levels to "info" so a misbehaving sender can't poison +## downstream filters with arbitrary strings. +static func _coerce_level(level: String) -> String: + return level if level in VALID_LEVELS else "info" diff --git a/addons/godot_ai/utils/structured_log_ring.gd.uid b/addons/godot_ai/utils/structured_log_ring.gd.uid new file mode 100644 index 0000000..57012ba --- /dev/null +++ b/addons/godot_ai/utils/structured_log_ring.gd.uid @@ -0,0 +1 @@ +uid://c4yh3jqfn6dwe diff --git a/addons/godot_ai/utils/surfaced_error_tracker.gd b/addons/godot_ai/utils/surfaced_error_tracker.gd new file mode 100644 index 0000000..5bd3022 --- /dev/null +++ b/addons/godot_ai/utils/surfaced_error_tracker.gd @@ -0,0 +1,642 @@ +@tool +class_name McpSurfacedErrorTracker +extends RefCounted + +## Central source for "errors the agent should know exist". +## +## Editor log cursors only cover McpEditorLogBuffer. Runtime errors from the +## game subprocess can land solely in the Debugger Errors tab, so this tracker +## promotes visible Debugger-tab rows into a monotonic sequence before the +## dispatcher stamps a watermark on each response envelope. + +const MAX_PROMOTED_DEBUGGER_ENTRIES := 500 +const MAX_PROMOTED_DEBUGGER_KEYS := 5000 +const DEBUGGER_REFRESH_MIN_INTERVAL_MS := 250 +const DEBUGGER_SCAN_AFTER_STOP_MS := 5000 +## #641: delays for the self-scheduled forced scans armed on run stop (and on +## game-helper hello, via McpDebuggerPlugin). Two ticks: an early one for rows +## the remote debugger delivers right around the event, and a late one past +## Godot's per-frame Errors-tab insertion throttle for error floods. +const DEFERRED_SCAN_DELAYS_SEC: Array[float] = [1.0, 5.0] +## #635: cap on accounted per-key row-time signatures. The live Errors tab is +## itself bounded, so this only guards a pathological flood of same-keyed rows +## with distinct time texts; past the cap the set resets to the current scan. +const MAX_ACCOUNTED_ROW_TIMES_PER_KEY := 512 + +var _editor_log_buffer +var _game_log_buffer +var _debugger_errors_root: Node +var _debugger_search_root_cache: Node +var _promoted_debugger_keys: Dictionary = {} +## #635: per-key set of Errors-tab row time texts already promoted, so a row +## observed after a clear+repopulate that no scan saw as empty still counts as +## new (see the re-promotion comment in refresh_debugger_errors). +var _promoted_debugger_row_times: Dictionary = {} +var _promoted_debugger_key_order: Array[String] = [] +var _promoted_debugger_entries: Array[Dictionary] = [] +var _debugger_promoted_total := 0 +var _run_seq := 0 +var _oldest_retained_debugger_sequence := 1 +var _last_debugger_refresh_msec := -DEBUGGER_REFRESH_MIN_INTERVAL_MS +var _debugger_scan_active := false +var _debugger_scan_until_msec := 0 +var _deferred_scans_scheduled_total := 0 + + +func _init(editor_log_buffer = null, game_log_buffer = null, debugger_errors_root: Node = null) -> void: + _editor_log_buffer = editor_log_buffer + _game_log_buffer = game_log_buffer + _debugger_errors_root = debugger_errors_root + + +func note_game_run_started(sticky_scan: bool = true) -> void: + _run_seq += 1 + _debugger_scan_active = sticky_scan + _debugger_scan_until_msec = 0 + if not sticky_scan: + _debugger_scan_until_msec = Time.get_ticks_msec() + DEBUGGER_SCAN_AFTER_STOP_MS + refresh_debugger_errors(true) + + +func note_game_run_stopped() -> void: + _debugger_scan_active = false + _debugger_scan_until_msec = Time.get_ticks_msec() + DEBUGGER_SCAN_AFTER_STOP_MS + schedule_deferred_scans() + + +## #641: promotion into the watermark used to depend on a tool call arriving +## while the scan gate was open (run active, or within DEBUGGER_SCAN_AFTER_STOP_MS +## of stop). Boot parse errors that landed in the Errors tab with no tool call +## in that window were never promoted, so the agent never got the +## new_errors_since_last_call hint. These editor-side timers force a scan +## regardless of tool-call cadence; the next stamped response then carries the +## already-promoted count even after the gate closes. Scans are content-keyed +## and idempotent, so a timer firing after an unrelated new run is harmless. +func schedule_deferred_scans(delays: Array = DEFERRED_SCAN_DELAYS_SEC) -> void: + var tree := Engine.get_main_loop() as SceneTree + if tree == null: + return + for delay in delays: + var timer := tree.create_timer(maxf(0.05, float(delay))) + timer.timeout.connect(_on_deferred_scan_timeout) + _deferred_scans_scheduled_total += 1 + + +func deferred_scans_scheduled_total() -> int: + return _deferred_scans_scheduled_total + + +func _on_deferred_scan_timeout() -> void: + refresh_debugger_errors(true) + + +func refresh_debugger_errors(force: bool = true) -> void: + var now := Time.get_ticks_msec() + if not force and not _should_scan_debugger_for_cached_watermark(now): + return + _last_debugger_refresh_msec = now + var current_by_key: Dictionary = {} + for entry in _raw_debugger_error_entries(): + if str(entry.get("level", "")) != "error": + continue + var key := _log_entry_key(entry) + var info: Dictionary = current_by_key.get(key, {"count": 0, "entry": entry, "times": {}}) + info["count"] = int(info.get("count", 0)) + 1 + var time_text := _row_time_text(entry) + if not time_text.is_empty(): + (info["times"] as Dictionary)[time_text] = true + current_by_key[key] = info + for key in _promoted_debugger_keys.keys(): + if not current_by_key.has(key): + _promoted_debugger_keys[key] = 0 + for key in current_by_key.keys(): + var info: Dictionary = current_by_key[key] + var current := int(info.get("count", 0)) + var stored := int(_promoted_debugger_keys.get(key, 0)) + ## #635: a count increase alone misses rows observed after a run + ## boundary. Godot clears the Errors tab at run start; when the new run + ## re-fires an error identical to one promoted before the clear, and no + ## scan happened to observe the tab empty in between, the per-key count + ## never dips — so the row kept its pre-run sequence and run-scoping + ## (editor_entries_since against the run-start cursor) misclassified an + ## in-run error as retained_recent. Each Errors-tab row carries its own + ## time text; an unaccounted (key, time) signature is a row we have not + ## promoted yet, so it earns a fresh sequence even at an equal or lower + ## count. Boundary condition: rows with an empty time text, or a + ## repopulated row whose time text is byte-identical to a pre-clear row, + ## fall back to count-only dedup and can still be missed. + var unseen_times := _unaccounted_row_times(key, info.get("times", {})) + var delta := current - stored + if delta <= 0 and not unseen_times.is_empty(): + delta = mini(unseen_times.size(), current) + if delta <= 0: + if current != stored: + _promoted_debugger_keys[key] = current + continue + if not _promoted_debugger_keys.has(key): + _promoted_debugger_key_order.append(key) + _promoted_debugger_keys[key] = current + _account_row_times(key, info.get("times", {})) + _debugger_promoted_total += delta + var source_entry: Dictionary = info.get("entry", {}) + var promoted := source_entry.duplicate(true) + promoted["_debugger_key"] = key + promoted["_debugger_occurrences"] = current + promoted["_debugger_sequence"] = _debugger_promoted_total + _remove_promoted_debugger_entry(key) + _promoted_debugger_entries.append(promoted) + _trim_promoted_debugger_entries() + _trim_promoted_debugger_key_counts() + + +## #645: promote an error record that has no Errors-tab row to scrape — e.g. a +## boot-time parse error that parked the game in a remote-debugger break before +## any surface got a record. The entry joins the same promoted sequence as +## scraped Debugger rows, so run-scoping (editor_entries_since), the retained +## fallback, and the response watermark all see it with no extra plumbing. +## Re-recording the same key later (the same script still broken on the next +## run) re-promotes it with a fresh sequence, mirroring how re-appearing +## Errors-tab rows behave; scan reconciliation zeroes the key's count once the +## break ends since the row never exists in the live tab. +func record_synthetic_error(entry: Dictionary) -> void: + var key := _log_entry_key(entry) + var occurrences := int(_promoted_debugger_keys.get(key, 0)) + 1 + if not _promoted_debugger_keys.has(key): + _promoted_debugger_key_order.append(key) + _promoted_debugger_keys[key] = occurrences + _debugger_promoted_total += 1 + var promoted := entry.duplicate(true) + promoted["_debugger_key"] = key + promoted["_debugger_occurrences"] = occurrences + promoted["_debugger_sequence"] = _debugger_promoted_total + promoted["_debugger_synthetic"] = true + _remove_promoted_debugger_entry(key) + _promoted_debugger_entries.append(promoted) + _trim_promoted_debugger_entries() + _trim_promoted_debugger_key_counts() + + +## Monotonicity contract (#767): run_seq and the session-scoped components +## (editor_ring, debugger_promoted, editor_ring_warn) must NEVER decrease +## within an editor session, and the per-run components (game_error_warn, +## game_warn) must never decrease within a run — they may reset only when +## run_seq increments in the same stamp (the run boundary that rotates the +## game buffer's counters). Released servers diff consecutive stamps +## (websocket.py::_sync_error_watermark_for_session) and treat any other +## decrease as a counter reset, counting the FULL current value as new — one +## dip makes every old server out there over-report errors. Any future +## hold/classification feature must therefore DEFER an increment until its +## entry is released, never subtract an already-stamped one: a stamp like +## `raw_total - currently_held_entries` is exactly the regression this +## guards against. Producer-side coverage: +## test_editor.gd::test_surfaced_error_tracker_watermark_components_never_decrease. +func watermark(force_debugger_scan: bool = false) -> Dictionary: + refresh_debugger_errors(force_debugger_scan) + return { + "run_seq": _run_seq, + "editor_ring": _error_appended_total(), + "debugger_promoted": _debugger_promoted_total, + ## Historically misnamed: carries game-process ERROR counts only. + "game_error_warn": _game_error_total(), + ## Warn-level components, parallel to the error counts above. The server + ## diffs these into `new_warnings_since_last_call` so a warning-only run + ## surfaces instead of reading as clean. Debugger Errors-tab warning rows + ## are not promoted here yet (buffers cover push_warning from the game and + ## editor parse/@tool warnings) — tracked as a follow-up. + "editor_ring_warn": _warn_appended_total(), + "game_warn": _game_warn_total(), + } + + +static func stamp_watermark(response: Dictionary, tracker) -> void: + if tracker == null: + return + if not tracker.has_method("watermark"): + return + response["error_watermark"] = tracker.watermark() + + +func debugger_promoted_total(force_debugger_scan: bool = true) -> int: + refresh_debugger_errors(force_debugger_scan) + return _debugger_promoted_total + + +func collect_editor_log_entries() -> Array[Dictionary]: + refresh_debugger_errors(true) + var entries: Array[Dictionary] = [] + var seen_keys: Dictionary = {} + if _editor_log_buffer != null: + for entry in _editor_log_buffer.get_range(0, _editor_log_buffer.total_count()): + seen_keys[_log_entry_key(entry)] = true + entries.append(entry) + for entry in read_debugger_error_entries(): + var key := _log_entry_key(entry) + if seen_keys.has(key): + continue + seen_keys[key] = true + entries.append(entry) + ## #645: synthesized break records have no live Errors-tab row to scrape — + ## merge them from the promoted list so logs_read(source="editor") shows + ## the record that run/game responses point at. + for entry in _promoted_debugger_entries: + if not bool(entry.get("_debugger_synthetic", false)): + continue + var key := _log_entry_key(entry) + if seen_keys.has(key): + continue + seen_keys[key] = true + entries.append(_strip_promotion_bookkeeping(entry)) + return entries + + +static func _strip_promotion_bookkeeping(entry: Dictionary) -> Dictionary: + var clean := entry.duplicate(true) + for key in ["_debugger_key", "_debugger_occurrences", "_debugger_sequence", "_debugger_synthetic"]: + clean.erase(key) + return clean + + +func editor_entries_since(editor_cursor: int, debugger_cursor: int, force_debugger_scan: bool = true) -> Dictionary: + refresh_debugger_errors(force_debugger_scan) + var entries: Array[Dictionary] = [] + var seen_keys: Dictionary = {} + var truncated := false + if _editor_log_buffer != null: + var captured: Dictionary = _editor_log_buffer.get_since(maxi(0, editor_cursor), -1) + truncated = bool(captured.get("truncated", false)) + for entry in captured.get("entries", []): + seen_keys[_log_entry_key(entry)] = true + entries.append(entry) + if debugger_cursor < _oldest_retained_debugger_sequence - 1: + truncated = true + for entry in _promoted_debugger_entries: + if int(entry.get("_debugger_sequence", 0)) <= debugger_cursor: + continue + var key := _log_entry_key(entry) + if seen_keys.has(key): + continue + seen_keys[key] = true + entries.append(entry) + return { + "entries": entries, + "truncated": truncated, + } + + +func retained_recent_editor_entries() -> Array[Dictionary]: + ## There is no shared timestamp across the editor logger ring and Godot's + ## Debugger Errors tree. Preserve the pre-PR fallback contract: newest + ## buffered editor entries first, then debugger-only rows that were not in + ## the ring, so stale Debugger rows cannot outrank newer ring entries. + var entries: Array[Dictionary] = [] + var seen_keys: Dictionary = {} + if _editor_log_buffer != null: + entries = _editor_log_buffer.get_recent(_editor_log_buffer.total_count()) + entries.reverse() + for entry in entries: + seen_keys[_log_entry_key(entry)] = true + for entry in collect_editor_log_entries(): + var key := _log_entry_key(entry) + if seen_keys.has(key): + continue + seen_keys[key] = true + entries.append(entry) + return entries + + +func read_debugger_error_entries() -> Array[Dictionary]: + var entries: Array[Dictionary] = [] + var seen_keys: Dictionary = {} + for entry in _raw_debugger_error_entries(): + var key := _log_entry_key(entry) + if seen_keys.has(key): + continue + seen_keys[key] = true + entries.append(entry) + return entries + + +func locate_debugger_error_trees() -> Array[Tree]: + var trees: Array[Tree] = [] + var root: Node = _debugger_errors_root + ## #641: a deferred-scan timer can outlive an injected root (tests, + ## teardown). A freed root must not fall through to the live editor UI — + ## that would promote unrelated real errors into a tracker scoped to the + ## dead root — so treat it as "nothing to scan". + if root != null and not is_instance_valid(root): + return trees + if root == null: + root = _debugger_search_root() + if root == null: + return trees + _collect_debugger_error_trees(root, trees) + return trees + + +func clear_debugger_error_trees() -> int: + var cleared := 0 + for tree in locate_debugger_error_trees(): + cleared += entries_from_debugger_error_tree(tree).size() + if not _press_debugger_clear_button(tree): + ## Synthetic roots in tests do not have Godot's Clear button. + tree.clear() + return cleared + + +func _debugger_search_root() -> Node: + if is_instance_valid(_debugger_search_root_cache): + return _debugger_search_root_cache + _debugger_search_root_cache = null + var base := EditorInterface.get_base_control() + if base == null: + return null + _debugger_search_root_cache = _find_first_of_class(base, "EditorDebuggerNode") + if _debugger_search_root_cache == null: + return base + return _debugger_search_root_cache + + +static func _find_first_of_class(node: Node, klass: String) -> Node: + if node.get_class() == klass: + return node + for child in node.get_children(): + var found := _find_first_of_class(child, klass) + if found != null: + return found + return null + + +static func _collect_debugger_error_trees(node: Node, out: Array[Tree]) -> void: + if node is Tree and _tree_has_debugger_errors(node as Tree): + out.append(node as Tree) + for child in node.get_children(): + if child is Node: + _collect_debugger_error_trees(child as Node, out) + + +static func _tree_has_debugger_errors(tree: Tree) -> bool: + var root := tree.get_root() + if root == null: + return false + var item := root.get_first_child() + while item != null: + if _is_debugger_error_item(item): + return true + item = item.get_next() + return false + + +static func _press_debugger_clear_button(tree: Tree) -> bool: + var parent := tree.get_parent() + if parent == null: + return false + var stack: Array[Node] = [parent] + while not stack.is_empty(): + var node: Node = stack.pop_back() + if node is BaseButton: + for conn in node.get_signal_connection_list("pressed"): + if str(conn.get("callable", "")).contains("_clear_errors_list"): + node.emit_signal("pressed") + return true + for child in node.get_children(): + stack.push_back(child) + return false + + +static func entries_from_debugger_error_tree(tree: Tree) -> Array[Dictionary]: + var entries: Array[Dictionary] = [] + var root := tree.get_root() + if root == null: + return entries + var item := root.get_first_child() + while item != null: + if _is_debugger_error_item(item): + entries.append(_entry_from_debugger_error_item(item)) + item = item.get_next() + return entries + + +static func _entry_from_debugger_error_item(item: TreeItem) -> Dictionary: + var title := item.get_text(1) + var loc := _location_from_metadata(item.get_metadata(0)) + var function := _function_from_title(title) + return { + "source": "editor", + "level": "warn" if item.has_meta("_is_warning") else "error", + "text": title, + "path": str(loc.get("path", "")), + "line": int(loc.get("line", 0)), + "function": function, + "details": _details_from_debugger_error_item(item, loc, function), + } + + +static func _details_from_debugger_error_item(item: TreeItem, loc: Dictionary, function: String) -> Dictionary: + var children: Array[Dictionary] = [] + var child := item.get_first_child() + while child != null: + var child_loc := _location_from_metadata(child.get_metadata(0)) + children.append({ + "label": child.get_text(0), + "text": child.get_text(1), + "path": str(child_loc.get("path", "")), + "line": int(child_loc.get("line", 0)), + }) + child = child.get_next() + return { + "debugger_tab": "Errors", + "time": item.get_text(0), + "message": item.get_text(1), + "error_type_name": "warning" if item.has_meta("_is_warning") else "error", + "source": { + "path": str(loc.get("path", "")), + "line": int(loc.get("line", 0)), + "function": function, + }, + "resolved": { + "path": str(loc.get("path", "")), + "line": int(loc.get("line", 0)), + "function": function, + }, + "children": children, + "frames": _frames_from_error_children(children), + } + + +static func _is_debugger_error_item(item: TreeItem) -> bool: + return item.has_meta("_is_warning") or item.has_meta("_is_error") + + +static func _frames_from_error_children(children: Array[Dictionary]) -> Array[Dictionary]: + var start := -1 + for i in children.size(): + if str(children[i].label).contains("Stack Trace"): + start = i + break + if start < 0: + for i in children.size(): + if str(children[i].label).is_empty() and not str(children[i].path).is_empty(): + start = maxi(i - 1, 0) + break + if start < 0: + return [] + var frames: Array[Dictionary] = [] + for i in range(start, children.size()): + if str(children[i].path).is_empty(): + continue + frames.append({ + "path": children[i].path, + "line": children[i].line, + "function": _function_from_frame_text(children[i].text), + }) + return frames + + +static func _location_from_metadata(meta: Variant) -> Dictionary: + if meta is Array and meta.size() >= 2: + return {"path": str(meta[0]), "line": int(meta[1])} + return {"path": "", "line": 0} + + +static func _function_from_title(title: String) -> String: + var colon := title.find(": ") + if colon <= 0: + return "" + return title.substr(0, colon) + + +static func _function_from_frame_text(text: String) -> String: + var marker := text.find(" @ ") + if marker < 0: + return "" + var fn := text.substr(marker + 3).strip_edges() + if fn.ends_with("()"): + fn = fn.substr(0, fn.length() - 2) + return fn + + +## Shared one-line rendering of a compact editor-error entry for messages and +## hints ("text (path:line)"). Single home so the debugger plugin, project +## handler, and editor handler can't drift apart. +static func format_editor_error_summary(entry: Dictionary) -> String: + var text := str(entry.get("text", "editor error")) + var path := str(entry.get("path", "")) + var line := int(entry.get("line", 0)) + if not path.is_empty() and line > 0: + return "%s (%s:%d)" % [text, path, line] + if not path.is_empty(): + return "%s (%s)" % [text, path] + return text + + +static func _log_entry_key(entry: Dictionary) -> String: + return "%s|%s|%s|%s" % [ + str(entry.get("level", "")), + str(entry.get("text", "")), + str(entry.get("path", "")), + str(entry.get("line", 0)), + ] + + +func _error_appended_total() -> int: + if _editor_log_buffer == null: + return 0 + if _editor_log_buffer.has_method("error_appended_total"): + return int(_editor_log_buffer.call("error_appended_total")) + return 0 + + +func _game_error_total() -> int: + if _game_log_buffer == null: + return 0 + if _game_log_buffer.has_method("error_total"): + return int(_game_log_buffer.call("error_total")) + return 0 + + +func _warn_appended_total() -> int: + if _editor_log_buffer == null: + return 0 + if _editor_log_buffer.has_method("warn_appended_total"): + return int(_editor_log_buffer.call("warn_appended_total")) + return 0 + + +func _game_warn_total() -> int: + if _game_log_buffer == null: + return 0 + if _game_log_buffer.has_method("warn_total"): + return int(_game_log_buffer.call("warn_total")) + return 0 + + +func _should_scan_debugger_for_cached_watermark(now_msec: int) -> bool: + if not _debugger_scan_active and now_msec > _debugger_scan_until_msec: + return false + return now_msec - _last_debugger_refresh_msec >= DEBUGGER_REFRESH_MIN_INTERVAL_MS + + +func _trim_promoted_debugger_entries() -> void: + while _promoted_debugger_entries.size() > MAX_PROMOTED_DEBUGGER_ENTRIES: + _promoted_debugger_entries.pop_front() + if _promoted_debugger_entries.is_empty(): + _oldest_retained_debugger_sequence = _debugger_promoted_total + 1 + else: + _oldest_retained_debugger_sequence = int(_promoted_debugger_entries[0].get("_debugger_sequence", 1)) + + +func _trim_promoted_debugger_key_counts() -> void: + while _promoted_debugger_key_order.size() > MAX_PROMOTED_DEBUGGER_KEYS: + var key := _promoted_debugger_key_order.pop_front() + _promoted_debugger_keys.erase(key) + _promoted_debugger_row_times.erase(key) + + +## #635: per-row time text from a scraped Errors-tab entry (column 0 of the +## row, carried in details.time). Empty when the entry has no details — e.g. +## synthetic records — which keeps those on count-only dedup. +static func _row_time_text(entry: Dictionary) -> String: + var details: Variant = entry.get("details", {}) + if details is Dictionary: + return str((details as Dictionary).get("time", "")) + return "" + + +func _unaccounted_row_times(key: String, times: Dictionary) -> Array: + var accounted: Dictionary = _promoted_debugger_row_times.get(key, {}) + var unseen := [] + for time_text in times.keys(): + if not accounted.has(time_text): + unseen.append(time_text) + return unseen + + +func _account_row_times(key: String, times: Dictionary) -> void: + if times.is_empty(): + return + var accounted: Dictionary = _promoted_debugger_row_times.get(key, {}) + for time_text in times.keys(): + accounted[time_text] = true + ## Enforce the bound AFTER merging: a pre-merge `>` check let the set + ## reach the cap and keep growing (and a batch of new times could jump + ## past it). Past the cap, reset to just this scan's times — the live + ## Errors tab is itself bounded, so this only fires under a pathological + ## same-key flood, where "recent scan only" is an acceptable memory of + ## what was promoted (worst case: a re-observed ancient row re-promotes). + if accounted.size() > MAX_ACCOUNTED_ROW_TIMES_PER_KEY: + accounted = times.duplicate() + _promoted_debugger_row_times[key] = accounted + + +func _remove_promoted_debugger_entry(key: String) -> void: + for i in range(_promoted_debugger_entries.size() - 1, -1, -1): + if str(_promoted_debugger_entries[i].get("_debugger_key", "")) == key: + _promoted_debugger_entries.remove_at(i) + return + + +func _raw_debugger_error_entries() -> Array[Dictionary]: + var entries: Array[Dictionary] = [] + for tree in locate_debugger_error_trees(): + entries.append_array(entries_from_debugger_error_tree(tree)) + return entries diff --git a/addons/godot_ai/utils/surfaced_error_tracker.gd.uid b/addons/godot_ai/utils/surfaced_error_tracker.gd.uid new file mode 100644 index 0000000..433a191 --- /dev/null +++ b/addons/godot_ai/utils/surfaced_error_tracker.gd.uid @@ -0,0 +1 @@ +uid://o0ulahkt83re diff --git a/addons/godot_ai/utils/update_manager.gd b/addons/godot_ai/utils/update_manager.gd new file mode 100644 index 0000000..65de4ee --- /dev/null +++ b/addons/godot_ai/utils/update_manager.gd @@ -0,0 +1,843 @@ +@tool +class_name McpUpdateManager +extends Node + +## Self-update manager for pre-runner work. Owns release checks, HTTP ZIP +## download, the install-in-flight gate, and install state signals back to +## the dock. Once `_install_zip()` calls +## `plugin.gd::install_downloaded_update(...)`, ownership transfers to +## `update_reload_runner.gd`, which owns extract, scan, plugin re-enable, +## and detached-dock cleanup. +## +## The dock owns banner rendering and forwards button clicks. The split +## exists because the dock script is one of the files overwritten on disk +## during install — keeping pipeline state on a separate Node lets the dock +## tear down cleanly without losing the in-flight gate that other dock spawn +## paths consult. +## +## `class_name McpUpdateManager` is retained because it shipped in a +## published release. If this class is ever retired, follow CLAUDE.md's +## never-delete-published-class_name shim policy instead of deleting the +## declaration. +## +## `_plugin` and `_dock` are deliberately untyped: the same self-update +## window that overwrites this script also overwrites the dock and plugin +## scripts, and a static-typed reference into a script being hot-reloaded +## crashes inside `GDScriptFunction::call`. `server_lifecycle.gd` follows +## the same convention. + +const RELEASES_URL := ( + "https://api.github.com/repos/hi-godot/godot-ai/releases/latest" +) +const RELEASES_PAGE := "https://github.com/hi-godot/godot-ai/releases/latest" +const UPDATE_TEMP_DIR := "user://godot_ai_update/" +const UPDATE_TEMP_ZIP := "user://godot_ai_update/update.zip" +const ClientConfigurator := preload("res://addons/godot_ai/client_configurator.gd") +const PortResolver := preload("res://addons/godot_ai/utils/port_resolver.gd") + +## RSA-4096 public key for release-signature verification (#687). The paired +## private key exists only in the GitHub Actions secret RELEASE_SIGNING_KEY_PEM +## (plus the maintainer's offline backup) — deliberately outside the repo +## token's scope, because the threat model is release-asset substitution by a +## leaked token or compromised workflow, and a token that can rewrite assets +## still cannot read secrets. Rotation requires shipping a new plugin release +## embedding the new key (and bumping SIGNING_REQUIRED_FROM_VERSION past the +## last release signed with the old one). +const RELEASE_SIGNING_PUBLIC_KEY_PEM := """-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr4OmbONFTONGFcXSUQ2p +e54YaUhWDA75wxeDWhOc476vsdo53YnXEFT7EPr2hUKqeNxv++LqKOkFuAsxSNZy +wBe6P1tmQA4Og6Ezv4CGnZdEj1uhlDJFK9ShQ29oWfC6bf/84625SvvBxZos2Br9 +yPKl7h5wzqDoeUSpv+f0ynTiC0i/HAUo/NQBlkgGwkomK2Fr3pP1VDxxq2xvgHSk +lU6Qcomr9WjJxI+HkDN5tRPPn0pDrg6YFx2J18OfD8KIa/kMGxuXOcHlPyRYpjyu +qTtg2oL0NyUIG+1TmJ3DcN4GlKC55eOrkfJ04vudS5pxdnUIFRmkGBXZLdaetoPc +ixtlD4w6gi8KIH1CTG+/TtHP1KVdOogCWDcjRCAmMJPFZe6eEKXmGQUZDb9wfnbx +h++XiVe5tq83BTLWmaFTy+fZbNo12uhNCNS1LJ42/yj+S1xvo0yMbkkNr1hIYk0P +584XnBQeBSVJDf3667NZXaxnWv94K9zbb+1OvOvPwhbOdgi2Ymcw5QEOQIavtg86 +XLLcWzG+SJsycz1imikjv6sStWh8WHneKSTMq6A7V6PBj7oJyEJp10696BDw287k +YlH+9VGqowPEMXpWX57wOBKiWb4K1kw1LfxjT8W1e/pcX9pJqiv0DkjTXUxo9CDG +1X1+ZXBBR3MkGuFAOCjy0x8CAwEAAQ== +-----END PUBLIC KEY----- +""" + +## Every release at or above this version ships a signed sidecar +## (release.yml hard-fails without the signing secret). At or above it, a +## missing `.sha256.sig` asset is treated as tampering — an attacker who can +## rewrite release assets could otherwise just strip the signature to skip +## verification. Below it (releases published before signing existed), the +## legacy checksum-only path still installs. +const SIGNING_REQUIRED_FROM_VERSION := "2.9.3" + +## Host -> required path prefix for self-update downloads (ZIP and checksum +## sidecar). The URLs are taken verbatim from the GitHub Releases API's +## `browser_download_url`, so before fetching we pin them to https on a +## GitHub-owned host AND to this repo's release-asset path (#599) — a +## tampered or unexpected API response can't point the in-editor updater at +## an arbitrary origin, nor at a release asset of a *different* repo on a +## trusted host. +## +## In practice `browser_download_url` is always the +## `https://github.com/hi-godot/godot-ai/releases/download//` +## shape; HTTPRequest then follows the github.com -> *.githubusercontent.com +## redirect internally (this guard validates the entry point, not each hop). +## The CDN hosts are kept as defense-in-depth should the API ever hand back +## a direct CDN URL — their object keys carry the repo *id*, not the repo +## name, so the tightest checkable prefix there is the release-asset key +## namespace. +const _TRUSTED_DOWNLOAD_PATH_PREFIXES := { + "github.com": "/hi-godot/godot-ai/releases/download/", + "www.github.com": "/hi-godot/godot-ai/releases/download/", + "api.github.com": "/repos/hi-godot/godot-ai/releases/assets/", + "objects.githubusercontent.com": "/github-production-release-asset-", + "release-assets.githubusercontent.com": "/github-production-release-asset-", +} + +## Emitted after `check_for_updates()` resolves a newer remote version. +## Payload mirrors the Dictionary returned by `parse_releases_response`: +## {has_update, version, forced, label_text, download_url} +signal update_check_completed(result: Dictionary) + +## Emitted at every UI-relevant step of the install pipeline. Payload +## keys are all optional and apply on top of the current banner state: +## label_text: String ## banner label override +## button_text: String ## update button text override +## button_disabled: bool ## update button disabled state +## banner_visible: bool ## banner visibility override +## outcome: String ## "success" -> dock paints green +signal install_state_changed(state: Dictionary) + +var _plugin +var _dock + +var _http_request: HTTPRequest +var _download_request: HTTPRequest +var _verify_request: HTTPRequest +var _signature_request: HTTPRequest +var _latest_download_url: String = "" +## URL of the `godot-ai-plugin.zip.sha256` sidecar asset. Used to verify the +## downloaded archive's integrity before extract (#523). Verification is +## mandatory (#599): when a release ships no sidecar this stays empty and +## `_verify_then_install` refuses the install. +var _latest_checksum_url: String = "" +## URL of the `godot-ai-plugin.zip.sha256.sig` signature asset (#687). Empty +## on releases published before signing existed; `_verify_then_install` +## refuses an empty URL once the remote version is inside the signing era +## (see SIGNING_REQUIRED_FROM_VERSION). +var _latest_signature_url: String = "" +## Remote version from the last update check — drives the +## signature-required compat gate in `_verify_then_install`. +var _latest_remote_version: String = "" +## Sidecar bytes + parsed digest held between the checksum download and the +## signature verdict, so the signature is checked against exactly the bytes +## the digest was parsed from. +var _pending_sidecar_body := PackedByteArray() +var _pending_expected_digest: String = "" + +## Set for the duration of `_install_zip` — extract-overwrite of plugin +## scripts on disk would crash any worker mid-`GDScriptFunction::call` +## (confirmed via SIGABRT in the dock's refresh worker). Dock spawn paths +## consult this via `is_install_in_flight()`; in-flight workers are +## drained before any disk write. +var _install_in_flight: bool = false + + +# ---- Setup ------------------------------------------------------------- + +func setup(plugin, dock) -> void: + _plugin = plugin + _dock = dock + + +# ---- Public API --------------------------------------------------------- + +## Kick off the GitHub Releases API check. No-ops in dev checkouts — +## `addons/godot_ai/` is a symlink into canonical `plugin/` source there, +## and an extract would clobber tracked files (#116). `is_dev_checkout()` +## honours the mode override (EditorSetting `godot_ai/mode_override` > +## `GODOT_AI_MODE` env), so +## testers can force `user` to exercise the AssetLib flow from a dev tree; +## `_install_zip` still gates on the physical symlink check so a forced- +## user mode can never clobber source. +func check_for_updates() -> void: + if ClientConfigurator.is_dev_checkout(): + return + if _http_request == null: + _http_request = HTTPRequest.new() + _http_request.request_completed.connect(_on_update_check_completed) + add_child(_http_request) + _http_request.request(RELEASES_URL, ["Accept: application/vnd.github+json"]) + + +## Cancel any in-flight check so a follow-up check_for_updates() can't +## hit ERR_BUSY on the shared HTTPRequest. No current dock caller — the +## mode-override dropdown that used it was removed in #408; kept as +## published API of the update flow. +func cancel_check() -> void: + if _http_request != null: + _http_request.cancel_request() + + +## Reset the cached download/checksum URLs so a fresh check paints over +## a clean banner. No current production caller — the mode-override +## dropdown that used it was removed in #408; kept for tests and any +## future re-check path. +func clear_pending_download() -> void: + _latest_download_url = "" + _latest_checksum_url = "" + _latest_signature_url = "" + _latest_remote_version = "" + _pending_sidecar_body = PackedByteArray() + _pending_expected_digest = "" + + +## True when the running Godot is within the supported self-update floor. +## Godot < 4.5 must not be offered a one-click update to a release whose +## always-loaded scripts depend on 4.5 APIs/classes. +## Guards `major` too so a future Godot 5.x (minor 0) isn't misclassified. +func _can_self_update() -> bool: + var v := Engine.get_version_info() + return _version_can_self_update(int(v.get("major", 0)), int(v.get("minor", 0))) + + +## Pure version predicate, split out so it's testable without faking the +## running engine. In-editor self-update needs Godot >= 4.5. +static func _version_can_self_update(major: int, minor: int) -> bool: + return major > 4 or (major == 4 and minor >= 5) + + +## Banner guidance for engines below the support floor. Shown up-front at +## check time so those users do not install an incompatible latest release. +static func _manual_update_label(version: String) -> String: + var release_noun := "release" + var suffix := "" + if not version.is_empty(): + release_noun = "version" + suffix = " (latest: v%s)" % version + return ( + "This is the last Godot AI %s for this Godot%s. " % [release_noun, suffix] + + "Upgrade to Godot 4.5+ to keep receiving updates." + ) + + +## PID of the detached package pre-warm started alongside the zip download, +## or <= 0 when none is running (no uvx tier, unusable version pin, or it has +## already been waited out). See `_wait_for_prewarm_before_install`. +var _prewarm_pid := -1 +## When the install first found the pre-warm still running, so the wait below +## is bounded from the first check rather than re-armed on every poll. +var _prewarm_wait_started_ms := 0 +## Ceiling on how long install will wait for the pre-warm. Matches the budget +## the Configure-time pre-warm allows for the same download. +const PREWARM_WAIT_BUDGET_MS := 180 * 1000 +## Poll interval while waiting. Deliberately not sub-second: `pid_alive` shells +## out to `tasklist` on Windows via a blocking `OS.execute` on the main thread, +## so a tight poll would make the editor sluggish for the whole wait. +const PREWARM_POLL_SECONDS := 2.0 + + +## Driven by the dock's Update button. On Godot < 4.5 (see _can_self_update) +## the in-editor install is disabled so users cannot install an incompatible +## latest release. With no resolved download URL, falls back to opening the +## release page. Otherwise kicks off the download -> extract -> reload pipeline. +func start_install() -> void: + if not _can_self_update(): + install_state_changed.emit({ + "button_text": "Upgrade Godot", + "button_disabled": true, + "label_text": _manual_update_label(""), + "banner_visible": true, + }) + return + + if _latest_download_url.is_empty(): + OS.shell_open(RELEASES_PAGE) + return + + ## Pin the resolved asset URL to https on a GitHub host AND to this + ## repo's release-asset path before fetching (#523, #599). Fall back to + ## the release page (a user-driven browser download) rather than pulling + ## an executable plugin payload from an unexpected origin. + if not _is_trusted_download_url(_latest_download_url): + push_error( + "MCP | refusing self-update download from untrusted URL: %s" + % _latest_download_url + ) + OS.shell_open(RELEASES_PAGE) + install_state_changed.emit({ + "button_text": "Update via download page", + "button_disabled": false, + }) + return + + install_state_changed.emit({ + "button_text": "Downloading...", + "button_disabled": true, + }) + + ## Warm the uv cache for the NEW server version while the plugin zip + ## downloads (see prewarm_server_package): the post-update walk must win + ## a port bind race against attach bridges respawning the cached OLD + ## version, and a cold uvx resolve loses that race every time. uvx is + ## almost always cached in the CliFinder by now (the dock's setup probe); + ## a cold lookup is the same bounded main-thread cost as + ## `_reprobe_uv_if_negative`, on the same rare click-driven path. + _prewarm_pid = ClientConfigurator.prewarm_server_package(_latest_remote_version) + _prewarm_wait_started_ms = 0 + + if _download_request != null: + _download_request.queue_free() + _download_request = HTTPRequest.new() + var global_zip := ProjectSettings.globalize_path(UPDATE_TEMP_ZIP) + var global_dir := ProjectSettings.globalize_path(UPDATE_TEMP_DIR) + DirAccess.make_dir_recursive_absolute(global_dir) + _download_request.download_file = global_zip + _download_request.max_redirects = 10 + _download_request.request_completed.connect(_on_download_completed) + add_child(_download_request) + var err := _download_request.request(_latest_download_url) + if err != OK: + ## `request_completed` never fires when `request()` itself errors, + ## so cleanup (queue_free + null + drop the staged zip) has to land + ## inline — otherwise the HTTPRequest stays parented under the + ## manager until the next click. + _download_request.queue_free() + _download_request = null + DirAccess.remove_absolute(global_zip) + install_state_changed.emit({ + "button_text": "Request failed", + "button_disabled": false, + }) + +## Consulted by the dock's spawn paths (focus-in refresh, manual button, +## deferred initial refresh) — true while plugin scripts are being +## overwritten. A worker mid-`GDScriptFunction::call` into a half- +## overwritten script SIGABRTs the editor. +func is_install_in_flight() -> bool: + return _install_in_flight + + +# ---- Releases-API parse (pure, testable) ------------------------------- + +## Parses the GitHub Releases API JSON response. Returns: +## has_update: bool ## true if remote tag > local version +## version: String ## remote tag minus leading "v" +## forced: bool ## mode_override() == "user" (banner-only hint) +## label_text: String ## "Update available: vX.Y.Z" + " (forced)" +## download_url: String ## matching `godot-ai-plugin.zip` asset URL +## checksum_url: String ## `godot-ai-plugin.zip.sha256` asset URL ("" if absent) +## signature_url: String ## `godot-ai-plugin.zip.sha256.sig` asset URL ("" if absent) +## +## Static so tests drive it without instancing the manager. +static func parse_releases_response( + result: int, response_code: int, body: PackedByteArray +) -> Dictionary: + var out := { + "has_update": false, + "version": "", + "forced": false, + "label_text": "", + "download_url": "", + "checksum_url": "", + "signature_url": "", + } + if result != HTTPRequest.RESULT_SUCCESS or response_code != 200: + return out + var parsed = JSON.parse_string(body.get_string_from_utf8()) + if parsed == null or not (parsed is Dictionary): + return out + var json: Dictionary = parsed + var tag: String = String(json.get("tag_name", "")) + if tag.is_empty(): + return out + var remote_version := tag.trim_prefix("v") + var local_version := ClientConfigurator.get_plugin_version() + if not _is_newer(remote_version, local_version): + return out + + var url := "" + var checksum_url := "" + var signature_url := "" + var assets: Array = json.get("assets", []) + for asset in assets: + var asset_dict: Dictionary = asset + var asset_name := String(asset_dict.get("name", "")) + if asset_name == "godot-ai-plugin.zip": + url = String(asset_dict.get("browser_download_url", "")) + elif asset_name == "godot-ai-plugin.zip.sha256": + checksum_url = String(asset_dict.get("browser_download_url", "")) + elif asset_name == "godot-ai-plugin.zip.sha256.sig": + signature_url = String(asset_dict.get("browser_download_url", "")) + + var forced := ClientConfigurator.mode_override() == "user" + var label_text := "Update available: v%s" % remote_version + if forced: + ## Forced-user mode (EditorSetting or env) is the only way the banner + ## lights up in a dev tree; suffix so the operator notices. + label_text += " (forced)" + + out["has_update"] = true + out["version"] = remote_version + out["forced"] = forced + out["label_text"] = label_text + out["download_url"] = url + out["checksum_url"] = checksum_url + out["signature_url"] = signature_url + return out + + +## True only for an `https://` URL whose host is a key of +## `_TRUSTED_DOWNLOAD_PATH_PREFIXES` AND whose path starts with that host's +## required prefix — trusted host alone is not enough; the URL must be a +## hi-godot/godot-ai release asset (#599). Parses the authority by hand +## (GDScript has no URL parser): strips userinfo via the LAST `@` so a spoof +## like `https://github.com@evil.com/...` resolves to `evil.com` (rejected), +## and strips any `:port`. The path is compared case-sensitively (GitHub +## release paths are case-sensitive). Static so the guard is unit-testable +## without instancing the manager. +static func _is_trusted_download_url(url: String) -> bool: + const SCHEME := "https://" + if not url.begins_with(SCHEME): + return false + if url.find("\\") >= 0: + return false + var rest := url.substr(SCHEME.length()) + var authority := rest + var path := "" + var slash := rest.find("/") + if slash >= 0: + authority = rest.substr(0, slash) + path = rest.substr(slash) + ## Host is everything after the LAST '@' (userinfo precedes it). + var at := authority.rfind("@") + if at >= 0: + authority = authority.substr(at + 1) + var colon := authority.find(":") + if colon >= 0: + authority = authority.substr(0, colon) + var host := authority.to_lower() + if not _TRUSTED_DOWNLOAD_PATH_PREFIXES.has(host): + return false + ## Scope the checks below to the path proper (#713): direct CDN asset + ## URLs carry signed query params (X-Amz-Credential=...%2F...) whose + ## legitimate %2F tokens made every CDN prefix unreachable when the + ## needle scan covered the query string. Routing is decided by the + ## path, so the query is safe to ignore. + var qmark := path.find("?") + if qmark >= 0: + path = path.substr(0, qmark) + ## Reject dot-segments (and their percent-encoded forms) anywhere in the + ## path: "/hi-godot/godot-ai/releases/download/../../evil/..." passes a + ## raw string-prefix test but normalizes server-side to a different repo, + ## defeating the scoping (#599 review). Also reject percent-encoded + ## slashes, which some servers decode before routing. + var lower_path := path.to_lower() + for needle in ["/../", "/..", "%2e", "%2f", "%5c"]: + if lower_path.contains(needle): + return false + return path.begins_with(String(_TRUSTED_DOWNLOAD_PATH_PREFIXES[host])) + + +static func _is_newer(remote: String, local: String) -> bool: + var r := remote.split(".") + var l := local.split(".") + for i in range(max(r.size(), l.size())): + var rv := int(r[i]) if i < r.size() else 0 + var lv := int(l[i]) if i < l.size() else 0 + if rv > lv: + return true + if rv < lv: + return false + return false + + +# ---- HTTPRequest callbacks (instance-side) ----------------------------- + +func _on_update_check_completed( + result: int, + response_code: int, + _headers: PackedStringArray, + body: PackedByteArray +) -> void: + var parsed := parse_releases_response(result, response_code, body) + if not bool(parsed.get("has_update", false)): + return + if not _can_self_update(): + install_state_changed.emit({ + "button_text": "Upgrade Godot", + "button_disabled": true, + "label_text": _manual_update_label(String(parsed.get("version", ""))), + "banner_visible": true, + }) + return + _latest_download_url = String(parsed.get("download_url", "")) + _latest_checksum_url = String(parsed.get("checksum_url", "")) + _latest_signature_url = String(parsed.get("signature_url", "")) + _latest_remote_version = String(parsed.get("version", "")) + update_check_completed.emit(parsed) + + +func _on_download_completed( + result: int, + response_code: int, + _headers: PackedStringArray, + _body: PackedByteArray +) -> void: + if _download_request != null: + _download_request.queue_free() + _download_request = null + + if result != HTTPRequest.RESULT_SUCCESS or response_code != 200: + print("MCP | update download failed: result=%d code=%d" % [result, response_code]) + ## Failure parity with _fail_verification (#713): HTTPRequest's + ## download_file mode leaves whatever partial/error bytes it wrote + ## staged at UPDATE_TEMP_ZIP — drop them so no later step can ever + ## pick up a half-downloaded archive. + DirAccess.remove_absolute(ProjectSettings.globalize_path(UPDATE_TEMP_ZIP)) + install_state_changed.emit({ + "button_text": "Download failed (%d)" % response_code, + "button_disabled": false, + }) + return + + # Deferred so the HTTPRequest callback returns before the next step starts. + _verify_then_install.call_deferred() + + +# ---- Integrity verification (#523, #599, #687) -------------------------- + +## Gate the extract on (1) an RSA signature over the checksum sidecar and +## (2) a SHA-256 match of the archive against that sidecar. TLS + host +## pinning constrain where the bytes came from; the digest verifies the +## bytes themselves (in-transit corruption, single-object substitution); +## the signature verifies the digest's *provenance*. Both `download_url` +## and `checksum_url` come from the same GitHub Releases API response over +## the same channel, so anyone able to modify the release's assets (leaked +## repo token, compromised release workflow) can regenerate the sidecar to +## match a tampered zip — but cannot forge the `.sha256.sig` signature, +## whose private key lives only in an Actions secret outside the repo +## token's scope (#687). +## +## Verification is MANDATORY (#599): no `.sha256` sidecar — mistake or +## tamper — refuses to install. The signature is mandatory for every +## release at or above SIGNING_REQUIRED_FROM_VERSION: a missing signature +## there is a strip-attack signal, not a compat case, and hard-fails. Only +## releases predating signing take the legacy checksum-only path. +func _verify_then_install() -> void: + _pending_sidecar_body = PackedByteArray() + _pending_expected_digest = "" + + if _latest_checksum_url.is_empty(): + _fail_verification( + "release published no godot-ai-plugin.zip.sha256 sidecar; " + + "refusing unverified install (#599)" + ) + return + + ## A present-but-untrusted checksum URL is a tamper signal, not a + ## backward-compat case — refuse rather than silently skip. Trusted + ## means a GitHub host AND this repo's release-asset path (#599). + if not _is_trusted_download_url(_latest_checksum_url): + _fail_verification("checksum URL is not a trusted hi-godot/godot-ai release asset") + return + + if _latest_signature_url.is_empty(): + if _signature_required(_latest_remote_version): + _fail_verification( + "release v%s ships no godot-ai-plugin.zip.sha256.sig signature. " + % _latest_remote_version + + "Every release from v%s on is signed" % SIGNING_REQUIRED_FROM_VERSION + + " — a missing signature means a stripped or tampered release (#687)" + ) + return + print( + "MCP | self-update: release v%s predates signing; " % _latest_remote_version + + "using legacy checksum-only verification (#687)" + ) + elif not _is_trusted_download_url(_latest_signature_url): + _fail_verification("signature URL is not a trusted hi-godot/godot-ai release asset") + return + + install_state_changed.emit({"button_text": "Verifying..."}) + if _verify_request != null: + _verify_request.queue_free() + _verify_request = HTTPRequest.new() + _verify_request.max_redirects = 10 + _verify_request.request_completed.connect(_on_checksum_completed) + add_child(_verify_request) + var err := _verify_request.request(_latest_checksum_url) + if err != OK: + _verify_request.queue_free() + _verify_request = null + _fail_verification("could not request checksum (error %d)" % err) + + +func _on_checksum_completed( + result: int, + response_code: int, + _headers: PackedStringArray, + body: PackedByteArray +) -> void: + if _verify_request != null: + _verify_request.queue_free() + _verify_request = null + + if result != HTTPRequest.RESULT_SUCCESS or response_code != 200: + _fail_verification("checksum download failed (result=%d code=%d)" % [result, response_code]) + return + + var expected := _parse_sha256_digest(body.get_string_from_utf8()) + if expected.is_empty(): + _fail_verification("malformed checksum file") + return + + ## Signature verification (when armed) runs over the exact sidecar bytes + ## the digest was parsed from — hold both until the signature verdict. + if not _latest_signature_url.is_empty(): + _pending_sidecar_body = body + _pending_expected_digest = expected + _fetch_signature() + return + + ## Legacy pre-signing release: `_verify_then_install` already gated this + ## on the remote version predating SIGNING_REQUIRED_FROM_VERSION. + _finish_digest_check_and_install(expected) + + +## Download the `.sha256.sig` release asset; `_on_signature_completed` +## verifies it over the held sidecar bytes before the digest is trusted. +func _fetch_signature() -> void: + if _signature_request != null: + _signature_request.queue_free() + _signature_request = HTTPRequest.new() + _signature_request.max_redirects = 10 + _signature_request.request_completed.connect(_on_signature_completed) + add_child(_signature_request) + var err := _signature_request.request(_latest_signature_url) + if err != OK: + _signature_request.queue_free() + _signature_request = null + _fail_verification("could not request signature (error %d)" % err) + + +func _on_signature_completed( + result: int, + response_code: int, + _headers: PackedStringArray, + body: PackedByteArray +) -> void: + if _signature_request != null: + _signature_request.queue_free() + _signature_request = null + + if result != HTTPRequest.RESULT_SUCCESS or response_code != 200: + _fail_verification( + "signature download failed (result=%d code=%d)" % [result, response_code] + ) + return + + if not _verify_sidecar_signature(RELEASE_SIGNING_PUBLIC_KEY_PEM, _pending_sidecar_body, body): + _fail_verification( + "release signature does not verify against the embedded public key — " + + "the checksum sidecar was not produced by the release pipeline (#687)" + ) + return + + print("MCP | self-update release signature verified (rsa-4096/sha256)") + _finish_digest_check_and_install(_pending_expected_digest) + + +## Final gate shared by the signed and legacy paths: the staged archive's +## SHA-256 must match the (now-trusted) sidecar digest before extract. +func _finish_digest_check_and_install(expected: String) -> void: + _pending_sidecar_body = PackedByteArray() + _pending_expected_digest = "" + + var zip_path := ProjectSettings.globalize_path(UPDATE_TEMP_ZIP) + var actual := FileAccess.get_sha256(zip_path).to_lower() + if actual.is_empty(): + _fail_verification("could not hash the downloaded archive") + return + if actual != expected: + _fail_verification( + "checksum mismatch (expected %s…, got %s…)" + % [expected.substr(0, 12), actual.substr(0, 12)] + ) + return + + print("MCP | self-update checksum verified (sha256 %s)" % actual) + install_state_changed.emit({"button_text": "Installing..."}) + _install_zip.call_deferred() + + +## True when `remote_version` falls inside the signing era — every release +## at or above SIGNING_REQUIRED_FROM_VERSION ships a signed sidecar, so a +## missing signature there must hard-fail rather than fall back to the +## legacy checksum-only path. An empty/unknown version fails closed. Static +## so it's unit-testable. +static func _signature_required(remote_version: String) -> bool: + if remote_version.strip_edges().is_empty(): + return true + return not _is_newer(SIGNING_REQUIRED_FROM_VERSION, remote_version) + + +## PKCS#1 v1.5 RSA verification of `signature` over SHA-256(`sidecar`) — +## the exact output of release.yml's `openssl dgst -sha256 -sign`. Takes +## the PEM as a parameter (rather than reading the const) so tests can +## exercise both verdicts with a generated throwaway keypair. Static so +## it's unit-testable without instancing the manager. +static func _verify_sidecar_signature( + public_key_pem: String, sidecar: PackedByteArray, signature: PackedByteArray +) -> bool: + if sidecar.is_empty() or signature.is_empty(): + return false + var key := CryptoKey.new() + if key.load_from_string(public_key_pem, true) != OK: + return false + var ctx := HashingContext.new() + if ctx.start(HashingContext.HASH_SHA256) != OK: + return false + ctx.update(sidecar) + var digest := ctx.finish() + var crypto := Crypto.new() + return crypto.verify(HashingContext.HASH_SHA256, digest, signature, key) + + +## Surface an integrity-check failure and drop the staged zip so the bad +## bytes can never reach the extract path. Keeps the button enabled for retry. +func _fail_verification(reason: String) -> void: + _pending_sidecar_body = PackedByteArray() + _pending_expected_digest = "" + push_error( + "MCP | self-update integrity check failed: %s. The download was not installed." + % reason + ) + print("MCP | self-update aborted (integrity): %s" % reason) + DirAccess.remove_absolute(ProjectSettings.globalize_path(UPDATE_TEMP_ZIP)) + install_state_changed.emit({ + "button_text": "Verification failed — retry", + "button_disabled": false, + }) + + +## Extract the hex digest from a `sha256sum`-style file (" ") or a +## bare digest line. Returns lowercase 64-char hex, or "" if the content isn't +## a valid SHA-256 digest. Static so it's unit-testable. See #523. +static func _parse_sha256_digest(text: String) -> String: + var trimmed := text.strip_edges() + if trimmed.is_empty(): + return "" + ## First whitespace-delimited token; `sha256sum` separates digest and + ## filename with two spaces, but some tools use tabs. + var normalized := trimmed.replace("\t", " ").replace("\n", " ").replace("\r", " ") + var tokens := normalized.split(" ", false) + if tokens.is_empty(): + return "" + var digest := String(tokens[0]).strip_edges().to_lower() + if digest.length() != 64: + return "" + for i in digest.length(): + var c := digest[i] + if not ((c >= "0" and c <= "9") or (c >= "a" and c <= "f")): + return "" + return digest + + +# ---- Install orchestration --------------------------------------------- + +## True when install may proceed now. False means "come back later" — this +## call has already scheduled the retry. +## +## Deliberately placed AFTER the symlink check in `_install_zip` so a dev +## checkout (which never installs) is never delayed by it. +func _wait_for_prewarm_before_install() -> bool: + if _prewarm_pid <= 0 or not PortResolver.pid_alive(_prewarm_pid): + _prewarm_pid = -1 + return true + if _prewarm_wait_started_ms == 0: + _prewarm_wait_started_ms = Time.get_ticks_msec() + if Time.get_ticks_msec() - _prewarm_wait_started_ms >= PREWARM_WAIT_BUDGET_MS: + ## Proceed rather than strand the update: a pre-warm this slow means the + ## post-update spawn will be cold, which is now survivable — the startup + ## watch stays alive until the pid-file appears (#896). + print( + "MCP | self-update: package pre-warm still running after %ds; " + % int(PREWARM_WAIT_BUDGET_MS / 1000) + + "installing anyway, the new server may start cold" + ) + _prewarm_pid = -1 + return true + install_state_changed.emit({"button_text": "Preparing packages...", "button_disabled": true}) + if is_inside_tree(): + get_tree().create_timer(PREWARM_POLL_SECONDS).timeout.connect( + _install_zip, CONNECT_ONE_SHOT + ) + return false + ## Detached from the tree (dock teardown mid-update): no timer to re-arm on, + ## so let the install proceed rather than silently dropping it. + _prewarm_pid = -1 + return true + + +func _install_zip() -> void: + ## Symlinked addons dir means an extract would clobber canonical + ## `plugin/` source through the link. Symlink detection is independent + ## of the mode override: even forced-user aborts here. See #116. + if ClientConfigurator.addons_dir_is_symlink(): + install_state_changed.emit({ + "button_text": "Dev checkout — update via git", + "button_disabled": true, + "banner_visible": false, + }) + return + + ## #896: do not tear the old server down until the NEW version's uv + ## environment is actually built. `install_downloaded_update` below kills + ## the server and hands off to the reload runner; the new plugin instance + ## then spawns a server that, on a cold cache, is still downloading ~67 + ## packages. The pre-warm was started alongside the zip download precisely + ## to cover this, but nothing waited for it — so on a slow link the update + ## proceeded while the environment was still being fetched, which is the + ## window where a failed spawn goes undiagnosed. + ## + ## Non-blocking: re-arms itself on a timer rather than stalling the main + ## thread, and gives up after PREWARM_WAIT_BUDGET_MS so a wedged pre-warm + ## cannot strand the update. Fully inert when no pre-warm is running. + if not _wait_for_prewarm_before_install(): + return + + ## Drain in-flight workers + block new ones BEFORE any disk write. + ## Without this, focus-in landing in the extract -> reload window spawns + ## a worker that walks into a partially-overwritten script and + ## SIGABRTs in `GDScriptFunction::call`. + _install_in_flight = true + _drain_dock_workers() + + var has_runner: bool = ( + _plugin != null + and _plugin.has_method("install_downloaded_update") + ) + if has_runner: + install_state_changed.emit({"button_text": "Reloading..."}) + ## Runner takes over: plugin tears down, runner extracts + scans + + ## re-enables. `install_downloaded_update` calls + ## `prepare_for_update_reload()` internally (kills the server, + ## resets the spawn guard) - see plugin.gd::install_downloaded_update. + _plugin.install_downloaded_update(UPDATE_TEMP_ZIP, UPDATE_TEMP_DIR, _dock) + return + + DirAccess.remove_absolute(ProjectSettings.globalize_path(UPDATE_TEMP_ZIP)) + DirAccess.remove_absolute(ProjectSettings.globalize_path(UPDATE_TEMP_DIR)) + _install_in_flight = false + install_state_changed.emit({ + "button_text": "Reload runner missing", + "button_disabled": false, + }) + + +func _reload_after_update() -> void: + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", false) + EditorInterface.set_plugin_enabled("res://addons/godot_ai/plugin.cfg", true) + + +func _drain_dock_workers() -> void: + if _dock != null and _dock.has_method("prepare_for_self_update_drain"): + _dock.prepare_for_self_update_drain() diff --git a/addons/godot_ai/utils/update_manager.gd.uid b/addons/godot_ai/utils/update_manager.gd.uid new file mode 100644 index 0000000..4089a72 --- /dev/null +++ b/addons/godot_ai/utils/update_manager.gd.uid @@ -0,0 +1 @@ +uid://cegiyw3fjcwev diff --git a/addons/godot_ai/utils/update_mixed_state.gd b/addons/godot_ai/utils/update_mixed_state.gd new file mode 100644 index 0000000..96d0024 --- /dev/null +++ b/addons/godot_ai/utils/update_mixed_state.gd @@ -0,0 +1,140 @@ +@tool +extends RefCounted + +## Scanner that detects whether `addons/godot_ai/` is in a half-installed +## state left behind by a self-update whose rollback couldn't restore the +## previous addon contents (`UpdateReloadRunner.InstallStatus.FAILED_MIXED`). +## +## Without this surface the user sees "plugin won't start" with no actionable +## context, re-runs the update, and compounds the mismatch (issue #354 / +## audit-v2 #10). The dock paints a banner from `diagnose()` and +## `editor_handler.gd::get_editor_state` includes the same Dictionary so an +## MCP agent can see and report the state. + +const ADDON_DIR := "res://addons/godot_ai/" +## Producer is `update_reload_runner.gd::INSTALL_BACKUP_SUFFIX`. Inlined as a +## literal because old two-phase runners can parse this diagnostic script +## against stale runner Script-object content during their mixed-snapshot +## scan. `test_update_backup_suffix_stays_in_sync` guards against drift. +const BACKUP_SUFFIX := ".update_backup" +## Cap so a runaway addons tree (someone parented the wrong dir, an old +## crashed install left thousands of artifacts) can't blow the +## `editor_state` payload size or freeze the editor on first paint. +const MAX_BACKUP_RESULTS := 200 +## TTL for the `diagnose()` cache. `editor_state` is one of the highest- +## traffic MCP tools (agents poll it constantly) and a recursive +## `DirAccess` walk on every call would put I/O on the 4ms `_process()` +## budget. Mixed-state is rare and persistent across editor restarts, so +## a few seconds of staleness is acceptable; the dock's Re-scan button +## bypasses the cache via `force=true` for immediate feedback. +const CACHE_TTL_MSEC := 5000 + +static var _cache_value: Dictionary = {} +static var _cache_timestamp_msec: int = -1 + + +## Walk `dir` recursively and return every `res://`-relative path that ends +## in `.update_backup`, sorted ascending. Truncates at `MAX_BACKUP_RESULTS` +## — the truncation flag is exposed via `diagnose()`. +## +## Walk order is deterministic: entries within each directory are sorted +## alphabetically, subdirs pushed reverse-sorted so DFS pops them in +## ascending order. Without this two scans of the same mixed tree could +## return different 200-file slices when truncation kicks in (Godot's +## `list_dir` order isn't guaranteed stable across filesystems). +static func find_backups(dir: String = ADDON_DIR) -> Array: + var results: Array = [] + var stack: Array = [dir] + while not stack.is_empty(): + if results.size() >= MAX_BACKUP_RESULTS: + break + var current: String = stack.pop_back() + var d := DirAccess.open(current) + ## Missing dir, permission error, or unreadable junction — skip + ## silently. A missing addons dir is the bare-clone case; mid-walk + ## errors stay quiet so a single permission glitch can't block the + ## diagnostic the rest of the scan would have produced. + if d == null: + continue + var entries: Array = [] + d.list_dir_begin() + while true: + var entry := d.get_next() + if entry.is_empty(): + break + if entry == "." or entry == "..": + continue + entries.append({"name": entry, "is_dir": d.current_is_dir()}) + d.list_dir_end() + entries.sort_custom(func(a, b): return a["name"] < b["name"]) + ## Push subdirs reverse-sorted so the next outer iteration pops + ## them in ascending order — see method docstring for why this + ## determinism matters for the truncated case. + for i in range(entries.size() - 1, -1, -1): + var entry: Dictionary = entries[i] + if entry["is_dir"]: + stack.append(current.path_join(entry["name"])) + for entry in entries: + if entry["is_dir"]: + continue + if not String(entry["name"]).ends_with(BACKUP_SUFFIX): + continue + results.append(current.path_join(entry["name"])) + if results.size() >= MAX_BACKUP_RESULTS: + break + results.sort() + return results + + +## Build the structured diagnostic Dictionary surfaced via `editor_state` +## and the dock banner. Empty when the addons tree is clean — callers +## gate banner visibility / response field on `is_empty()`. +## +## Cached for `CACHE_TTL_MSEC` when scanning the default `ADDON_DIR` so +## per-`editor_state` polls don't re-walk the addons tree every frame. +## Tests passing a custom `dir` always see a fresh scan (cache only +## tracks the production path). `force=true` bypasses the cache — used +## by the dock's Re-scan button so a manual fix is reflected immediately. +static func diagnose(dir: String = ADDON_DIR, force: bool = false) -> Dictionary: + var use_cache := dir == ADDON_DIR and not force + if use_cache and _cache_timestamp_msec >= 0: + if Time.get_ticks_msec() - _cache_timestamp_msec < CACHE_TTL_MSEC: + return _cache_value.duplicate(true) + + var backups := find_backups(dir) + var result: Dictionary = {} + if not backups.is_empty(): + ## Most commonly produced by `_rollback_paths_written` returning + ## FAILED_MIXED, but `_finalize_install_success` removes backups on + ## a best-effort basis so a successful install can also leave them + ## behind if the cleanup `remove_absolute` hit a permission error. + ## The recovery action — delete the *.update_backup files — is the + ## same in both cases, so the message acknowledges both + ## possibilities rather than asserting the alarming one. + result = { + "addon_dir": dir, + "backup_files": backups, + "backup_count": backups.size(), + "truncated": backups.size() >= MAX_BACKUP_RESULTS, + "message": ( + "Found .update_backup files in addons/godot_ai/. This usually" + + " means a self-update rollback couldn't restore the previous" + + " addon contents (FAILED_MIXED) — the plugin may load a mix" + + " of old and new files. Restore the addon from your VCS or a" + + " fresh release ZIP, then delete the listed *.update_backup" + + " files. If the plugin runs without issues these are likely" + + " stale from a successful install and safe to delete." + ), + } + if use_cache: + _cache_value = result.duplicate(true) + _cache_timestamp_msec = Time.get_ticks_msec() + return result + + +## Reset the `diagnose()` cache. Tests that flip the addons-tree state +## between calls use this to avoid TTL-bound flakiness; the dock's +## Re-scan button uses `force=true` instead. +static func clear_cache() -> void: + _cache_value = {} + _cache_timestamp_msec = -1 diff --git a/addons/godot_ai/utils/update_mixed_state.gd.uid b/addons/godot_ai/utils/update_mixed_state.gd.uid new file mode 100644 index 0000000..6d608d9 --- /dev/null +++ b/addons/godot_ai/utils/update_mixed_state.gd.uid @@ -0,0 +1 @@ +uid://dd5rti52vgs71 diff --git a/addons/godot_ai/utils/uv_cache_cleanup.gd b/addons/godot_ai/utils/uv_cache_cleanup.gd new file mode 100644 index 0000000..86edbe1 --- /dev/null +++ b/addons/godot_ai/utils/uv_cache_cleanup.gd @@ -0,0 +1,161 @@ +@tool +class_name McpUvCacheCleanup +extends RefCounted + +## Sweeps stale `.tmp*` build venvs out of `%LOCALAPPDATA%\uv\cache\builds-v0`. +## +## Background +## ---------- +## When an MCP client's attach launcher invokes +## `uvx --from godot-ai==VERSION godot-ai attach ...`, uv builds an ephemeral venv under +## `builds-v0\.tmpXXXXXX\`. To save disk it hard-links shared C extensions +## (notably `pydantic_core/_pydantic_core.cp313-win_amd64.pyd`) from +## `archive-v0\\Lib\site-packages\...` into the build venv. +## +## If the godot-ai server's own Python child has that same `.pyd` mapped via +## `LoadLibrary` (it does — godot-ai imports pydantic), the file is locked +## under BOTH paths because hard links share the inode and Windows tracks +## handles per-file, not per-path. uv's post-install cleanup of the build +## venv then dies with: +## +## Failed to install: pywin32-311-cp313-cp313-win_amd64.whl (pywin32==311) +## Caused by: failed to remove directory `...\.tmpXXXXXX\Lib\site-packages\pywin32-311.data` +## 다른 프로세스가 파일을 사용 중이기 때문에 ... (os error 32) +## +## (the `pywin32` mention is incidental — the actual lock is on the earlier +## hard-linked `_pydantic_core.pyd`; pywin32 is just the last install step +## in the wheel-resolution order that triggers the cleanup pass). +## +## What this does +## -------------- +## After the plugin stops/restarts the managed server — i.e. the moment when +## the archive-v0 `.pyd` mappings drop and the hard-linked builds-v0 copy +## becomes deletable — sweep `builds-v0\` for `.tmp*` orphans: +## +## 1. Rename each `.tmpXXX` to `_dead_.tmpXXX`. Rename succeeds even when +## AV scanners hold the file open without `FILE_SHARE_DELETE` (Defender +## and Softcamp SDS both do this), so this step always advances. +## 2. Recursively remove the renamed dir, swallowing per-file +## access-denied. Anything still genuinely locked is left for the next +## sweep — uv won't reuse the renamed name, so no future build collides. +## +## No-op on non-Windows (uv's hard-link strategy only causes this lock +## pattern on NTFS) and when the cache directory doesn't exist. + +const DEAD_PREFIX := "_dead_" +const TMP_PREFIX := ".tmp" + + +## Live entrypoint. Resolves `%LOCALAPPDATA%\uv\cache\builds-v0` and runs +## the sweep. Returns the same counts the testable `purge_directory` returns, +## or all zeros on non-Windows / missing cache. +static func purge_stale_builds() -> Dictionary: + if OS.get_name() != "Windows": + return _empty_result() + var local_appdata := OS.get_environment("LOCALAPPDATA") + if local_appdata.is_empty(): + return _empty_result() + var builds_root := local_appdata.replace("\\", "/").path_join("uv/cache/builds-v0") + return purge_directory(builds_root) + + +## Pure-ish entrypoint that takes a directory path. Returns +## `{ "scanned": int, "renamed": int, "deleted": int, "remaining": int }`. +## - `scanned`: how many `.tmp*` subdirs we saw on entry. +## - `renamed`: how many we successfully renamed to `_dead_*`. +## - `deleted`: how many we then fully removed. +## - `remaining`: how many `_dead_*` dirs are still on disk after the sweep +## (left for the next call to retry). +## +## Errors are swallowed — the caller is on a server-stop hot path and +## must not raise. +static func purge_directory(builds_root: String) -> Dictionary: + var result := _empty_result() + if not DirAccess.dir_exists_absolute(builds_root): + return result + var dir := DirAccess.open(builds_root) + if dir == null: + return result + dir.include_hidden = true + + ## Pass 1: collect names. Iterating + renaming in the same walk would + ## confuse DirAccess's internal cursor on NTFS. + var tmp_names: Array[String] = [] + var dead_names: Array[String] = [] + dir.list_dir_begin() + var entry := dir.get_next() + while entry != "": + if dir.current_is_dir() and not (entry == "." or entry == ".."): + if entry.begins_with(TMP_PREFIX): + tmp_names.append(entry) + elif entry.begins_with(DEAD_PREFIX): + dead_names.append(entry) + entry = dir.get_next() + dir.list_dir_end() + result.scanned = tmp_names.size() + + ## Pass 2: rename `.tmp*` → `_dead_.tmp*`. Rename works even on + ## AV-locked files (Defender opens without FILE_SHARE_DELETE, but rename + ## doesn't need delete share). Any rename failure is non-fatal. + for name in tmp_names: + var src := builds_root.path_join(name) + var dst := builds_root.path_join(DEAD_PREFIX + name) + if dir.rename(src, dst) == OK: + result.renamed += 1 + dead_names.append(DEAD_PREFIX + name) + + ## Pass 3: best-effort recursive delete of every `_dead_*`, including + ## ones left over from earlier sweeps that couldn't be cleaned then. + for name in dead_names: + var path := builds_root.path_join(name) + if _remove_recursive(path): + result.deleted += 1 + + ## Final pass: count `_dead_*` survivors so the caller (and tests) can + ## see how many genuinely-locked dirs we couldn't reach. + var dir2 := DirAccess.open(builds_root) + if dir2 != null: + dir2.include_hidden = true + dir2.list_dir_begin() + var e := dir2.get_next() + while e != "": + if dir2.current_is_dir() and e.begins_with(DEAD_PREFIX): + result.remaining += 1 + e = dir2.get_next() + dir2.list_dir_end() + + return result + + +## Recursive `rm -rf` that swallows access-denied per-file. Returns true +## only when the target directory itself was removed. +static func _remove_recursive(path: String) -> bool: + var dir := DirAccess.open(path) + if dir == null: + ## Already gone, or unreadable — try a direct remove just in case + ## (an empty dir handle-leak path) and report based on existence. + DirAccess.remove_absolute(path) + return not DirAccess.dir_exists_absolute(path) + dir.include_hidden = true + dir.list_dir_begin() + var entry := dir.get_next() + while entry != "": + if entry == "." or entry == "..": + entry = dir.get_next() + continue + var child := path.path_join(entry) + if dir.current_is_dir(): + _remove_recursive(child) + else: + DirAccess.remove_absolute(child) + entry = dir.get_next() + dir.list_dir_end() + ## Remove the (hopefully now empty) dir itself. If a hard-linked .pyd is + ## still mapped by a surviving process, this fails silently and the + ## caller sees `remaining > 0` so it can retry on the next sweep. + DirAccess.remove_absolute(path) + return not DirAccess.dir_exists_absolute(path) + + +static func _empty_result() -> Dictionary: + return { "scanned": 0, "renamed": 0, "deleted": 0, "remaining": 0 } diff --git a/addons/godot_ai/utils/uv_cache_cleanup.gd.uid b/addons/godot_ai/utils/uv_cache_cleanup.gd.uid new file mode 100644 index 0000000..321659d --- /dev/null +++ b/addons/godot_ai/utils/uv_cache_cleanup.gd.uid @@ -0,0 +1 @@ +uid://d33ukg65qf7q0 diff --git a/addons/godot_ai/utils/variant_serializer.gd b/addons/godot_ai/utils/variant_serializer.gd new file mode 100644 index 0000000..21d8c6e --- /dev/null +++ b/addons/godot_ai/utils/variant_serializer.gd @@ -0,0 +1,102 @@ +@tool +extends RefCounted + +## Converts Godot Variants into values that can be encoded as JSON. + + +## Non-finite floats (NaN/INF) have no JSON representation: JSON.stringify +## emits them as the bare tokens `inf`/`nan`, which are invalid JSON — the +## server drops the whole frame and the pending request times out (#688). +## Serialize them as null instead (the same choice web JSON.stringify makes), +## applied uniformly across the supported 4.5+ floor — no version gate, so +## wire output is identical on every supported engine. +static func _safe_float(f: float) -> Variant: + return f if is_finite(f) else null + + +static func serialize(value: Variant) -> Variant: + if value == null: + return null + match typeof(value): + TYPE_BOOL, TYPE_INT, TYPE_STRING: + return value + TYPE_FLOAT: + return _safe_float(value) + TYPE_STRING_NAME: + return str(value) + # Integer vector types are listed separately from their float twins so + # int components stay ints on the wire (no float coercion via + # _safe_float's typed parameter). + TYPE_VECTOR2I: + return {"x": value.x, "y": value.y} + TYPE_VECTOR2: + return {"x": _safe_float(value.x), "y": _safe_float(value.y)} + TYPE_VECTOR3I: + return {"x": value.x, "y": value.y, "z": value.z} + TYPE_VECTOR3: + return {"x": _safe_float(value.x), "y": _safe_float(value.y), "z": _safe_float(value.z)} + TYPE_VECTOR4I: + return {"x": value.x, "y": value.y, "z": value.z, "w": value.w} + TYPE_VECTOR4, TYPE_QUATERNION: + return { + "x": _safe_float(value.x), + "y": _safe_float(value.y), + "z": _safe_float(value.z), + "w": _safe_float(value.w), + } + TYPE_COLOR: + return { + "r": _safe_float(value.r), + "g": _safe_float(value.g), + "b": _safe_float(value.b), + "a": _safe_float(value.a), + } + TYPE_RECT2, TYPE_RECT2I, TYPE_AABB: + return { + "position": serialize(value.position), + "size": serialize(value.size), + } + TYPE_PLANE: + return {"normal": serialize(value.normal), "d": _safe_float(value.d)} + TYPE_BASIS: + return { + "x": serialize(value.x), + "y": serialize(value.y), + "z": serialize(value.z), + } + TYPE_TRANSFORM2D: + return { + "x": serialize(value.x), + "y": serialize(value.y), + "origin": serialize(value.origin), + } + TYPE_TRANSFORM3D: + return { + "basis": serialize(value.basis), + "origin": serialize(value.origin), + } + TYPE_PROJECTION: + return { + "x": serialize(value.x), + "y": serialize(value.y), + "z": serialize(value.z), + "w": serialize(value.w), + } + TYPE_NODE_PATH: + return str(value) + TYPE_ARRAY, TYPE_PACKED_BYTE_ARRAY, TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY, TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY, TYPE_PACKED_STRING_ARRAY, TYPE_PACKED_VECTOR2_ARRAY, TYPE_PACKED_VECTOR3_ARRAY, TYPE_PACKED_VECTOR4_ARRAY, TYPE_PACKED_COLOR_ARRAY: + var arr: Array = [] + for item in value: + arr.append(serialize(item)) + return arr + TYPE_DICTIONARY: + var out := {} + for key in value: + out[str(key)] = serialize(value[key]) + return out + TYPE_OBJECT: + if value is Resource and value.resource_path: + return value.resource_path + return str(value) + _: + return str(value) diff --git a/addons/godot_ai/utils/variant_serializer.gd.uid b/addons/godot_ai/utils/variant_serializer.gd.uid new file mode 100644 index 0000000..b8e0a28 --- /dev/null +++ b/addons/godot_ai/utils/variant_serializer.gd.uid @@ -0,0 +1 @@ +uid://cte37mtbd61n3 diff --git a/addons/godot_ai/utils/windows_port_reservation.gd b/addons/godot_ai/utils/windows_port_reservation.gd new file mode 100644 index 0000000..23b4f43 --- /dev/null +++ b/addons/godot_ai/utils/windows_port_reservation.gd @@ -0,0 +1,146 @@ +@tool +class_name McpWindowsPortReservation +extends RefCounted + +## Detects whether Windows has reserved a TCP port range that covers the +## plugin's server port. Hyper-V, WSL2, Docker Desktop, and Windows +## Sandbox all grab port ranges at boot via the winnat service. When a +## user's chosen port sits inside a reserved range, bind(2) fails with +## WinError 10013 ("forbidden by its access permissions") rather than +## 10048 ("address in use") — `netstat` shows nothing because no process +## owns the port, making the failure invisible. See issue #146. + +const NETSH_ARGS := ["interface", "ipv4", "show", "excludedportrange", "protocol=tcp"] + +## Session-lifetime cache. winnat establishes its excluded-port ranges at +## boot, so the table is effectively static for an editor session — while +## a `netsh` spawn costs ~250ms (measured), which the old 2s TTL re-paid +## on every startup walk (and could even re-pay *within* one walk when +## server-command discovery ran long between the two netsh consumers). +## Staleness risk is bounded: a mid-session winnat change (Docker/WSL2 +## start) at worst yields the same failure mode as the pre-#146 code for +## the remainder of the session, and only if a spawn happens after it. +static var _netsh_cache_text := "" +static var _netsh_cache_valid := false +static var _netsh_query_count := 0 + + +## Returns true if `port` falls inside a currently-reserved range on this +## Windows host. No-op on non-Windows (returns false). +static func is_port_excluded(port: int) -> bool: + if OS.get_name() != "Windows": + return false + var cached := _get_cached_excluded_output() + if bool(cached.get("hit", false)): + return parse_excluded(str(cached.get("text", "")), port) + var output: Array = [] + var exit_code := _execute_netsh_excluded_ranges(output) + if exit_code != 0 or output.is_empty(): + return false + var text := str(output[0]) + _store_excluded_output(text) + return parse_excluded(text, port) + + +static func _store_excluded_output(text: String) -> void: + _netsh_cache_text = text + _netsh_cache_valid = true + + +static func _get_cached_excluded_output() -> Dictionary: + if not _netsh_cache_valid: + return {"hit": false, "text": ""} + return {"hit": true, "text": _netsh_cache_text} + + +static func _clear_cache_for_tests() -> void: + _netsh_cache_text = "" + _netsh_cache_valid = false + + +static func netsh_query_count() -> int: + return _netsh_query_count + + +static func _execute_netsh_excluded_ranges(output: Array) -> int: + _netsh_query_count += 1 + return OS.execute("netsh", NETSH_ARGS, output, true) + + +## Parse the `netsh` excluded-port-range output and return true if `port` +## sits inside any reserved range. Exposed for testing; the live check +## uses `is_port_excluded`. Expected input format: +## +## Protocol tcp Port Exclusion Ranges +## +## Start Port End Port +## ---------- -------- +## 80 80 +## 5040 5040 +## 8000 8099 +## +## * - Administered port exclusions. +static func parse_excluded(text: String, port: int) -> bool: + return _ranges_contain(parse_excluded_ranges(text), port) + + +## Parse the `netsh` excluded-port-range output once into inclusive ranges. +static func parse_excluded_ranges(text: String) -> Array[Vector2i]: + var ranges: Array[Vector2i] = [] + for line in text.split("\n"): + var trimmed := line.strip_edges() + if trimmed.is_empty() or trimmed.begins_with("-") or trimmed.begins_with("*"): + continue + var parts: PackedStringArray = trimmed.split(" ", false) + if parts.size() < 2: + continue + if not parts[0].is_valid_int() or not parts[1].is_valid_int(): + continue + var start_p := int(parts[0]) + var end_p := int(parts[1]) + ranges.append(Vector2i(start_p, end_p)) + return ranges + + +static func _ranges_contain(ranges: Array[Vector2i], port: int) -> bool: + for r in ranges: + if port >= r.x and port <= r.y: + return true + return false + + +## Return the first port in `start`..`start+span-1` that is not excluded by +## Windows' port reservation table. Runs `netsh` once, unlike probing every +## candidate with `is_port_excluded`, which keeps fallback port selection cheap +## when Hyper-V / WSL2 / Docker reserve many adjacent ranges. +static func suggest_non_excluded_port(start: int, span: int = 2048, max_port: int = 65535) -> int: + if OS.get_name() != "Windows": + return start + var cached := _get_cached_excluded_output() + if bool(cached.get("hit", false)): + return suggest_non_excluded_port_from_output(str(cached.get("text", "")), start, span, max_port) + var output: Array = [] + var exit_code := _execute_netsh_excluded_ranges(output) + if exit_code != 0 or output.is_empty(): + return start + var text := str(output[0]) + _store_excluded_output(text) + return suggest_non_excluded_port_from_output(text, start, span, max_port) + + +## Pure parser-backed helper for tests and for `suggest_non_excluded_port`. +static func suggest_non_excluded_port_from_output(text: String, start: int, span: int = 2048, max_port: int = 65535) -> int: + var ranges := parse_excluded_ranges(text) + var limit := mini(start + span - 1, max_port) + var p := start + while p <= limit: + var advanced := false + for r in ranges: + if p >= r.x and p <= r.y: + p = r.y + 1 + advanced = true + break + if not advanced: + return p + return start + diff --git a/addons/godot_ai/utils/windows_port_reservation.gd.uid b/addons/godot_ai/utils/windows_port_reservation.gd.uid new file mode 100644 index 0000000..ffc5746 --- /dev/null +++ b/addons/godot_ai/utils/windows_port_reservation.gd.uid @@ -0,0 +1 @@ +uid://bt7mxpjcdrobq diff --git a/addons/godot_ai/vision_routing.gd b/addons/godot_ai/vision_routing.gd new file mode 100644 index 0000000..2f42cef --- /dev/null +++ b/addons/godot_ai/vision_routing.gd @@ -0,0 +1,1043 @@ +@tool +extends RefCounted + +## Vision Routing - route screenshot-tool images through a curated vision API. +## +## Models without image support (e.g. DeepSeek) cannot read the image blocks the +## screenshot tool returns. When routing is enabled, every single-image capture is sent to a +## vision model on a worker thread and the resulting text description is +## returned to the AI instead: +## +## - Editor (non-game) screenshots are captured normally by +## editor_handler.gd, then described on a worker thread; the reply is +## deferred until the description is ready. +## - Game screenshots are intercepted in mcp_debugger_plugin.gd the same way. +## - On success the response keeps a valid but tiny 2x2 placeholder image and +## carries the description as text metadata (`vision_description` plus a +## `note`, which the server forwards to the model). +## - On failure (missing key, network, API error) the original image payload +## passes through unchanged, so the screenshot tool never breaks. +## +## Providers are curated: label, API dialect, endpoint shape, environment +## variable and encrypted key slot are fixed in the PROVIDERS table. The model +## id is NOT - it is required per provider and entered by the user (stored in +## Editor Settings next to the key), because third-party model ids retire and +## only the account holder gets notified. Switching providers switches to that +## provider's entered model, so the software never guesses a model name: +## - Groq (free tier) - OpenAI chat-completions +## - Google Gemini (free tier, AI Studio key) - generateContent REST +## - xAI Grok (paid) - OpenAI chat-completions +## Both dialects are handled in this file. +## +## Settings live in Editor Settings (`vision_routing/enabled`, +## `vision_routing/provider`, plus one encrypted key slot and one model-id +## slot per provider). Keys are stored encrypted (AES-256-CBC, key derived +## from this machine) rather than in plain text, and each provider's +## environment variable (GROQ_API_KEY / GOOGLE_API_KEY / XAI_API_KEY) takes +## priority over the stored key. +## +## UI: a "Vision Routing" section inside the Clients & Tools Settings tab. + +## Curated providers: label, dialect, endpoint shape, env var and key/model +## setting slots are fixed here. The model id itself is user-entered per +## provider (see `_resolved_model`), so provider rows carry a `model_setting` +## slot and a `model_placeholder` suggestion instead of a baked-in id - +## third-party model ids retire, and only the account holder gets notified +## when one does. +const PROVIDERS := { + "groq": { + "label": "Groq", + "dialect": "openai", + "model_setting": "vision_routing/groq_model", + "model_placeholder": "qwen/qwen3.6-27b", + "host": "api.groq.com", + "port": 443, + "path": "/openai/v1/chat/completions", + "env": "GROQ_API_KEY", + "setting": "vision_routing/api_key_enc", + "placeholder": "gsk_...", + "key_label": "Groq API key (free tier: console.groq.com)", + "reasoning_effort": "none", + }, + "google": { + "label": "Google Gemini", + "dialect": "gemini", + "host": "generativelanguage.googleapis.com", + "port": 443, + "path": "/v1beta/models/{model}:generateContent", + "model_setting": "vision_routing/google_model", + "model_placeholder": "gemini-flash-latest", + "env": "GOOGLE_API_KEY", + "setting": "vision_routing/google_api_key_enc", + "placeholder": "AIza...", + "key_label": "Google AI Studio API key (free tier: aistudio.google.com)", + }, + "grok": { + "label": "xAI Grok", + "dialect": "openai", + "model_setting": "vision_routing/grok_model", + "model_placeholder": "grok-4.5", + "host": "api.x.ai", + "port": 443, + "path": "/v1/chat/completions", + "env": "XAI_API_KEY", + "setting": "vision_routing/grok_api_key_enc", + "placeholder": "xai-...", + "key_label": "xAI API key (api.x.ai)", + }, +} +const PROVIDER_ORDER := ["groq", "google", "grok"] + +const SETTING_ENABLED := "vision_routing/enabled" +const SETTING_PROVIDER := "vision_routing/provider" +const SETTING_API_KEY_ENC := "vision_routing/api_key_enc" +const TAB_NAME := "Vision Routing" + +const MAX_IMAGE_EDGE := 1024 +const CONNECT_TIMEOUT_MS := 4000 +const REQUEST_TIMEOUT_MS := 8000 +## Total budget for the whole provider exchange (connect + request + body). +## Kept under the server's 15s editor_screenshot window so the fallback +## pass-through always lands before the server gives up on slow providers. +const TOTAL_ROUTE_BUDGET_MS := 10000 +## Response body cap: the deadline bounds time but not bytes, and the socket +## talks to third-party hosts - a faulty or hostile provider must not be able +## to stream an unbounded body inside the window. +const MAX_RESPONSE_BODY_BYTES := 1048576 +## Output-token budget shared by both dialects (OpenAI `max_tokens`, +## Gemini `generationConfig.maxOutputTokens`) so routed descriptions +## stay bounded. +const MAX_OUTPUT_TOKENS := 512 + +const _ENC_PREFIX := "v1" +const _SALT := "vision_routing::v1::godot-ai" +const _PLACEHOLDER_PNG := "iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAALSURBVBhXY2BABwAAEgABp3qZbgAAAABJRU5ErkJggg==" + +## Plugin log buffer (McpLogBuffer), set by plugin.gd; null-safe. +var log_buffer: Object = null + +var _active := true +var _route_done: Callable +var _pending: Dictionary = {} # request_id -> {payload, data, connection, provider_id, provider, params} +var _threads: Dictionary = {} # request_id -> Thread ("_test" = ping thread) +var _ui_loading := false + +# UI references, kept in sync by _sync_ui_states(). +var _tab_provider: OptionButton = null +var _tab_enable: CheckButton = null +var _tab_key_label: Label = null +var _tab_key_hint: Label = null +var _tab_key_edit: LineEdit = null +var _tab_model_label: Label = null +var _tab_model_hint: Label = null +var _tab_model_edit: LineEdit = null +var _tab_status: Label = null +var _tab_test_button: Button = null + + +func _init() -> void: + _route_done = Callable(self, "_on_route_complete") + + +## Plugin teardown: stop workers and join in-flight threads so Godot never +## destroys a Thread mid-execution during a plugin reload. +func shutdown() -> void: + _active = false + ## Workers poll _active between HTTP polls, so this returns within one + ## poll interval (~50ms) unless a request is mid-flight in the OS; worst + ## case is a connect/request timeout. + for rid in _threads: + var thread: Thread = _threads[rid] + if thread != null and thread.is_started(): + thread.wait_to_finish() + _threads.clear() + _pending.clear() + _tab_provider = null + _tab_enable = null + _tab_key_label = null + _tab_key_hint = null + _tab_key_edit = null + _tab_status = null + _tab_test_button = null + _tab_model_label = null + _tab_model_hint = null + _tab_model_edit = null + + +# --- routing ------------------------------------------------------------------ + +## Entry point called from editor_handler.take_screenshot when routing is +## enabled. Runs the real capture (via `original`), then routes the image +## through the selected provider's vision API on a worker thread. Returns the deferred-response sentinel +## when the worker owns the reply, otherwise the capture result unchanged. +func route_editor_screenshot(params: Dictionary, original: Callable, connection: Object) -> Dictionary: + var rid := str(params.get("_request_id", "")) + if rid.is_empty(): + ## No deferred channel (e.g. batch_execute / dispatch_direct) - keep + ## the original synchronous result untouched. + return original.call(params) + var result := original.call(params) + if not (result is Dictionary) or not result.has("data"): + ## Deferred capture (source="game"): the frame arrives later through + ## route_game_payload. Stash the caller params (e.g. user_prompt) by + ## request id so the routed description keeps the agent's context. + if result is Dictionary and result.get("_deferred", false): + _pending[rid] = {"params": params} + return result + var data: Variant = result["data"] + if not (data is Dictionary) or not data.has("image_base64"): + return result + if _start_route(rid, str(params.get("source", "viewport")), result, data, connection, params): + ## Keep the deferred ledger inside the server's 15s editor_screenshot + ## window (the worker itself is capped at TOTAL_ROUTE_BUDGET_MS), so + ## a hung provider surfaces as a clean plugin timeout, not a + ## server-side abort. + return {"_deferred": true, "_deferred_timeout_ms": 13000} + return result + + +## Entry point called from McpDebuggerPlugin._on_screenshot_response before +## the frame is sent. Returns true when a worker owns the reply (the caller +## must NOT send the payload itself); false means pass through unchanged. +func route_game_payload(connection: Object, rid: String, payload: Dictionary) -> bool: + var data: Variant = payload.get("data") + if not (data is Dictionary) or not data.has("image_base64"): + ## Not a routeable frame - drop any params stashed by + ## route_editor_screenshot for this request id. + _pending.erase(rid) + return false + ## The editor handler stashed the caller params (user_prompt etc.) by + ## request id when it deferred the capture; hand them to the prompt + ## builder. Absent (older helper, direct call) = generic prompt. + var params: Dictionary = _pending.get(rid, {}).get("params", {}) + return _start_route(rid, "game", payload, data, connection, params) + + +## Returns true when a worker owns the reply; false means the caller should +## pass the original payload through unchanged. +func _start_route(rid: String, source: String, payload: Dictionary, data: Dictionary, connection: Object, params: Dictionary) -> bool: + var provider_id := _active_provider_id() + var base_provider: Dictionary = PROVIDERS.get(provider_id, PROVIDERS["groq"]) + ## Worker-thread snapshot: the entered model id is resolved into the + ## provider dict here, once, so the thread sees a stable copy and + ## routed_via can report the exact model that was pinged. + var provider := _provider_with_model(provider_id) + var api_key := _resolved_api_key(provider_id) + if api_key.is_empty(): + _log("vision routing: no API key for %s (set %s or paste one in the Vision Routing section) - screenshot %s passed through" % [provider_id, base_provider.get("env", ""), rid]) + _pending.erase(rid) + return false + if str(provider.get("model", "")).is_empty(): + ## Empty model behaves exactly like empty key: routing declines, the + ## image passes through, and the log line says what is missing. + _log("vision routing: no model id set for %s - screenshot %s passed through (set a model id in the Vision Routing section)" % [provider_id, rid]) + _pending.erase(rid) + return false + _pending[rid] = {"payload": payload, "data": data, "connection": connection, "provider_id": provider_id, "provider": provider, "params": params} + var prompt := _build_prompt(params) + var thread := Thread.new() + var start_err := thread.start(_route_worker.bind(provider, str(data.get("image_base64", "")), prompt, api_key, rid)) + if start_err != OK: + _pending.erase(rid) + _log("vision routing: could not start worker for %s: %s - screenshot %s passed through" % [rid, error_string(start_err), source]) + return false + _threads[rid] = thread + _log("vision routing: routing %s screenshot %s (%d b64 chars) via %s (%s)" % [source, rid, str(data.get("image_base64", "")).length(), base_provider.get("label", provider_id), provider.get("model", "")]) + return true + + +func _on_route_complete(rid: String, result: Variant) -> void: + _join_thread(rid) + if not _active: + _pending.erase(rid) + return + var entry: Dictionary = _pending.get(rid, {}) + _pending.erase(rid) + if entry.is_empty(): + return + var connection: Object = entry.get("connection") + if connection == null or not is_instance_valid(connection): + return + var provider_id := str(entry.get("provider_id", "groq")) + ## Provider snapshot taken at route start (with the entered model id); + ## falls back to a fresh resolve if absent (direct test callers). + var provider: Dictionary = entry.get("provider", {}) + if provider.is_empty(): + provider = _provider_with_model(provider_id) + ## Workers return {"desc": ..., "error": ...}; plain strings are accepted + ## for backwards compatibility (tests / older callers). + var description_str := "" + var error_str := "" + if result is Dictionary: + description_str = str(result.get("desc", "")) + error_str = str(result.get("error", "")) + elif result != null: + description_str = str(result) + if description_str.is_empty(): + if error_str.is_empty(): + error_str = "unknown error" + _log("vision routing: %s failed for %s (%s) - returning original image with failure note" % [provider_id, rid, error_str]) + ## Append a short templated reason to the note so text-only agents + ## (who otherwise just receive a useless image block) learn the + ## feature is down and why. + var failed_data: Dictionary = entry.get("data", {}).duplicate() + var failure_note := "Vision routing unavailable (%s): %s" % [provider_id, error_str] + var existing_note := str(failed_data.get("note", "")) + failed_data["note"] = (existing_note + " | " if not existing_note.is_empty() else "") + failure_note + _pass_through(connection, rid, {"data": failed_data}) + return + var data: Dictionary = entry.get("data", {}).duplicate() + var routed_via := "%s:%s" % [provider_id, provider.get("model", "")] + ## The server forwards a fixed whitelist of metadata keys into the text + ## result; `note` is the free-form one, so a self-attributing description + ## rides there (plus an explicit `vision_description` key) so text-only + ## models can read it. The label keeps provider text from reading as if + ## the plugin said it. The image is replaced by a valid 2x2 placeholder + ## so the payload stays well-formed. + data["vision_description"] = description_str + data["routed_via"] = routed_via + var original_note := str(data.get("note", "")) + var labeled := "Vision description (%s): %s" % [routed_via, description_str] + data["note"] = (original_note + " | " if not original_note.is_empty() else "") + labeled + data["image_base64"] = _PLACEHOLDER_PNG + data["format"] = "png" + _log("vision routing: description ready for %s (%d chars)" % [rid, description_str.length()]) + _pass_through(connection, rid, {"data": data}) + + +func _pass_through(connection: Object, rid: String, payload: Dictionary) -> void: + if connection != null and is_instance_valid(connection): + connection.send_deferred_response(rid, payload) + + +func _build_prompt(params: Dictionary) -> String: + var lines := PackedStringArray([ + "You are the vision module of a text-only AI agent driving the Godot editor through MCP.", + "Describe this screenshot so the agent can act without seeing it. Report:", + "- What is shown: Godot editor viewport, game window, 2D/3D scene, UI panel, dialog, or other.", + "- Objects/nodes: what they are, position, color, size, and any labels or text (quote text exactly).", + "- UI text: menus, buttons, error dialogs, console output, warnings, line numbers.", + "- State: selected node outlines, gizmos, play/stop status, panels that are open.", + "- Problems: errors, red highlights, missing textures, black screens, glitches, stretching.", + "Be concise (under 200 words), factual, and use exact quotes instead of paraphrase. Do not give advice.", + ]) + var user_prompt := str(params.get("user_prompt", "")) + if not user_prompt.is_empty(): + lines.append("Context from the agent that requested this screenshot: %s" % user_prompt) + return "\n".join(lines) + + +# --- routing worker (thread) --------------------------------------------------- + +func _route_worker(provider: Dictionary, image_b64: String, prompt: String, api_key: String, rid: String) -> void: + var result := _describe_blocking(provider, image_b64, prompt, api_key) + _route_done.call_deferred(rid, result) + + +## Returns {"desc": String, "error": String}; "desc" is empty on failure and +## "error" carries the reason. Runs on a worker thread, so it never writes +## shared state - everything it needs is passed in and returned. `provider` +## is the route-start snapshot (includes the entered model id). +func _describe_blocking(provider: Dictionary, image_b64: String, prompt: String, api_key: String) -> Dictionary: + var b64 := _downscale_image_if_needed(image_b64) + var body := _build_request_body(provider, prompt, b64) + var headers := _build_headers(provider, api_key) + var response := _http_post_json(str(provider.get("host", "")), int(provider.get("port", 443)), _resolve_path(provider), headers, body) + return _parse_description(provider, response) + + +## Provider paths may carry a {model} placeholder (Gemini's endpoint embeds +## the model id); substitute the entered model id verbatim. +func _resolve_path(provider: Dictionary) -> String: + return str(provider.get("path", "")).replace("{model}", str(provider.get("model", ""))) + + +func _build_request_body(provider: Dictionary, prompt: String, image_b64: String) -> String: + var model := str(provider.get("model", "")) + if str(provider.get("dialect", "")) == "gemini": + return JSON.stringify({ + "contents": [{ + "role": "user", + "parts": [ + {"text": prompt}, + {"inline_data": {"mime_type": "image/png", "data": image_b64}}, + ], + }], + "generationConfig": {"maxOutputTokens": MAX_OUTPUT_TOKENS}, + }) + var payload := { + "model": model, + "messages": [{ + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + {"type": "image_url", "image_url": {"url": "data:image/png;base64," + image_b64}}, + ], + }], + "max_tokens": MAX_OUTPUT_TOKENS, + "temperature": 0.2, + } + if provider.has("reasoning_effort"): + payload["reasoning_effort"] = provider["reasoning_effort"] + return JSON.stringify(payload) + + +func _build_headers(provider: Dictionary, api_key: String) -> PackedStringArray: + if str(provider.get("dialect", "")) == "gemini": + return PackedStringArray([ + "Content-Type: application/json", + "x-goog-api-key: %s" % api_key, + ]) + return PackedStringArray([ + "Content-Type: application/json", + "Authorization: Bearer %s" % api_key, + ]) + + +func _parse_description(provider: Dictionary, response: Dictionary) -> Dictionary: + var code: int = int(response.get("code", 0)) + var label := str(provider.get("label", str(provider.get("model", "?")))) + if code == 0: + return {"desc": "", "error": str(response.get("error", "HTTP request failed"))} + if code != 200: + return {"desc": "", "error": "%s HTTP %d: %s" % [label, code, _body_snippet(str(response.get("text", "")))]} + var parsed: Variant = JSON.parse_string(str(response.get("text", ""))) + if not (parsed is Dictionary): + return {"desc": "", "error": "%s response was not JSON: %s" % [label, _body_snippet(str(response.get("text", "")))]} + if str(provider.get("dialect", "")) == "gemini": + return _parse_gemini(parsed, label, response) + return _parse_openai(parsed, label, response) + + +func _parse_openai(parsed: Dictionary, label: String, response: Dictionary) -> Dictionary: + var choices: Variant = parsed.get("choices") + if not (choices is Array) or choices.is_empty(): + return {"desc": "", "error": "%s response had no choices: %s" % [label, _body_snippet(str(response.get("text", "")))]} + if not (choices[0] is Dictionary): + return {"desc": "", "error": "%s response choice was not an object: %s" % [label, _body_snippet(str(response.get("text", "")))]} + var message: Variant = choices[0].get("message", {}) + if not (message is Dictionary): + return {"desc": "", "error": "%s response message was not an object: %s" % [label, _body_snippet(str(response.get("text", "")))]} + var content: Variant = message.get("content", "") + if content == null: + return {"desc": "", "error": "%s response content was null: %s" % [label, _body_snippet(str(response.get("text", "")))]} + return {"desc": _strip_think(str(content)), "error": ""} + + +func _parse_gemini(parsed: Dictionary, label: String, response: Dictionary) -> Dictionary: + var candidates: Variant = parsed.get("candidates") + if not (candidates is Array) or candidates.is_empty(): + var reason := "" + var feedback: Variant = parsed.get("promptFeedback") + if feedback is Dictionary: + reason = str(feedback.get("blockReason", "")) + var reason_part := "" + if not reason.is_empty(): + reason_part = " (blocked: %s)" % reason + return {"desc": "", "error": "%s response had no candidates%s: %s" % [label, reason_part, _body_snippet(str(response.get("text", "")))]} + if not (candidates[0] is Dictionary): + return {"desc": "", "error": "%s response candidate was not an object: %s" % [label, _body_snippet(str(response.get("text", "")))]} + var content: Variant = candidates[0].get("content", {}) + if not (content is Dictionary): + return {"desc": "", "error": "%s response content was missing: %s" % [label, _body_snippet(str(response.get("text", "")))]} + var parts: Variant = content.get("parts") + if not (parts is Array) or parts.is_empty(): + return {"desc": "", "error": "%s response had no parts: %s" % [label, _body_snippet(str(response.get("text", "")))]} + var texts := PackedStringArray() + for part in parts: + if part is Dictionary: + var part_text := str(part.get("text", "")) + if not part_text.is_empty(): + texts.append(part_text) + if texts.is_empty(): + return {"desc": "", "error": "%s response parts had no text: %s" % [label, _body_snippet(str(response.get("text", "")))]} + return {"desc": _strip_think("\n".join(texts)), "error": ""} + + +func _strip_think(text: String) -> String: + var out := text.strip_edges() + ## Reasoning models may wrap their answer in ... blocks. + var think_end := out.rfind("") + if think_end != -1: + out = out.substr(think_end + "".length()).strip_edges() + return out + + +## Minimal vision call used by the "Test connection" button. Sends the same +## image-bearing body shape as real routing (with the 2x2 placeholder PNG), +## so one click validates key + model existence + image capability - a +## text-only or retired model id fails loudly here instead of at screenshot +## time. `provider` is the route-style snapshot (includes the model id). +func _ping_blocking(provider: Dictionary, api_key: String) -> Dictionary: + var body := _build_request_body(provider, "Reply with exactly: OK", _PLACEHOLDER_PNG) + var response := _http_post_json(str(provider.get("host", "")), int(provider.get("port", 443)), _resolve_path(provider), _build_headers(provider, api_key), body) + var code: int = int(response.get("code", 0)) + if code == 200: + return {"ok": true, "error": ""} + if code == 0: + return {"ok": false, "error": str(response.get("error", "request failed"))} + return {"ok": false, "error": "%s HTTP %d: %s" % [provider.get("label", "provider"), code, _body_snippet(str(response.get("text", "")))]} + + +func _http_post_json(host: String, port: int, path: String, headers: PackedStringArray, body: String) -> Dictionary: + if host.is_empty() or body.is_empty(): + return {"code": 0, "error": "invalid request (empty host or body)"} + var http := HTTPClient.new() + var connect_err := http.connect_to_host(host, port, TLSOptions.client()) + if connect_err != OK: + http.close() + return {"code": 0, "error": "connect_to_host failed: %s" % error_string(connect_err)} + ## One total deadline for the whole exchange (see TOTAL_ROUTE_BUDGET_MS), + ## so connect + request + body can never exceed it. + var budget_deadline := Time.get_ticks_msec() + TOTAL_ROUTE_BUDGET_MS + var deadline := mini(Time.get_ticks_msec() + CONNECT_TIMEOUT_MS, budget_deadline) + var first_poll := true + var connected := false + var last_status := -1 + while Time.get_ticks_msec() < deadline: + if not _active: + http.close() + return {"code": 0, "error": "aborted (plugin teardown)"} + http.poll() + var status := http.get_status() + last_status = status + if status == HTTPClient.STATUS_CONNECTED: + connected = true + break + if status == HTTPClient.STATUS_DISCONNECTED and not first_poll: + break + first_poll = false + OS.delay_msec(50) + if not connected: + http.close() + return {"code": 0, "error": "could not connect (status %d)" % last_status} + if http.request(HTTPClient.METHOD_POST, path, headers, body) != OK: + http.close() + return {"code": 0, "error": "request() failed"} + deadline = mini(Time.get_ticks_msec() + REQUEST_TIMEOUT_MS, budget_deadline) + var timed_out := false + var status_at_timeout := -1 + while http.get_status() == HTTPClient.STATUS_REQUESTING: + if not _active: + http.close() + return {"code": 0, "error": "aborted (plugin teardown)"} + http.poll() + if Time.get_ticks_msec() > deadline: + timed_out = true + status_at_timeout = http.get_status() + break + OS.delay_msec(50) + if timed_out: + http.close() + return {"code": 0, "error": "request timed out (status %d)" % status_at_timeout} + if not http.has_response(): + var st := http.get_status() + http.close() + return {"code": 0, "error": "no HTTP response (status %d)" % st} + var code := http.get_response_code() + var chunks := PackedByteArray() + var body_deadline := mini(Time.get_ticks_msec() + REQUEST_TIMEOUT_MS, budget_deadline) + while http.get_status() == HTTPClient.STATUS_BODY: + if not _active: + http.close() + return {"code": 0, "error": "aborted (plugin teardown)"} + chunks.append_array(http.read_response_body_chunk()) + if chunks.size() > MAX_RESPONSE_BODY_BYTES: + http.close() + return {"code": 0, "error": "response body exceeded %d bytes" % MAX_RESPONSE_BODY_BYTES} + http.poll() + if Time.get_ticks_msec() > body_deadline: + break + OS.delay_msec(10) + http.close() + return {"code": code, "text": chunks.get_string_from_utf8()} + + +func _body_snippet(text: String) -> String: + if text.is_empty(): + return "(empty body)" + if text.length() > 300: + return text.substr(0, 300) + "..." + return text + + +func _join_thread(rid: String) -> void: + ## Join the worker before dropping the Thread reference, otherwise Godot + ## warns "Thread object destroyed without completion". + var thread: Thread = _threads.get(rid) + if thread != null and thread.is_started(): + thread.wait_to_finish() + _threads.erase(rid) + + +func _downscale_image_if_needed(image_b64: String) -> String: + if image_b64.is_empty(): + return image_b64 + var raw := Marshalls.base64_to_raw(image_b64) + if raw.is_empty(): + return image_b64 + var image := Image.new() + if image.load_png_from_buffer(raw) != OK: + return image_b64 + var width := image.get_width() + var height := image.get_height() + if width <= MAX_IMAGE_EDGE and height <= MAX_IMAGE_EDGE: + return image_b64 + if width >= height: + height = maxi(1, int(round(height * MAX_IMAGE_EDGE / float(width)))) + width = MAX_IMAGE_EDGE + else: + width = maxi(1, int(round(width * MAX_IMAGE_EDGE / float(height)))) + height = MAX_IMAGE_EDGE + image.resize(width, height, Image.INTERPOLATE_BILINEAR) + var out := image.save_png_to_buffer() + if out.is_empty(): + return image_b64 + return Marshalls.raw_to_base64(out) + + +func _ping_worker(provider: Dictionary, api_key: String, status_label: Label, key_source: String) -> void: + var result := _ping_blocking(provider, api_key) + Callable(self, "_on_ping_done").call_deferred(result, provider, status_label, key_source) + + +func _on_ping_done(result: Dictionary, provider: Dictionary, status_label: Label, key_source: String) -> void: + _join_thread("_test") + if _tab_test_button != null and is_instance_valid(_tab_test_button): + _tab_test_button.disabled = false + if status_label != null and is_instance_valid(status_label): + var label := str(provider.get("label", "provider")) + if result.get("ok", false): + status_label.text = "OK - %s responded (%s)." % [label, key_source] + else: + status_label.text = "FAILED - %s (%s)." % [result.get("error", "unknown error"), key_source] + _log("vision routing: ping result: %s" % status_label.text) + + +# --- settings / key storage --------------------------------------------------- + +func _settings() -> EditorSettings: + return EditorInterface.get_editor_settings() + + +func is_routing_enabled() -> bool: + var es := _settings() + if es == null or not es.has_setting(SETTING_ENABLED): + return false + var value = es.get_setting(SETTING_ENABLED) + return value != null and value + + +func _active_provider_id() -> String: + var es := _settings() + if es == null: + return "groq" + var stored := "" + if es.has_setting(SETTING_PROVIDER): + stored = str(es.get_setting(SETTING_PROVIDER)) + if stored.is_empty() or not PROVIDERS.has(stored): + return "groq" + return stored + + +func _provider_setting(provider_id: String) -> String: + return str(PROVIDERS.get(provider_id, PROVIDERS["groq"]).get("setting", SETTING_API_KEY_ENC)) + + +func _resolved_api_key(provider_id: String) -> String: + ## Environment variable takes priority over the stored (encrypted) key. + var provider: Dictionary = PROVIDERS.get(provider_id, PROVIDERS["groq"]) + var env_key := OS.get_environment(str(provider.get("env", ""))) + if not env_key.is_empty(): + return env_key + var es := _settings() + if es == null: + return "" + var setting := _provider_setting(provider_id) + var blob := "" + if es.has_setting(setting): + blob = str(es.get_setting(setting)) + if blob.is_empty(): + return "" + return _decrypt(blob) + + +func _decrypted_key(provider_id: String) -> String: + var es := _settings() + if es == null: + return "" + var setting := _provider_setting(provider_id) + if not es.has_setting(setting): + return "" + return _decrypt(str(es.get_setting(setting))) + + +func set_api_key(provider_id: String, plain: String) -> void: + var es := _settings() + if es == null: + return + if plain.is_empty(): + es.set_setting(_provider_setting(provider_id), "") + return + var blob := _encrypt(plain) + if blob.is_empty(): + _log("vision routing: cannot store %s key - this machine reports no unique id; set %s instead" % [provider_id, PROVIDERS.get(provider_id, PROVIDERS["groq"]).get("env", "")]) + return + es.set_setting(_provider_setting(provider_id), blob) + + +## The model id is stored per provider next to the key (a plain Editor +## Setting - it is not a secret). Empty clears the slot. +func set_model_id(provider_id: String, model: String) -> void: + var es := _settings() + if es == null: + return + es.set_setting(_model_setting(provider_id), model.strip_edges()) + + +func _model_setting(provider_id: String) -> String: + return str(PROVIDERS.get(provider_id, PROVIDERS["groq"]).get("model_setting", "")) + + +func _resolved_model(provider_id: String) -> String: + var es := _settings() + if es == null: + return "" + var setting := _model_setting(provider_id) + if not es.has_setting(setting): + return "" + return str(es.get_setting(setting)).strip_edges() + + +## Route-start snapshot: the curated provider table plus the user's entered +## model id. Used by the worker thread and by _on_route_complete for the +## routed_via label, so it always reports the model that was actually pinged. +func _provider_with_model(provider_id: String) -> Dictionary: + var provider: Dictionary = PROVIDERS.get(provider_id, PROVIDERS["groq"]).duplicate() + provider["model"] = _resolved_model(provider_id) + return provider + + +## Machine-derived key: not a password, but enough that a casually-opened +## editor_settings-4.tres does not reveal the key in plain text. Separate +## domain tags give AES and HMAC independent keys so neither reuses the +## other's bytes. +func _derive_key(tag: String) -> PackedByteArray: + var parts := PackedStringArray([ + OS.get_unique_id(), + OS.get_environment("USERNAME"), + OS.get_environment("USERPROFILE"), + OS.get_environment("USER"), + OS.get_environment("HOME"), + OS.get_name(), + _SALT, + tag, + ]) + var ctx := HashingContext.new() + ctx.start(HashingContext.HASH_SHA256) + ctx.update(("|".join(parts)).to_utf8_buffer()) + return ctx.finish() + + +func _encrypt(plain: String) -> String: + if OS.get_unique_id().is_empty(): + ## Without a machine id the key would be near-constant across users + ## on the same machine - refuse, and let callers fall back to the + ## provider's environment variable. + return "" + var aes_key := _derive_key("aes") + var mac_key := _derive_key("mac") + var iv := Crypto.new().generate_random_bytes(16) + var raw := plain.to_utf8_buffer() + ## PKCS7 padding. + var pad := 16 - (raw.size() % 16) + var padded := raw.duplicate() + for i in pad: + padded.append(pad) + var aes := AESContext.new() + aes.start(AESContext.MODE_CBC_ENCRYPT, aes_key, iv) + var cipher := aes.update(padded) + aes.finish() + var hmac := HMACContext.new() + hmac.start(HashingContext.HASH_SHA256, mac_key) + hmac.update(iv) + hmac.update(cipher) + var mac := hmac.finish() + return "%s:%s:%s:%s" % [_ENC_PREFIX, Marshalls.raw_to_base64(iv), Marshalls.raw_to_base64(mac), Marshalls.raw_to_base64(cipher)] + + +func _decrypt(blob: String) -> String: + var parts := blob.split(":") + if parts.size() != 4 or parts[0] != _ENC_PREFIX: + return "" + var iv := Marshalls.base64_to_raw(parts[1]) + var mac := Marshalls.base64_to_raw(parts[2]) + var cipher := Marshalls.base64_to_raw(parts[3]) + if iv.size() != 16 or cipher.is_empty() or cipher.size() % 16 != 0: + return "" + var aes_key := _derive_key("aes") + var mac_key := _derive_key("mac") + var hmac := HMACContext.new() + hmac.start(HashingContext.HASH_SHA256, mac_key) + hmac.update(iv) + hmac.update(cipher) + var expected := hmac.finish() + if expected != mac: + return "" + var aes := AESContext.new() + aes.start(AESContext.MODE_CBC_DECRYPT, aes_key, iv) + var padded := aes.update(cipher) + aes.finish() + if padded.is_empty(): + return "" + var pad := int(padded[padded.size() - 1]) + if pad < 1 or pad > 16 or pad > padded.size(): + return "" + var raw := padded.slice(0, padded.size() - pad) + return raw.get_string_from_utf8() + + +# --- UI: tab in Clients & Tools ------------------------------------------------- + +## Builds the "Vision Routing" section inside the Clients & Tools Settings +## tab. Called by mcp_dock._build_settings_tab; `refresh_ui()` re-syncs the +## controls from Editor Settings each time the window opens. +func build_section(parent: VBoxContainer) -> void: + var box := VBoxContainer.new() + box.add_theme_constant_override("separation", 8) + parent.add_child(box) + + var header := Label.new() + header.text = "Vision Routing" + header.add_theme_font_size_override("font_size", 18) + box.add_child(header) + + var provider_row := HBoxContainer.new() + var provider_label := Label.new() + provider_label.text = "Provider" + provider_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + provider_row.add_child(provider_label) + _tab_provider = OptionButton.new() + _tab_provider.tooltip_text = "Which vision provider routes the screenshots. The model id is required per provider and is yours to maintain." + var active_provider := _active_provider_id() + for provider_index in PROVIDER_ORDER.size(): + var provider_item: Dictionary = PROVIDERS[PROVIDER_ORDER[provider_index]] + _tab_provider.add_item(str(provider_item.get("label", PROVIDER_ORDER[provider_index])), provider_index) + if PROVIDER_ORDER[provider_index] == active_provider: + _tab_provider.select(provider_index) + _tab_provider.item_selected.connect(_on_provider_changed) + provider_row.add_child(_tab_provider) + box.add_child(provider_row) + + var enable_row := HBoxContainer.new() + var enable_label := Label.new() + enable_label.text = "Enable routing" + enable_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + enable_row.add_child(enable_label) + _tab_enable = CheckButton.new() + _tab_enable.button_pressed = is_routing_enabled() + _tab_enable.toggled.connect(_on_enable_toggled) + enable_row.add_child(_tab_enable) + box.add_child(enable_row) + + var description := Label.new() + description.text = ( + "When enabled, every single-image screenshot the AI model takes through " + + "the godot-ai screenshot tool is sent to the selected provider's vision model (see " + + "the Provider dropdown) for a text description. The description is " + + "returned to the AI instead of the raw image, so models without image " + + "support (e.g. DeepSeek) can still \"see\" the editor and game. When " + + "the connected model analyzes images itself, switch this off here so " + + "screenshots pass through unchanged." + ) + description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + description.size_flags_horizontal = Control.SIZE_EXPAND_FILL + box.add_child(description) + + _tab_key_label = Label.new() + box.add_child(_tab_key_label) + + var key_row := HBoxContainer.new() + _tab_key_edit = LineEdit.new() + _tab_key_edit.secret = true + _tab_key_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL + ## Persist on commit (Enter / focus loss) instead of per keystroke, so + ## pasting a key does not re-encrypt and rewrite Editor Settings dozens + ## of times. + _tab_key_edit.text_submitted.connect(_on_key_committed) + _tab_key_edit.focus_exited.connect(func() -> void: _on_key_committed(_tab_key_edit.text)) + key_row.add_child(_tab_key_edit) + var show_button := CheckButton.new() + show_button.tooltip_text = "Show / hide key" + show_button.toggled.connect(func(show: bool) -> void: _tab_key_edit.secret = not show) + key_row.add_child(show_button) + box.add_child(key_row) + + _tab_key_hint = Label.new() + _tab_key_hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _tab_key_hint.add_theme_color_override("font_color", Color(0.55, 0.55, 0.55)) + box.add_child(_tab_key_hint) + + _tab_model_label = Label.new() + box.add_child(_tab_model_label) + + var model_row := HBoxContainer.new() + _tab_model_edit = LineEdit.new() + _tab_model_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL + ## Persist on commit (Enter / focus loss), same pattern as the key field. + _tab_model_edit.text_submitted.connect(_on_model_committed) + _tab_model_edit.focus_exited.connect(func() -> void: _on_model_committed(_tab_model_edit.text)) + model_row.add_child(_tab_model_edit) + box.add_child(model_row) + + _tab_model_hint = Label.new() + _tab_model_hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _tab_model_hint.add_theme_color_override("font_color", Color(0.55, 0.55, 0.55)) + box.add_child(_tab_model_hint) + + var test_row := HBoxContainer.new() + var test_button := Button.new() + test_button.text = "Test connection" + test_button.pressed.connect(_on_test_connection) + _tab_test_button = test_button + test_row.add_child(test_button) + _tab_status = Label.new() + _tab_status.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _tab_status.add_theme_color_override("font_color", Color(0.55, 0.55, 0.55)) + test_row.add_child(_tab_status) + box.add_child(test_row) + + refresh_ui() + + +## Re-syncs every control from Editor Settings. Called after the section is +## built and again by mcp_dock each time the Clients & Tools window opens, +## so a change made in another editor instance (or a hand-edit of +## editor_settings-4.tres) is reflected. +func refresh_ui() -> void: + _sync_ui_states() + _sync_provider_ui() + _ui_loading = true + if _tab_key_edit != null and is_instance_valid(_tab_key_edit): + _tab_key_edit.text = _decrypted_key(_active_provider_id()) + if _tab_model_edit != null and is_instance_valid(_tab_model_edit): + _tab_model_edit.text = _resolved_model(_active_provider_id()) + _ui_loading = false + + +func _on_key_committed(_new_text: String) -> void: + if _ui_loading: + return + set_api_key(_active_provider_id(), _tab_key_edit.text) + + +func _on_model_committed(_new_text: String) -> void: + if _ui_loading: + return + set_model_id(_active_provider_id(), _tab_model_edit.text) + + +func _on_provider_changed(index: int) -> void: + if index < 0 or index >= PROVIDER_ORDER.size(): + return + var provider_id: String = PROVIDER_ORDER[index] + var es := _settings() + if es != null: + es.set_setting(SETTING_PROVIDER, provider_id) + _ui_loading = true + if _tab_key_edit != null and is_instance_valid(_tab_key_edit): + _tab_key_edit.text = _decrypted_key(provider_id) + if _tab_model_edit != null and is_instance_valid(_tab_model_edit): + _tab_model_edit.text = _resolved_model(provider_id) + _ui_loading = false + _sync_provider_ui() + _log("vision routing: provider changed to %s (%s)" % [provider_id, PROVIDERS[provider_id].get("label", provider_id)]) + + +func _sync_provider_ui() -> void: + var provider_id := _active_provider_id() + var provider: Dictionary = PROVIDERS.get(provider_id, PROVIDERS["groq"]) + if _tab_provider != null and is_instance_valid(_tab_provider): + var provider_index := PROVIDER_ORDER.find(provider_id) + if provider_index != -1 and _tab_provider.selected != provider_index: + _tab_provider.select(provider_index) + if _tab_key_label != null and is_instance_valid(_tab_key_label): + _tab_key_label.text = str(provider.get("key_label", "API key")) + if _tab_key_hint != null and is_instance_valid(_tab_key_hint): + var hint := ( + "Stored encrypted (AES-256, key derived from this machine) in Editor Settings " + + "- not plain text, but local obfuscation only. You can also set the " + + "%s environment variable; it takes priority over this field." + ) % provider.get("env", "") + if OS.get_unique_id().is_empty(): + hint += " This machine reports no unique id, so keys cannot be stored locally - use the %s environment variable." % provider.get("env", "") + _tab_key_hint.text = hint + if _tab_key_edit != null and is_instance_valid(_tab_key_edit): + _tab_key_edit.placeholder_text = str(provider.get("placeholder", "")) + if _tab_model_label != null and is_instance_valid(_tab_model_label): + _tab_model_label.text = "Model id (required) - %s" % provider.get("label", provider_id) + if _tab_model_edit != null and is_instance_valid(_tab_model_edit): + _tab_model_edit.placeholder_text = str(provider.get("model_placeholder", "")) + _tab_model_edit.tooltip_text = "The vision model this provider should ping. Yours to maintain: when a model id retires, replace it here." + if _tab_model_hint != null and is_instance_valid(_tab_model_hint): + _tab_model_hint.text = ( + "Required per provider; empty behaves like an empty key (routing " + + "declines and screenshots pass through). Suggested id (as of " + + "2026-08 - check your provider console, ids retire): %s." + ) % provider.get("model_placeholder", "") + + +func _on_test_connection() -> void: + if _tab_status == null: + return + var provider_id := _active_provider_id() + var provider := _provider_with_model(provider_id) + var env_name := str(PROVIDERS.get(provider_id, PROVIDERS["groq"]).get("env", "")) + if str(provider.get("model", "")).is_empty(): + _tab_status.text = "No model id set for %s - add one below." % provider.get("label", provider_id) + return + var api_key := _resolved_api_key(provider_id) + if api_key.is_empty(): + _tab_status.text = "No key set - add one below or set %s." % env_name + return + var running: Thread = _threads.get("_test") + if running != null and running.is_started() and running.is_alive(): + return + var previous_status := _tab_status.text + _tab_status.text = "Testing..." + if _tab_test_button != null and is_instance_valid(_tab_test_button): + _tab_test_button.disabled = true + var key_source := "stored key" + if not OS.get_environment(env_name).is_empty(): + key_source = "via %s" % env_name + var thread := Thread.new() + _threads["_test"] = thread + var start_err := thread.start(_ping_worker.bind(provider, api_key, _tab_status, key_source)) + if start_err != OK: + ## A failed thread start must not leave the button disabled and the + ## status stuck on "Testing..." forever. + _threads.erase("_test") + _tab_status.text = previous_status + if _tab_test_button != null and is_instance_valid(_tab_test_button): + _tab_test_button.disabled = false + _log("vision routing: could not start ping thread: %s" % error_string(start_err)) + + +func _on_enable_toggled(enabled: bool) -> void: + var es := _settings() + if es != null: + es.set_setting(SETTING_ENABLED, enabled) + _sync_ui_states() + + +func _sync_ui_states() -> void: + var enabled := is_routing_enabled() + if _tab_enable != null and is_instance_valid(_tab_enable) and _tab_enable.button_pressed != enabled: + _tab_enable.set_pressed_no_signal(enabled) + + +# --- logging -------------------------------------------------------------------- + +func _log(message: String) -> void: + if log_buffer != null and is_instance_valid(log_buffer) and log_buffer.has_method("log"): + log_buffer.log(message, false) diff --git a/addons/godot_ai/vision_routing.gd.uid b/addons/godot_ai/vision_routing.gd.uid new file mode 100644 index 0000000..c4c5bc2 --- /dev/null +++ b/addons/godot_ai/vision_routing.gd.uid @@ -0,0 +1 @@ +uid://dp444q4ocpx45 diff --git a/build-theme.ps1 b/build-theme.ps1 new file mode 100644 index 0000000..aaac755 --- /dev/null +++ b/build-theme.ps1 @@ -0,0 +1,142 @@ +param( + [string]$ThemeId = "space-pixel", + [string]$ThemeSource = "", + [string]$OutputPath = "", + [string]$GodotExecutable = "", + [string]$ProgressPath = "", + [switch]$PreserveActiveTheme, + [switch]$InstallToDefaultUserPath, + [switch]$SkipValidation +) + +$ErrorActionPreference = "Stop" +$projectRoot = (Resolve-Path $PSScriptRoot).Path +. (Join-Path $projectRoot "tools\Resolve-GodotExecutable.ps1") +$GodotExecutable = Resolve-ThemeGodotExecutable -GodotExecutable $GodotExecutable + +if (-not [string]::IsNullOrWhiteSpace($ProgressPath)) { + if (-not [System.IO.Path]::IsPathRooted($ProgressPath)) { + $ProgressPath = Join-Path $projectRoot $ProgressPath + } + $ProgressPath = [System.IO.Path]::GetFullPath($ProgressPath) +} + +function Write-ThemeBuildProgress { + param( + [string]$Stage, + [string]$Message, + [int]$Percent, + [string]$Status = "running" + ) + if ([string]::IsNullOrWhiteSpace($ProgressPath)) { + return + } + $progressDirectory = [System.IO.Path]::GetDirectoryName($ProgressPath) + New-Item -ItemType Directory -Force -Path $progressDirectory | Out-Null + $payload = [ordered]@{ + ThemeId = $ThemeId + Stage = $Stage + Message = $Message + Percent = [Math]::Max(0, [Math]::Min(100, $Percent)) + Status = $Status + OutputPath = $OutputPath + UpdatedAtUtc = [DateTime]::UtcNow.ToString("o") + } + $json = $payload | ConvertTo-Json -Compress + [System.IO.File]::WriteAllText($ProgressPath, $json, [System.Text.UTF8Encoding]::new($false)) +} + +$activeStatePath = Join-Path $projectRoot "build\active-theme.json" +$activeStateExisted = Test-Path -LiteralPath $activeStatePath +$preservedActiveState = if ($PreserveActiveTheme -and $activeStateExisted) { + [System.IO.File]::ReadAllBytes($activeStatePath) +} else { + $null +} + +try { +Write-ThemeBuildProgress -Stage "select" -Message "Selecting theme source" -Percent 5 + +& (Join-Path $PSScriptRoot "tools\Select-Theme.ps1") -ThemeId $ThemeId -ThemeSource $ThemeSource +$activeState = Get-Content -LiteralPath $activeStatePath -Raw -Encoding UTF8 | ConvertFrom-Json +$packageRoot = [System.IO.Path]::GetFullPath([string]$activeState.Package) + +$buildDirectory = Join-Path $PSScriptRoot "build" +New-Item -ItemType Directory -Force -Path $buildDirectory | Out-Null +if ([string]::IsNullOrWhiteSpace($OutputPath)) { + $OutputPath = Join-Path $buildDirectory ($ThemeId + ".pck") +} elseif (-not [System.IO.Path]::IsPathRooted($OutputPath)) { + $OutputPath = Join-Path $PSScriptRoot $OutputPath +} +$OutputPath = [System.IO.Path]::GetFullPath($OutputPath) +Write-ThemeBuildProgress -Stage "prepare" -Message "Preparing isolated build workspace" -Percent 12 + +$workspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $projectRoot ("build\theme-workspaces\" + $ThemeId + "-build"))) +$allowedWorkspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $projectRoot "build\theme-workspaces")) +try { + & (Join-Path $projectRoot "tools\Prepare-ThemeWorkspace.ps1") -PackageRoot $packageRoot -WorkspaceRoot $workspaceRoot + + Write-ThemeBuildProgress -Stage "import" -Message "Importing theme resources in Godot" -Percent 25 + & $GodotExecutable --headless --path $workspaceRoot --import + if ($LASTEXITCODE -ne 0) { + throw "Godot failed to import the selected theme." + } + if (-not $SkipValidation) { + Write-ThemeBuildProgress -Stage "validate" -Message "Validating manifest, scenes, and bindings" -Percent 45 + & $GodotExecutable --headless --path $workspaceRoot --script res://tools/validate_theme.gd -- --contract res://contracts/screen_bindings.v2.json + if ($LASTEXITCODE -ne 0) { + throw "The selected theme does not satisfy the full-scene binding contract." + } + } + + Write-ThemeBuildProgress -Stage "export" -Message "Exporting production resources to PCK" -Percent 62 + & $GodotExecutable --headless --path $workspaceRoot --export-pack "Theme DLC" $OutputPath + if ($LASTEXITCODE -ne 0 -or -not (Test-Path -LiteralPath $OutputPath)) { + throw "Godot failed to build the theme DLC package." + } + + Write-ThemeBuildProgress -Stage "verify" -Message "Verifying packaged interactive pet" -Percent 84 + & $GodotExecutable --headless --path $projectRoot --script res://tools/verify_interactive_pet.gd -- --pack $OutputPath --optional + if ($LASTEXITCODE -ne 0) { + throw "Packaged interactive pet verification failed for theme '$ThemeId'." + } +} finally { + if ( + (Test-Path -LiteralPath $workspaceRoot) -and + $workspaceRoot.StartsWith($allowedWorkspaceRoot + [System.IO.Path]::DirectorySeparatorChar, [System.StringComparison]::OrdinalIgnoreCase) + ) { + Remove-Item -LiteralPath $workspaceRoot -Recurse -Force + } + if ((Test-Path -LiteralPath $allowedWorkspaceRoot) -and @(Get-ChildItem -LiteralPath $allowedWorkspaceRoot -Force).Count -eq 0) { + Remove-Item -LiteralPath $allowedWorkspaceRoot -Force + } +} + +Write-ThemeBuildProgress -Stage "finalize" -Message "Finalizing local theme package" -Percent 93 +$activeOutputPath = Join-Path $buildDirectory "active_theme.pck" +if (-not $PreserveActiveTheme -and $OutputPath -ne $activeOutputPath) { + Copy-Item -LiteralPath $OutputPath -Destination $activeOutputPath -Force +} + +if ($InstallToDefaultUserPath) { + Write-ThemeBuildProgress -Stage "install" -Message "Installing PCK into the Exchanger user directory" -Percent 97 + $installDirectory = Join-Path $env:APPDATA "Godot\app_userdata\Exchanger\theme_dlc" + New-Item -ItemType Directory -Force -Path $installDirectory | Out-Null + Copy-Item -LiteralPath $OutputPath -Destination (Join-Path $installDirectory "active_theme.pck") -Force + Write-Host "Theme '$ThemeId' installed into the Exchanger user directory." +} else { + Write-Host "Theme '$ThemeId' built: $OutputPath" +} +Write-ThemeBuildProgress -Stage "complete" -Message "Theme build completed" -Percent 100 -Status "complete" +} catch { + Write-ThemeBuildProgress -Stage "error" -Message $_.Exception.Message -Percent 100 -Status "error" + throw +} finally { + if ($PreserveActiveTheme) { + if ($activeStateExisted) { + [System.IO.File]::WriteAllBytes($activeStatePath, $preservedActiveState) + } elseif (Test-Path -LiteralPath $activeStatePath) { + Remove-Item -LiteralPath $activeStatePath -Force + } + } +} diff --git a/contracts/screen_bindings.v2.json b/contracts/screen_bindings.v2.json new file mode 100644 index 0000000..657e795 --- /dev/null +++ b/contracts/screen_bindings.v2.json @@ -0,0 +1,3929 @@ +{ + "Format": "ExchangerThemeBindingContract", + "Version": 2, + "ScreenMetadataKey": "exchanger_screen_binding_id", + "ElementMetadataKey": "exchanger_binding_id", + "Source": "Immutable Exchanger ThemeView contract: host binds existing theme-owned nodes only", + "Screens": [ + { + "BindingId": "screen.home", + "Key": "home", + "RootName": "ThemeScreen_Home", + "Path": "res://exchanger_theme_dlc/scenes/screen_home.tscn", + "Bindings": [ + { + "Id": "home.scroll.content.footer.margin.content.brand", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Brand" + }, + { + "Id": "home.scroll.content.speech_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SpeechText" + }, + { + "Id": "home.scroll.content.price_panel.margin.content.price", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.cash_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CashButton" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.card_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CardButton" + }, + { + "Id": "home.scroll.content.footer.margin.content.support", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Support" + }, + { + "Id": "home.scroll.content.stock_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus" + }, + { + "Id": "home.scroll.content.stock_status.state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus/Margin/Content/State" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status.label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin/Label" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.poster", + "Types": [ + "TextureRect" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/Poster" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.video_player", + "Types": [ + "VideoStreamPlayer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/VideoPlayer" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.fallback_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/FallbackLabel" + } + ] + }, + { + "BindingId": "screen.cash_payment", + "Key": "cash_payment", + "RootName": "ThemeScreen_CashPayment", + "Path": "res://exchanger_theme_dlc/scenes/screen_cash_payment.tscn", + "Bindings": [ + { + "Id": "cash_payment.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "cash_payment.content.summary.margin.values.balance", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Balance" + }, + { + "Id": "cash_payment.content.summary.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Tokens" + }, + { + "Id": "cash_payment.content.summary.margin.values.bonus", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Bonus" + }, + { + "Id": "cash_payment.content.dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DispenseButton" + }, + { + "Id": "cash_payment.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "cash_payment.content.debug_panel.add10_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add10Button" + }, + { + "Id": "cash_payment.content.debug_panel.add50_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add50Button" + }, + { + "Id": "cash_payment.content.debug_panel.add100_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add100Button" + } + ] + }, + { + "BindingId": "screen.card_amount", + "Key": "card_amount", + "RootName": "ThemeScreen_CardAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_amount.tscn", + "Bindings": [ + { + "Id": "card_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot13" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot12" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot11" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot10" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot09" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot08" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot07" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot06" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot05" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot04" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot03" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot02" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot01" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot00" + }, + { + "Id": "card_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_amount.content.reward_panel.content.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/RewardPanel/Content/Value" + }, + { + "Id": "card_amount.content.selection_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/SelectionLabel" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.other_amount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/OtherAmountButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid", + "Types": [ + "GridContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot14" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot15" + } + ] + }, + { + "BindingId": "screen.card_custom_amount", + "Key": "card_custom_amount", + "RootName": "ThemeScreen_CardCustomAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_custom_amount.tscn", + "Bindings": [ + { + "Id": "card_custom_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit7" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit6" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit5" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit4" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit3" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit2" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit1" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit0" + }, + { + "Id": "card_custom_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/BackspaceButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/ClearButton" + }, + { + "Id": "card_custom_amount.content.hint", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Hint" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.input_value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/InputValue" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Tokens" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Amount" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit8" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.card_terminal", + "Key": "card_terminal", + "RootName": "ThemeScreen_CardTerminal", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_terminal.tscn", + "Bindings": [ + { + "Id": "card_terminal.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_terminal.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "card_terminal.content.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Amount" + }, + { + "Id": "card_terminal.content.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Tokens" + }, + { + "Id": "card_terminal.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "card_terminal.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "card_terminal.content.debug_panel.approve_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ApproveButton" + }, + { + "Id": "card_terminal.content.debug_panel.decline_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DeclineButton" + }, + { + "Id": "card_terminal.content.debug_panel.dispense_failure_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DispenseFailureButton" + }, + { + "Id": "card_terminal.content.debug_panel.partial_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/PartialDispenseButton" + }, + { + "Id": "card_terminal.content.debug_panel.connection_loss_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ConnectionLossButton" + } + ] + }, + { + "BindingId": "screen.success", + "Key": "success", + "RootName": "ThemeScreen_Success", + "Path": "res://exchanger_theme_dlc/scenes/screen_success.tscn", + "Bindings": [ + { + "Id": "success.content.result_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Title" + }, + { + "Id": "success.content.result_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Body/Message" + }, + { + "Id": "success.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "success.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.error", + "Key": "error", + "RootName": "ThemeScreen_Error", + "Path": "res://exchanger_theme_dlc/scenes/screen_error.tscn", + "Bindings": [ + { + "Id": "error.content.error_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Title" + }, + { + "Id": "error.content.error_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Body/Message" + }, + { + "Id": "error.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "error.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.service_access", + "Key": "service_access", + "RootName": "ThemeScreen_ServiceAccess", + "Path": "res://exchanger_theme_dlc/scenes/screen_service_access.tscn", + "Bindings": [ + { + "Id": "service_access.content.header", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Header" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit7" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit6" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit5" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit4" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit3" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit2" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit1" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit8" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit0" + }, + { + "Id": "service_access.content.access_panel.fields.enter_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/EnterButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.erase", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Erase" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.clear", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Clear" + }, + { + "Id": "service_access.content.access_panel.fields.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Status" + }, + { + "Id": "service_access.content.access_panel.fields.pin_display", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinDisplay" + }, + { + "Id": "service_access.content.access_panel.fields.pin_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinLabel" + }, + { + "Id": "service_access.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Description" + }, + { + "Id": "service_access.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.settings", + "Key": "settings", + "RootName": "ThemeScreen_Settings", + "Path": "res://exchanger_theme_dlc/scenes/screen_settings.tscn", + "Bindings": [ + { + "Id": "settings.scroll.content.section_tabs.general_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/GeneralButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Threshold" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/EmptyState" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/LimitsError" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.custom_step", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/CustomStep" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.max_amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/MaxAmount" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.card_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CardEnabled" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.cash_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CashEnabled" + }, + { + "Id": "settings.scroll.content.preview_panel.margin.content.values", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel/Margin/Content/Values" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.add_rule_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/AddRuleButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.price", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.test_sound_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/TestSoundButton" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.mute", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/Mute" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.add_preset_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/AddPresetButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.presets_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetsError" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.idle", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Idle" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cash_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashPayment" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.poster_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/PosterPath" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackError" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackText" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.muted", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Muted" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.reset_pin_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/ResetPinButton" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.support_phone", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.short_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhoneError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortTextError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationNameError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.success", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Success" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cashless_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashlessPayment" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.application_name", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/ConfirmButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/CancelButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Amount" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel" + }, + { + "Id": "settings.scroll.content.test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel" + }, + { + "Id": "settings.scroll.content.advertisement_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel" + }, + { + "Id": "settings.scroll.content.master_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel" + }, + { + "Id": "settings.scroll.content.security_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel" + }, + { + "Id": "settings.scroll.content.branding_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel" + }, + { + "Id": "settings.scroll.content.section_tabs.diagnostics_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/DiagnosticsButton" + }, + { + "Id": "settings.scroll.content.section_tabs.equipment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/EquipmentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.service_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/ServiceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.payment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PaymentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.pricing_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PricingButton" + }, + { + "Id": "settings.scroll.content.section_tabs.appearance_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AppearanceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.advertisement_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AdvertisementButton" + }, + { + "Id": "settings.scroll.content.section_tabs.audio_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AudioButton" + }, + { + "Id": "settings.scroll.content.branding_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel" + }, + { + "Id": "settings.scroll.content.preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Description" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Title" + }, + { + "Id": "settings.service_dialog_overlay", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/RecountButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/RecountButton" + }, + { + "Id": "settings.scroll.content.bonus_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel" + }, + { + "Id": "settings.scroll.content.equipment_window_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel" + }, + { + "Id": "settings.scroll.content.timeouts_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel" + }, + { + "Id": "settings.scroll.content.card_options_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel" + }, + { + "Id": "settings.scroll.content.payment_methods_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.count", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Count" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/AddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Error" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_32", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_32" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_31", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_31" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_30", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_30" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_29", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_29" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_28", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_28" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_27", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_27" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_26", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_26" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_25", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_25" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/LanguageButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_24", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_24" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_22", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_22" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_21", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_21" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_20", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_20" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_19", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_19" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_18", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_18" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_17", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_17" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_16", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_16" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_15" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_14" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_23", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_23" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_13" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/ShiftButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/BackspaceButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/BackspaceButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit9" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit8" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit7" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/SymbolsButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit6" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit4" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit3" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit2" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit1" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit0" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/SpaceButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretRightButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretLeftButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit5" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_12" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_10" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.minimum_level", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MinimumLevel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.recent_errors", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RecentErrors" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.runtime_summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RuntimeSummary" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.target_fps", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/TargetFps" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.debug_window", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/DebugWindow" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.borderless", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Borderless" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.fullscreen", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Fullscreen" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.connection_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ConnectionError" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.reconnect_seconds", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ReconnectSeconds" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.max_file_size", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MaxFileSize" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.baud_rate", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/BaudRate" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortName" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.use_mock", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/UseMock" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel.margin.content.current_theme", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content/CurrentTheme" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel.margin.content.reduced_effects", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content/ReducedEffects" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.package_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PackageStatus" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.path_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PathError" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalPath" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalEnabled" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel.margin.content.summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content/Summary" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_11" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.retention_days", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/RetentionDays" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_09" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_08" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_07" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_06" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_05" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_04" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_03" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_02" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_01" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.logging_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/LoggingError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_00" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/RecountButton" + }, + { + "Id": "settings.scroll.content", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content" + }, + { + "Id": "settings.scroll.content.section_tabs", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs" + }, + { + "Id": "settings.scroll.content.header.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header/Margin/Content/Title" + }, + { + "Id": "settings.scroll.content.header", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard" + }, + { + "Id": "settings.scroll", + "Types": [ + "ScrollContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseStatus" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/ManualAddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Error" + } + ] + } + ] +} diff --git a/docs/APPLY_THEME.md b/docs/APPLY_THEME.md new file mode 100644 index 0000000..a1450e5 --- /dev/null +++ b/docs/APPLY_THEME.md @@ -0,0 +1,162 @@ +# Как применить тему в Exchanger + +Эта инструкция описывает полный пользовательский путь: от выбора и редактирования темы до +установки нового PCK в Exchanger. + +Важно различать действия: + +- `Редактор → Выбрать тему` и `activate-theme.ps1` выбирают тему только для builder-preview; +- `Редактор → Экспортировать тему` позволяет выбрать любую тему по ID и создаёт указанный + пользователем `.pck`, но не устанавливает его и не переключает preview; +- `Редактор → Применить тему к Exchanger` проверяет, собирает и устанавливает активную тему; +- `build-theme.ps1 -InstallToDefaultUserPath` выполняет ту же установку из PowerShell. + +## 1. Открыть проект + +Требуется Godot 4.7.x. Откройте проект `ExchangerThemeDlcBuilder` в Godot Editor, а PowerShell — +в корне проекта: + +```powershell +Set-Location 'E:\Danil\Projects\Godot\ExchangerThemeDlcBuilder' +``` + +Скрипты автоматически ищут Godot среди запущенных процессов, команд `godot`/`godot4` в `PATH` и +переменных `GODOT4_EXECUTABLE`/`GODOT_EXECUTABLE`. + +## 2. Выбрать тему для preview + +В Godot Editor выберите `Редактор → Выбрать тему`, укажите нужную тему и подтвердите выбор. + +Эквивалентная команда для `space-pixel`: + +```powershell +.\activate-theme.ps1 -ThemeId space-pixel +``` + +Активация записывает выбранный package в `build/active-theme.json`. Она не собирает PCK и не +изменяет установленную тему Exchanger. + +## 3. Редактировать production-файлы + +Редактируйте файлы непосредственно в: + +```text +themes//package/ +``` + +Основные каталоги и файлы: + +- `scenes/` — девять экранов приложения; +- `components/` — общие компоненты темы; +- `assets/` — изображения, шрифты и звук; +- `visuals/` — дополнительные визуальные ресурсы; +- `ui_theme.tres` — стили элементов интерфейса; +- `background_decoration.tscn` — отдельная фоновая декорация. + +`source/` используется для оригиналов и references, но в production PCK не экспортируется. + +Все зависимости внутри `package/` должны оставаться переносимыми. Используйте относительные +ссылки, например `../ui_theme.tres` или `../assets/button.png`. Ссылки вида +`res://themes//package/...` могут открываться в builder, но не разрешатся в изолированном +workspace сборки, где package монтируется как `res://exchanger_theme_dlc/`. + +## 4. Проверить preview + +Запустите проект из Godot либо выполните: + +```powershell +.\preview-theme.ps1 -ThemeId space-pixel +``` + +Preview показывает реальные production-сцены без изменения их визуального дерева. Проверьте все +девять вкладок: `HOME`, `CASH`, `SUM`, `KEYPAD`, `CARD`, `SUCCESS`, `ERROR`, `SERVICE`, `SETTINGS`. + +Сначала включите `BINDINGS: ON`, чтобы проверить размеченные функциональные элементы, затем +выключите overlay и проверьте внешний вид в портретном окне `720×1280`. В SETTINGS дополнительно +проверьте состояния `KEYBOARD: OFF/TEXT/NUM` и `INVENTORY: OFF/PANEL/DIALOG`. + +Сохранённые изменения `.tscn`, `.tres`, JSON, изображений, шрифтов и звука обычно появляются через +live reload. Если этого не произошло, убедитесь, что активирована правильная тема, сохраните файл +на диск и перезапустите preview. + +## 5. Выполнить автоматические проверки + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId space-pixel +``` + +Первая команда проверяет byte-identical копии binding-контракта во всех темах. Вторая создаёт +изолированный workspace, импортирует ресурсы, проверяет manifest v2, девять сцен, обязательные +биндинги и запрещённые production-узлы, а затем выполняет headless preview smoke. + +Не переходите к установке, пока обе команды не завершатся успешно. + +## 6. Закрыть Exchanger + +Полностью закройте запущенное приложение перед заменой PCK. Live reload действует только в +builder-preview; Exchanger загружает внешний пакет при запуске. + +## 7. Собрать и установить тему + +Предпочтительный интерактивный путь: закройте Exchanger и выберите в Godot Editor +`Редактор → Применить тему к Exchanger`. Подтверждение показывает ID активной темы и конечный +путь. Сборка идёт в фоне; по завершении аддон сообщает об успехе либо показывает последние строки +ошибки PowerShell. Во время работы видны текущий этап и процент выполнения. + +Эквивалентная команда: + +```powershell +.\build-theme.ps1 -ThemeId space-pixel -InstallToDefaultUserPath +``` + +Команда валидирует тему, собирает `build/space-pixel.pck`, обновляет совместимую копию +`build/active_theme.pck` и устанавливает пакет по пути: + +```text +%APPDATA%\Godot\app_userdata\Exchanger\theme_dlc\active_theme.pck +``` + +Команда без `-InstallToDefaultUserPath` только создаёт PCK в `build/`; в Exchanger такая сборка +автоматически не попадёт. + +## 8. Перезапустить и проверить Exchanger + +Запустите Exchanger заново и проверьте все затронутые экраны и интерактивные элементы. В журнале +должны быть указаны ожидаемые `ThemeId` и manifest версии 2. + +Если приложение показывает встроенную fallback-тему: + +1. убедитесь, что Exchanger был полностью перезапущен; +2. проверьте наличие установленного `active_theme.pck` по пути выше; +3. повторите validator и сборку без `-SkipValidation`; +4. проверьте журнал ThemeManager на ошибку manifest, контракта, binding-id или отсутствующего + ресурса. + +## Короткий ежедневный цикл + +После редактирования темы выполните: + +```powershell +.\activate-theme.ps1 -ThemeId space-pixel +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId space-pixel +``` + +Затем закройте Exchanger, установите новую сборку и запустите приложение заново: + +```powershell +.\build-theme.ps1 -ThemeId space-pixel -InstallToDefaultUserPath +``` + +## Выполнение через VS Code + +Откройте палитру команд `Ctrl+Shift+P`, выберите `Tasks: Run Task` и последовательно запустите: + +1. `Theme: активировать`; +2. `Theme: проверить копии контракта`; +3. `Theme: проверить validator и preview smoke`; +4. после закрытия Exchanger — `Theme: собрать и установить PCK (заменяет установленную тему)`. + +Задача `Theme: полный локальный QA` выполняет проверки и обычную сборку, но не устанавливает PCK +в пользовательский каталог Exchanger. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..adccbb5 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,92 @@ +# Архитектура и границы ответственности + +## Общая модель + +Theme Builder создаёт полные доверенные тематические сцены. Exchanger загружает PCK, проверяет +manifest и binding-контракт, создаёт тематическую сцену экрана и подключает свою C#-логику к +узлам по metadata. Фактическая иерархия, визуальные эффекты и GDScript-логика темы свободны, пока +соблюдены обязательные ID и типы. + +```text +themes//package ───────────────> preview gallery + binding overlay + │ + └── temporary build workspace/exchanger_theme_dlc + ├── validator + └── export ──> build/.pck ──install──> Exchanger userdata +``` + +## Дерево проекта + +```text +themes/ +├── example/ +│ ├── source/ исходные материалы будущей темы +│ └── package/ полный безопасный шаблон v2 +├── space-pixel/ текущая оформленная тема для preview +└── / + ├── source/ оригиналы, лицензии, references + └── package/ + ├── manifest.json + ├── contracts/screen_bindings.v2.json + ├── scenes/ девять production-сцен + ├── assets/ runtime-копии изображений/шрифтов/аудио + ├── components/ вложенные сцены и runtime-компоненты темы + ├── scripts/ GDScript доверенной темы + ├── visuals/ необязательные визуальные фрагменты + ├── ui_theme.tres + └── background_decoration.tscn +contracts/ авторитетная копия builder-контракта +tools/preview/ галерея, live reload и overlay +addons/exchanger_theme_manager/ EditorPlugin выбора/создания тем +build/ PCK, active-theme.json и временные build-workspaces +``` + +`themes_src/` и `preview_scenes/` — архив ранней partial-theme модели. Они не являются источником +новой разработки и не входят в PCK. Для новых задач используйте только `themes/` и +`tools/preview/`. + +Каталоги тем не содержат `.gdignore` и всегда индексируются Godot, поэтому все исходники +`themes//package/` доступны в FileSystem. `Exchanger Theme Manager` использует те же видимые +каталоги для списка тем, а preview инстанцирует сцены выбранного package напрямую. Внутренние +зависимости package записываются относительными путями, поэтому каждая открытая сцена использует +ресурсы своей темы. Сгенерированные `.import`/`.uid` не копируются в новую тему. При сборке +обычные `.import` создаются заново, но sidecar-файлы шрифтов `.ttf`, `.otf`, `.woff` и `.woff2` +переносятся с заменой package-пути на runtime-путь: так сохраняются заданные автором antialiasing, +hinting, subpixel positioning и oversampling. Затем package временно копируется под namespace +`res://exchanger_theme_dlc/`; export preset включает только этот namespace и его зависимости. + +Каждая production-сцена является полным визуальным корнем: на её root назначен package +`ui_theme.tres`, а фон и decoration-сцена находятся внутри её дерева перед +функциональным содержимым. Root помечен `exchanger_self_contained_visuals = true`. Preview не +назначает сцене Theme, не добавляет фон/декорации и не монтирует демонстрационные дочерние узлы — +только инстанцирует девять сцен во вкладки. `UiThemePath` остаётся описанием package Theme, а +legacy `BackgroundTexturePath` и `BackgroundDecorationPath` у +самодостаточной темы пусты, чтобы Exchanger не нарисовал тот же chrome второй раз. + +## Что принадлежит Theme Builder + +- композиция и стили девяти экранов; +- фон, анимации, шейдеры, частицы и другие визуальные эффекты; +- собственный GDScript и theme-owned runtime-компоненты; +- package-ресурсы и manifest; +- preview, binding overlay, validator и build scripts; +- локальные исходные материалы и документация темы. + +## Что принадлежит Exchanger + +- навигация и состояние пользовательского потока; +- оплата, выдача, COM-протокол и оборудование; +- сохранение и проверка настроек, PIN, таймеры и аудио-сервисы; +- управление данными готовых theme-owned Home-узлов: остаток жетонов, подключение и промо; +- загрузчик PCK, fallback-тема и авторитет поддерживаемой версии host-контракта. + +Соседний Exchanger требуется только для обновления/проверки host-контракта и финального +интеграционного QA. Обычная визуальная разработка темы автономна. + +## Доверенный PCK + +В export preset перечислены только ресурсы временной package-копии и их зависимости. Production- +сцены не ограничены пассивными узлами: GDScript, `Timer`, `AudioStreamPlayer*`, `HTTPRequest`, +шейдеры и прочие стандартные возможности Godot разрешены. `source/`, references, docs, preview и +builder tooling не экспортируются. Host продолжает сверять SHA-256 package-копии контракта и при +ошибке структуры экранов или биндингов возвращается к встроенной fallback-теме. diff --git a/docs/BINDING_CONTRACT.md b/docs/BINDING_CONTRACT.md new file mode 100644 index 0000000..6259ca2 --- /dev/null +++ b/docs/BINDING_CONTRACT.md @@ -0,0 +1,367 @@ +# Manifest v2 и binding-контракт + +## Зачем нужны биндинги + +Тема управляет внешним видом и может выполнять собственный доверенный GDScript. Exchanger находит +нужную кнопку, Label или поле по `exchanger_binding_id`, проверяет класс узла и подключает +app-owned обработчик. Поэтому автор темы может свободно менять иерархию, имена и внутреннюю логику, +но не ID и требуемый тип обязательных узлов. + +## Manifest v2 + +`themes//package/manifest.json` содержит `Format: ExchangerThemeDlc`, `FormatVersion: 2` и +ровно девять `ScreenScenes`: + +| Screen binding | Файл | Имя корня | +| --- | --- | --- | +| `screen.home` | `screen_home.tscn` | `ThemeScreen_Home` | +| `screen.cash_payment` | `screen_cash_payment.tscn` | `ThemeScreen_CashPayment` | +| `screen.card_amount` | `screen_card_amount.tscn` | `ThemeScreen_CardAmount` | +| `screen.card_custom_amount` | `screen_card_custom_amount.tscn` | `ThemeScreen_CardCustomAmount` | +| `screen.card_terminal` | `screen_card_terminal.tscn` | `ThemeScreen_CardTerminal` | +| `screen.success` | `screen_success.tscn` | `ThemeScreen_Success` | +| `screen.error` | `screen_error.tscn` | `ThemeScreen_Error` | +| `screen.service_access` | `screen_service_access.tscn` | `ThemeScreen_ServiceAccess` | +| `screen.settings` | `screen_settings.tscn` | `ThemeScreen_Settings` | + +Каждый файл находится в `res://exchanger_theme_dlc/scenes/`. Корень — `Control` с metadata +`exchanger_screen_binding_id = screen.`. + +Manifest может дополнительно объявить интерактивного питомца: + +```json +"InteractivePetScene": "res://exchanger_theme_dlc/components/interactive_pet.tscn" +``` + +Поле необязательно. Если оно задано, путь обязан находиться внутри +`res://exchanger_theme_dlc/`, указывать на существующую `.tscn`, а корень сцены должен наследовать +`Node2D` и реализовывать нейтральный pet API из [SCRIPTING.md](SCRIPTING.md). Путь к самой сцене +задаётся manifest, а её изображения подключаются обычными resource-ссылками из любого каталога +внутри `package/`: имя папки с текстурами не является частью контракта. + +## Навигация питомца + +Если manifest объявляет `InteractivePetScene`, текущий Builder требует невидимую навигацию версии +1 во всех восьми production-сценах, кроме `screen.settings`. Host находит её только по metadata и +не анализирует имена узлов или геометрию визуальных `Control`: + +- единственный `Node2D`-корень: `exchanger_pet_navigation_root = true`, + `exchanger_pet_navigation_version = 1`, `exchanger_pet_default_surface_id` и + `exchanger_pet_roaming_bounds: Rect2`; +- горизонтальная поверхность — любой вложенный `Node2D` с `exchanger_pet_surface = true`, + уникальным `exchanger_pet_surface_id`, числовыми `exchanger_pet_surface_from_x`, + `exchanger_pet_surface_to_x`, `exchanger_pet_surface_y` и необязательным + `exchanger_pet_surface_sit_points: PackedFloat32Array`; +- вертикальный переход — любой вложенный `Node2D` с `exchanger_pet_climb_edge = true`, уникальным + `exchanger_pet_climb_edge_id`, ссылками `exchanger_pet_climb_from_surface_id` / + `exchanger_pet_climb_to_surface_id`, координатами `exchanger_pet_climb_x`, +`exchanger_pet_climb_from_y`, `exchanger_pet_climb_to_y` и стороной + `exchanger_pet_climb_side = left|right`. + +Climb edge является двунаправленной связью: `from`/`to` фиксируют две стыкуемые поверхности и +соответствующие им Y, но host может пройти её вверх или вниз и выбрать прямую анимацию по +фактическому направлению движения. + +Все координаты задаются в локальной системе соответствующего экрана и обозначают реальные +экранные точки контакта, +а не позицию верхнего левого угла сцены питомца. Host получает смещение лап через optional +`get_pet_ground_offset()` и размещает root по формуле +`contact_point - ground_offset * runtime_scale`. Поверхностями могут быть пол, верхние грани +кнопок и окон; climb edges явно связывают их в граф. Навигационные `Node2D` ничего не рисуют и не +меняют визуальное дерево/геометрию `Control`. Host сохраняет ограниченный fallback для старых тем +без v1-маркеров, но новая тема с питомцем без полного набора восьми графов не проходит Builder +Validator. + +Builder дополнительно требует `exchanger_self_contained_visuals = true`: это не binding для +бизнес-логики, а признак того, что root сам применяет package Theme и содержит фон/decoration. +Preview не монтирует оформление и не изменяет дерево production-сцены. + +## Каталог 481 элемента + +`contracts/screen_bindings.v2.json` — авторитетная копия builder. Для каждого экрана она хранит +ID, допустимый Godot-класс, обязательность и fallback path host. Каждый package содержит точную +байтовую копию в `package/contracts/screen_bindings.v2.json`; host сверяет SHA-256 до загрузки сцен. + +Текущий immutable-контракт: + +| Экран | Биндингов в JSON | +| --- | ---: | +| `screen.home` | 14 | +| `screen.cash_payment` | 9 | +| `screen.card_amount` | 22 | +| `screen.card_custom_amount` | 18 | +| `screen.card_terminal` | 11 | +| `screen.success` | 4 | +| `screen.error` | 4 | +| `screen.service_access` | 19 | +| `screen.settings` | 380 | +| **Всего** | **481** | + +Все 481 записи имеют `Required: true`. SHA-256 канонического файла: +`DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`. + +На нужном узле задаётся metadata: + +```text +exchanger_binding_id = home.scroll.content.payment_panel.margin.content.buttons.cash_button +``` + +ID уникален во всём пакете. Допускается наследник указанного класса. Все визуальные узлы принадлежат +теме: Exchanger не добавляет, не удаляет, не переносит и не стилизует `Control` внутри ThemeView. +Host только подключает сигналы и обновляет данные, видимость и доступность существующих узлов. + +### Supplemental runtime bindings + +После фиксации immutable JSON приложению понадобились дополнительные готовые theme-owned узлы. +Чтобы не менять байтовый контракт выпущенных тем, их ID проверяются Builder Validator отдельно. +Для новой темы обязательны ещё 24 element-binding; два дополнительных compatible binding ниже +могут отсутствовать в уже выпущенной теме: + +| Экран | Binding ID | Требуемый тип | +| --- | --- | --- | +| Home | `home.scroll.content.advertisement_panel` | `Control` | +| Home | `home.scroll.content.stock_status.meter.empty` | `Control` | +| Home | `home.scroll.content.stock_status.meter.low` | `Control` | +| Home | `home.scroll.content.stock_status.meter.enough` | `Control` | +| Home | `home.scroll.content.stock_status.meter.much` | `Control` | +| Home | `home.scroll.content.stock_status.approximate_count` | `Label` | +| CardAmount | `card_amount.content.reward_panel.content.bonus` | `Label` | +| CashPayment | `cash_payment.content.top_bar.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| CardAmount | `card_amount.content.top_bar.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| CardCustomAmount | `card_custom_amount.content.top_bar.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| CardTerminal | `card_terminal.content.top_bar.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| Success | `success.content.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| Error | `error.content.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| ServiceAccess | `service_access.content.home_navigation_button` | `Button` (`KeypadButton`; в `space-pixel` — `button_square`) | +| Settings | `settings.footer` | `PanelContainer` | +| Settings | `settings.footer.save_and_exit_button` | `Button` | +| Settings | `settings.scroll.content.footer_clearance` | `Control` | +| Settings | `settings.scroll.content.service_inventory_panel.margin.content.description` | `Label` | +| Settings | `settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled` | `CheckButton` | +| Settings | `settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled` | `CheckButton` | +| Settings | `settings.scroll.content.menu_visibility_panel` | `PanelContainer` | +| Settings | `settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status` | `CheckButton` | +| Settings | `settings.scroll.content.menu_visibility_panel.margin.content.show_right_character` | `CheckButton` | +| Settings | `settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block` | `CheckButton` | + +Полностью обновлённая тема содержит **509 element-binding**: 481 из JSON, 24 обязательных и четыре +optional supplemental. Metadata девяти корней `exchanger_screen_binding_id` считается отдельно. + +`tools/Sync-HostBindingContract.ps1` намеренно исключает эти 28 ID из генерируемого +immutable JSON, даже если host обращается к их каноническому `FallbackPath` через буквальный +`GetNode`. Иначе обычная синхронизация ошибочно превращала бы supplemental-узел в новый элемент +зафиксированного каталога и ломала обратную совместимость выпущенных тем. Полный список выше +одновременно защищён `Test-PackagedBindingContract.ps1`. + +Дополнительные compatible binding: + +| Экран | Binding ID | Требуемый тип | +| --- | --- | --- | +| CashPayment | `cash_payment.content.banner_text` | `Label` | +| Settings | `settings.scroll.content.animated_banner_texts_panel` | `Control` | +| Settings | `settings.scroll.content.advertisement_poster_panel.margin.content.select_button` | `Button` | +| Settings | `settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet` | `CheckButton` | + +`cash_payment.content.banner_text` — подпись нижней анимированной плашки с НЛО на экране +наличной оплаты. `settings.scroll.content.animated_banner_texts_panel` — готовая панель четырёх +полей настройки текстов нижних баннеров: наличные, выбор суммы картой, ручной ввод суммы и шаблон +таймера терминала. В последнем поле `{seconds}` заменяется текущим числом секунд. +`select_button` открывает системный выбор файла изображения для промо-блока, а +`show_interactive_pet` — готовый переключатель с подписью «ИНТЕРАКТИВНЫЙ ПИТОМЕЦ»: +он включает или отключает питомца активной темы. Если manifest не объявляет +`InteractivePetScene`, host делает этот переключатель недоступным, не меняя сохранённое +предпочтение владельца. Все четыре ID получают +встроенный fallback в ранее выпущенных PCK. + +`home_navigation_button` — готовая компактная theme-owned кнопка с изображением дома. Её основа +— `KeypadButton` (для `space-pixel` — `button_square`). На +CashPayment, CardAmount, CardCustomAmount и CardTerminal она стоит рядом с `BackButton`; на +Success, Error и ServiceAccess, где верхней кнопки «Назад» нет, занимает её обычное левое место. +Host только подключает безопасный возврат на Home. До завершения подтверждённой выдачи на Success +кнопка остаётся видимой, но недоступной. Старый PCK без ID получает встроенный fallback по +каноническому пути. + +Один дополнительный биндинг необязателен: + +| Экран | Binding ID | Тип для Builder Validator | +| --- | --- | --- | +| Home | `home.decoration.custom_text_block` | `Control` | +| Home | `home.decoration.right_character` | `TextureRect` | + +Если Home содержит пользовательскую речевую плашку и персонажа рядом с ней, назначьте +`home.decoration.custom_text_block` готовой группе из фона плашки и персонажа. Host одновременно +переключает эту группу и Label `home.scroll.content.speech_text`; он не создаёт и не перестраивает +визуальные узлы. Для совместимости со старыми темами можно оставить +`home.decoration.right_character` на самом персонаже: тогда host скроет персонажа и текст, но +старая тема не обязана скрывать отдельный фон речевой плашки. Если персонажа или плашки нет, не +создавайте пустые узлы только ради optional ID. + +### Что не является element-binding + +Не добавляйте вымышленные `exchanger_binding_id` для фоновой графики, частиц, анимационных +контроллеров или питомца. Для них используются другие точки интеграции: + +- production-сцена определяется через `ScreenScenes` и `exchanger_screen_binding_id` корня; +- интерактивный питомец подключается полем manifest `InteractivePetScene` и публичным pet API; +- составные действия питомца используют методы и сигналы composite API, а не binding metadata; +- поверхности, sit points и climb edges используют navigation v1 metadata; +- полностью автономные декоративные узлы не требуют связи с host. + +Практический процесс создания составного действия описан в +[COMPOSITE_PET_ANIMATIONS.md](COMPOSITE_PET_ANIMATIONS.md). + +Устаревшее описание приложения `subtitle` не входит в контракт и не должно создаваться темой. +Вместо него предусмотрена самостоятельная покупательская фраза: Label +`home.scroll.content.speech_text` расположен внутри авторской речевой плашки Home, а SETTINGS +содержит поле `...branding_panel...short_text`, Label ошибки `...short_text_error` и строку +предпросмотра `...branding_preview_panel...short_text`. Поле ограничено 48 символами; ни один из +этих ID не содержит `subtitle`. Переключатель SETTINGS по историческому ID +`...show_right_character` отображается пользователю как «ПОКАЗЫВАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ ТЕКСТ» и +управляет всей optional-группой, а не только персонажем. + +Home содержит готовые theme-owned Label состояния жетонов и подключения, а промо-блок — +`TextureRect`, `VideoStreamPlayer` и fallback-`Label`. `VideoStreamPlayer` не содержит +скрипта и управляется C#-логикой Exchanger через биндинг. + +Home также использует supplemental runtime bindings, которые валидатор проверяет отдельно от +481 элемента контракта: готовый root промо-панели, четыре визуальных состояния +полоски `home.scroll.content.stock_status.meter.empty/low/enough/much` и Label +`home.scroll.content.stock_status.approximate_count`. Тема заранее располагает состояние слева, +полоску по центру и приблизительный остаток справа; host меняет только текст и видимость. Полный +список supplemental ID приведён выше. + +На экране наличной оплаты итог разделён на три независимых обязательных `Label`: + +- `cash_payment.content.summary.margin.values.balance` — внесённая сумма в рублях, + например `1000 РУБЛЕЙ`; +- `cash_payment.content.summary.margin.values.tokens` — базовое количество жетонов без бонуса, + например `100 ЖЕТОНОВ`; +- `cash_payment.content.summary.margin.values.bonus` — бонус отдельным текстом, например + `+ 50 ЖЕТОНОВ\nВ ПОДАРОК`; если бонуса нет, host выводит `БЕЗ БОНУСА`. + +Не объединяйте рубли и жетоны в одном из этих узлов и не скрывайте `tokens` или `bonus`: Exchanger +заполняет все три значения независимо, а тема полностью определяет их положение и оформление. +Заголовок этой панели — «К ВЫДАЧЕ». + +Экран выбора карточной суммы использует ту же композицию базовых и бонусных жетонов: + +- `card_amount.content.reward_panel.content.value` — обязательный `Label` immutable-контракта по + прежнему пути `SafeMargin/Content/RewardPanel/Content/Value`; host выводит в нём только базовое + количество жетонов; +- `card_amount.content.reward_panel.content.bonus` — supplemental runtime `Label` по пути + `SafeMargin/Content/RewardPanel/Content/Bonus`; host выводит `+ N ЖЕТОНОВ\nВ ПОДАРОК` или + `БЕЗ БОНУСА`. + +`Value` располагается слева, `Bonus` — справа. Supplemental ID намеренно не входит в immutable +JSON-каталог из 481 элемента. Это сохраняет совместимость старых тем: если отдельного `Bonus` нет, +host использует legacy fallback и выводит совмещённый итог в существующем `Value`. Новые темы, +которые проходят текущий Builder Validator, обязаны содержать оба готовых theme-owned `Label`. + +Экран ручного ввода карточной суммы также разделяет платёжные данные: + +- `card_custom_amount.content.keypad_panel.content.input_value` — введённая сумма в рублях без + единиц измерения, например `1000`; это Label внутри поля под заголовком «ВВЕДИТЕ СУММУ»; +- `card_custom_amount.content.amount_panel.margin.values.amount` — базовое количество жетонов; +- `card_custom_amount.content.amount_panel.margin.values.tokens` — бонусные жетоны, например + `+ 50 ЖЕТОНОВ\nВ ПОДАРОК`; при отсутствии бонуса host выводит `БЕЗ БОНУСА`. + +Названия двух последних ID сохранены для совместимости существующих тем. Визуально оба верхних +Label относятся только к жетонам, располагаются слева и справа как на CashPayment; рубли выводятся +исключительно через `input_value`. + +Динамические коллекции представлены фиксированными слотами: + +- 16 кнопок `card_amount...preset_grid.slot_00..15`; +- 16 строк бонусов `settings...bonus_panel...rows.slot_00..15`; +- 16 строк готовых сумм `settings...preset_rows.slot_00..15`; +- 12 строк промо-роликов `settings...advertisement_playlist...rows.slot_00..11`. + +Ещё 57 биндингов относятся к двум theme-owned экранным клавиатурам SETTINGS: + +- текстовая панель с 33 фиксированными буквенными слотами в строках `12 + 11 + 10`; +- переключатели языка, регистра и спецсимволов, пробел, очистка, удаление и перемещение каретки; +- цифровая панель с десятью цифрами, очисткой и удалением; +- отдельная кнопка `СКРЫТЬ` в правом верхнем углу каждой панели. + +Обе панели существуют в production-сцене заранее и имеют `visible = false`. Exchanger может +показывать одну панель, менять текст/видимость отдельных клавиш и подключать `pressed`, но не +добавляет клавиши и не меняет их расположение. Все кнопки обязаны иметь `focus_mode = None`, +чтобы нажатие экранной клавиши не забирало фокус у редактируемого поля. + +Ещё 14 биндингов образуют theme-owned интерфейс учёта жетонов в SETTINGS: + +- кнопка вкладки `settings.scroll.content.section_tabs.service_button`; +- скрытая панель `settings.scroll.content.service_inventory_panel` с остатком, статусом и + действиями автоматического пересчёта/ручного добавления; +- два Label `...hopper1_label` и `...hopper2_label`, в которых host показывает точный остаток + соответствующего хоппера рядом с его названием; +- скрытый overlay `settings.service_dialog_overlay` с динамическими заголовком и описанием, + редактируемым `SpinBox amount`, отменой и подтверждением. + +Обе темы обязаны заранее содержать эту панель и диалог. Exchanger может менять значения, +`Visible`/`Disabled` и подключать сигналы, но не создаёт диалог, поля или кнопки и не изменяет +их геометрию. Значение `amount` не имеет текстового suffix, чтобы не обрезать многозначные числа. + +Помимо этих 14 каталогизированных ID, Builder требует в сервисной панели три +supplemental runtime-binding. `settings.scroll.content.service_inventory_panel.margin.content.description` +— это `Label` по каноническому пути +`SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Description`; host обновляет +его описание в зависимости от режима учёта. +`settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled` — это +`CheckButton` по каноническому пути +`SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/InventoryAccountingEnabled`, +расположенный сразу после `Description`, с подписью «УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ» и включённым +состоянием по умолчанию. Сразу после него расположен включённый по умолчанию `CheckButton` +`settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled` по каноническому +пути `SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/PurchaseLimitEnabled` с +подписью «НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА». Host подключает к готовым переключателям сохранение +режима учёта и ограничения продаж доступным остатком; создавать эти узлы в runtime нельзя. +Supplemental ID не входят в `contracts/screen_bindings.v2.json`, поэтому +число 481 и байтовый SHA-256 каталога не изменяются. + +Каждая строка целиком создана дизайнером и имеет binding root для переключения `Visible`, а её +поля, кнопка удаления и Label ошибки размечены отдельными индексированными ID. Неиспользуемые +слоты скрыты и поэтому не занимают место в Container. Для пустых коллекций предусмотрены +theme-owned `empty_state` Label. + +## Как читать overlay + +В preview включите `BINDINGS: ON`. Оранжевая рамка показывает геометрию размеченного узла, тёмная +подпись — точный ID, который увидит Exchanger. Подпись корня начинается с `screen.`. Наложение +подписей допустимо на плотных экранах и не влияет на PCK; для оценки композиции выключите overlay. + +На вкладке SETTINGS кнопка `KEYBOARD: OFF/TEXT/NUM` последовательно показывает скрытое, +текстовое и цифровое состояния. Это только диагностическое переключение `Visible` уже +существующих theme-owned панелей; preview не добавляет клавиатуру в production-сцену. +Кнопка `INVENTORY: OFF/PANEL/DIALOG` аналогично показывает готовую сервисную панель и диалог, +скрывая на время просмотра прочие секции SETTINGS и не меняя их дерево или геометрию. + +Если рамка отсутствует, у узла нет metadata. Если одна рамка неожиданно покрывает большую область, +binding назначен контейнеру, а не ожидаемому дочернему контролу — сверьте `Types` и `FallbackPath` +в JSON. + +## Синхронизация без рассинхронизации + +Обычная разработка темы не требует соседнего Exchanger: + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +``` + +При согласованном изменении C# host используйте точную папку Exchanger: + +```powershell +.\tools\Sync-HostBindingContract.ps1 -HostProject ..\exchanger +.\tools\Import-HostSceneTemplates.ps1 -HostProject ..\exchanger -ThemeIds example +.\tools\Sync-HostBindingContract.ps1 -HostProject ..\exchanger -Check +.\tools\Test-PackagedBindingContract.ps1 +``` + +`Sync-HostBindingContract.ps1` генерирует каталог из вызовов `GetNode(SafeMargin/...)` host и +копирует его во все packages. `Import-HostSceneTemplates.ps1` перезаписывает `package/scenes` у +указанных тем: не запускайте его для оформленной темы без резервной копии/осознанного плана +переноса дизайна. После миграции валидируйте `example` и каждую тему, затем обновите закреплённый +SHA-256 и тесты в Exchanger в рамках отдельной host-задачи. + +Нельзя вручную менять или переформатировать package-копию JSON: байтовый хеш изменится, даже если +смысл данных сохранится. diff --git a/docs/COMPOSITE_PET_ANIMATIONS.md b/docs/COMPOSITE_PET_ANIMATIONS.md new file mode 100644 index 0000000..67ff76f --- /dev/null +++ b/docs/COMPOSITE_PET_ANIMATIONS.md @@ -0,0 +1,347 @@ +# Композитные анимации питомца: гайд для дизайнера + +Композитное действие — это не один клип, а сценарий из нескольких анимаций, визуальных +преобразований и перемещений. Сценарий хранится в теме, поэтому каждый питомец может вести себя +по-своему, а Exchanger только предоставляет безопасные операции для экранной позиции, границ и +опор. + +Рабочий пример находится в сцене +[`interactive_pet.tscn`](../themes/space-pixel/package/components/interactive_pet.tscn) и скрипте +[`interactive_pet.gd`](../themes/space-pixel/package/scripts/interactive_pet.gd) темы +`space-pixel`. Нейтральный API полностью описан в [SCRIPTING.md](SCRIPTING.md), а разметка опор — +в [BINDING_CONTRACT.md](BINDING_CONTRACT.md). + +## Что делает дизайнер, а что делает приложение + +Тема определяет: + +- набор и имена кадровых анимаций; +- порядок клипов и число повторов; +- поворот персонажа и изменение масштаба его визуальной части; +- момент отключения обычной навигации, контактов с опорами, границ и пользовательского ввода; +- перемещение экранной точки контакта и выбор момента посадки; +- восстановление визуального состояния после завершения или отмены. + +Exchanger определяет: + +- уникальный `run_id` каждого запуска; +- фактическую экранную точку контакта питомца; +- границы текущего экрана и доступные опоры; +- применение политик движения; +- отмену устаревшего запуска при смене экрана, drag, выгрузке темы или конфликтующем действии. + +Композитное действие не получает доступ к внутренним узлам Exchanger. Оно работает только со +своей сценой и переданным объектом `runtime`. + +## 1. Подготовьте отдельные клипы + +Сначала каждый этап должен корректно проигрываться отдельно во вкладке `PET`. Для действия +инопланетянина `space-pixel` используются: + +| Этап | Клип | Режим | +| --- | --- | --- | +| Поворот из левой ориентации | `turn_left` | один цикл | +| Поворот из правой ориентации | `turn_right` | один цикл | +| Приближение | `come_closer` | один цикл | +| Основное действие | `action` | повторяемый | +| Падение | `falling` | повторяемый | +| Приземление | `landing` | один цикл | +| Ожидание | `idle` | зацикленный | + +Имена клипов принадлежат теме и могут отличаться. Приложение видит публичное действие +`interact`, а тему интересует, из каких собственных клипов оно состоит. + +Те же прямые анимации `landing` и `idle` используются host и вне composite-сценария: после +обычного `falling` при отпускании питомца или смене экрана host проигрывает одноразовый `landing`, +затем включает `idle`. Запрос `celebrate`, поступивший во время такого приземления, выполняется +после завершения `landing`. + +Перед сборкой сценария проверьте: + +- все ячейки sprite-sheet имеют одинаковый размер; +- точка контакта лап находится в одном месте каждого кадра; +- прозрачные поля не меняют видимый масштаб персонажа между кадрами; +- one-shot клипы не зациклены, а повторяемые клипы могут корректно начинаться заново; +- `get_pet_animation_frame_count()` и `get_pet_animation_frames_per_second()` возвращают реальные + значения: по ним вычисляется длительность цикла; +- все текстуры импортированы с nearest-фильтрацией, если тема использует pixel art. + +## 2. Отделите экранную позицию от визуального масштаба + +Рекомендуемая структура сцены: + +```text +InteractivePet (Node2D, позиционируется приложением) +└── VisualRoot (Node2D, pivot в точке контакта с опорой) + └── Sprite (AnimatedSprite2D или другой визуальный узел) +``` + +Root `InteractivePet` не масштабируется композитным сценарием: его положение связано с экранной +точкой контакта. Меняйте `VisualRoot.scale`, чтобы приближение не сдвигало лапы с опоры. В +`space-pixel` `VisualRoot.position` совпадает с `ground_offset`, то есть масштабирование происходит +вокруг точки под ногами персонажа. + +После успешного завершения и любой отмены возвращайте `VisualRoot.scale = Vector2.ONE`. Если тема +вводит дополнительные эффекты, таким же образом восстановите rotation, modulate, material и +временную видимость дочерних узлов. + +## 3. Подключите питомца к manifest + +В `themes//package/manifest.json` укажите production-сцену: + +```json +"InteractivePetScene": "res://exchanger_theme_dlc/components/interactive_pet.tscn" +``` + +Путь должен быть каноническим и находиться внутри `res://exchanger_theme_dlc/`. Сама сцена, скрипт, +sprite-sheet, звук и другие зависимости должны лежать внутри `themes//package/`. + +## 4. Реализуйте базовый animation API + +Композитный контракт расширяет обычного питомца, поэтому сначала должны работать базовые методы и +сигналы: + +```gdscript +signal pet_animation_started(animation_name: StringName) +signal pet_animation_completed(animation_name: StringName) + +func play_pet_animation(animation_name: StringName) -> bool: + return false + +func pause_pet_animation() -> void: + pass + +func stop_pet_animation() -> void: + pass + +func get_pet_animation_names() -> Array[StringName]: + return [] + +func get_pet_animation_frame_count(animation_name: StringName) -> int: + return 0 + +func has_pet_animation(animation_name: StringName) -> bool: + return false + +func get_current_pet_animation() -> StringName: + return &"" + +func get_current_pet_frame() -> int: + return 0 +``` + +Практически всегда также нужны +`get_pet_animation_frames_per_second()` и `get_pet_ground_offset()`. Имена анимаций, которые +host запрашивает, совпадают с именами, возвращаемыми `get_pet_animation_names()`. Полный список +и допустимые возвращаемые значения приведены в +[SCRIPTING.md](SCRIPTING.md#нейтральный-контракт-интерактивного-питомца). + +## 5. Добавьте композитный API целиком + +Нельзя реализовать только часть интерфейса. Валидатор требует сразу два сигнала и три метода: + +```gdscript +signal pet_composite_action_started(action_name: StringName, run_id: int) +signal pet_composite_action_finished( + action_name: StringName, + run_id: int, + completed: bool +) + +func has_pet_composite_action(action_name: StringName) -> bool: + return action_name == &"interact" + +func start_pet_composite_action( + action_name: StringName, + runtime: Object, + parameters: Dictionary +) -> int: + # Проверка, принятие запуска и запуск корутины темы. + return 0 + +func cancel_pet_composite_action(run_id: int, reason: StringName) -> void: + # Остановка только того запуска, которому принадлежит run_id. + pass +``` + +При принятии запуска `start_pet_composite_action()` обязан вернуть ровно +`int(runtime.call(&"GetRunId"))`; при отказе — `0`. После принятия испустите `started`, сохраните +`run_id` и runtime, затем запустите корутину через `call_deferred()`. Так метод старта не блокирует +Exchanger. + +Минимальное состояние одного активного запуска: + +```gdscript +var _composite_run_id := 0 +var _composite_action := &"" +var _composite_runtime: Object + +func _is_composite_active(run_id: int, runtime: Object) -> bool: + return ( + run_id == _composite_run_id + and runtime == _composite_runtime + and is_instance_valid(runtime) + and bool(runtime.call(&"IsActive")) + ) +``` + +Проверяйте `_is_composite_active()` сразу после каждого `await`. Старая корутина не должна менять +кадр, scale или экранную позицию после отзыва runtime. + +## 6. Составьте раскадровку действия + +До написания кода удобно заполнить таблицу сценария. Для `space-pixel/interact` она выглядит так: + +| Шаг | Что происходит | Motion policy | +| --- | --- | --- | +| 1 | Обычная навигация и ввод приостанавливаются | `suspended / ignore / allow / false` | +| 2 | По предыдущей ориентации проигрывается `turn_left` или `turn_right` | без изменения | +| 3 | `come_closer`, одновременно `VisualRoot` растёт от ×1 до ×2 | без изменения | +| 4 | `action` повторяется `action_repetitions` раз | без изменения | +| 5 | Выбирается самая высокая доступная опора и вычисляется длина падения | без изменения | +| 6 | `falling` идёт вниз, персонаж один раз проходит через низ и появляется сверху | `theme_driven / after_vertical_wrap / wrap_vertical_once / false` | +| 7 | После wrap разрешается посадка только на выбранную опору | та же политика | +| 8 | Scale возвращается к ×1, проигрываются `landing`, затем `idle` | завершение запуска | + +Поля policy записываются в порядке `navigation / support_contacts / screen_bounds / +input_enabled`. Вызов выглядит так: + +Для синхронного приближения доведите `VisualRoot.scale` до конечного значения уже к началу +последнего кадра `come_closer`. Последний кадр должен быть показан хотя бы один render-frame в +полном масштабе, и только после этого можно запускать `action`. Если интерполировать scale до +самого конца общей длительности клипа и сразу переключить анимацию, финальный масштаб формально +будет вычислен, но пользователь не увидит его до начала следующего клипа. + +```gdscript +var accepted := bool(runtime.call(&"SetMotionPolicy", { + "navigation": "suspended", + "support_contacts": "ignore", + "screen_bounds": "allow", + "input_enabled": false, +})) +``` + +Для падения `space-pixel` дополнительно передаёт `landing_surface_id` выбранной опоры и +`wrap_margin`. Все допустимые значения перечислены в +[SCRIPTING.md](SCRIPTING.md#составные-действия-питомца). + +## 7. Управляйте движением через anchor + +`runtime.GetAnchor()` возвращает экранную точку контакта, а не позицию root сцены. Для движения +используйте `MoveAnchor(delta)`, а не меняйте `position` питомца напрямую. Основные операции: + +| Вызов | Назначение | +| --- | --- | +| `GetViewportRect()` | получить границы экрана | +| `GetAnchor()` | получить текущую точку контакта | +| `GetHighestSupport()` | выбрать верхнюю доступную опору | +| `SetMotionPolicy(policy)` | временно изменить навигацию, контакты, границы и ввод | +| `MoveAnchor(delta)` | переместить точку контакта с применением policy | +| `SetAnchor(anchor)` | установить точку явно, например выровнять X после wrap | +| `LandOnSupport(surface_id)` | завершить движение точной посадкой на существующую опору | + +Каждый изменяющий вызов возвращает результат. Проверяйте `accepted`; у `MoveAnchor()` также читайте +`wrapped`, `landed`, `surface_id` и фактический `anchor`. Не считайте, что запрошенное перемещение +обязательно было применено без изменений. + +Для равномерного перемещения вызывайте `MoveAnchor()` после каждого `process_frame` и умножайте +скорость на `delta`. Количество повторов падения можно вычислить так: + +```text +полная длина = путь от текущего anchor до низа + путь от верха до выбранной опоры +число циклов = ceil(полная длина / расстояние_за_один_цикл) +время = число циклов × кадры_клипа / fps +скорость = полная длина / время +``` + +`falling_distance_per_cycle` — художественный параметр темы: он задаёт, насколько быстро один +визуальный цикл должен продвигать персонажа по экрану. + +Для этапа приближения эталонный питомец предоставляет ещё три параметра темы: + +- `approach_visual_scale` — итоговый масштаб (`2.0` для инопланетянина); +- `approach_scale_completion_ratio` — доля длительности `come_closer`, за которую масштаб должен + полностью достигнуть целевого значения; значение `0.75` оставляет заключительную четверть клипа + уже в полном масштабе; +- `approach_hold_seconds` — короткая выдержка полного масштаба после завершения `come_closer` и до + первого кадра `action`; по умолчанию `0.15` секунды. + +Не доводите масштаб до цели только на последнем кадре: формально размер успеет измениться, но +переход визуально сольётся с началом `action`. Последние кадры приближения должны явно проиграться +при окончательном масштабе, а следующий клип — начаться только после выдержки. + +## 8. Учитывайте параметры запуска + +Для `interact` сейчас используются два параметра: + +- `action_repetitions` — число повторов основного действия; ограничьте его разумным диапазоном, + например `1..16`; +- `reduced_effects` — режим уменьшенных эффектов. В `space-pixel` он пропускает приближение и + проход через границу, но сохраняет `action`, `landing` и возврат в `idle`. + +Не требуйте наличия ключа: используйте `parameters.get("имя", значение_по_умолчанию)`. Неизвестные +поля игнорируйте, чтобы новые версии приложения не ломали старую тему. + +## 9. Корректно завершайте и отменяйте действие + +Успешное завершение: + +1. Убедитесь, что run всё ещё активен. +2. Верните временные визуальные изменения. +3. Перейдите в стабильный клип, обычно `idle`. +4. Очистите сохранённые `run_id` и runtime. +5. Испустите `pet_composite_action_finished(action_name, run_id, true)`. + +При ошибке собственной последовательности испустите `finished(..., false)`. При вызове +`cancel_pet_composite_action()` немедленно очистите состояние и визуальные изменения; повторно +обращаться к runtime после отмены нельзя. Эталонная реализация намеренно не испускает второй +`finished`, если отмена уже инициирована host: владельцем окончательного lifecycle остаётся один +активный запуск. + +## 10. Разметьте опоры экранов + +Если manifest содержит `InteractivePetScene`, текущий Builder требует navigation v1 во всех восьми +production-сценах, кроме `screen.settings`. На каждом экране должны быть: + +- ровно один `Node2D` с `exchanger_pet_navigation_root = true`; +- положительные `exchanger_pet_roaming_bounds` и существующий `default_surface_id`; +- хотя бы одна горизонтальная поверхность; +- при необходимости — sit points и двунаправленные climb edges. + +Это metadata навигации, а не `exchanger_binding_id`. Подробный список ключей и правила координат +приведены в [BINDING_CONTRACT.md](BINDING_CONTRACT.md#навигация-питомца). + +## 11. Проверьте результат + +1. Активируйте тему: `./activate-theme.ps1 -ThemeId `. +2. Запустите preview и откройте вкладку `PET`. +3. Проверьте каждый клип отдельно, включая первый и последний кадр. +4. Запустите «СОСТАВНОЕ ДЕЙСТВИЕ: INTERACT» несколько раз подряд. +5. Отмените действие через `Esc`, переход в галерею и повторный запуск. +6. Проверьте обычный и `reduced_effects` сценарии в Exchanger. +7. Выполните: + +```powershell +./tools/Test-PackagedBindingContract.ps1 +./test-theme.ps1 -ThemeId +./build-theme.ps1 -ThemeId +``` + +Готовое действие не дёргает root при смене клипов, не оставляет увеличенный `VisualRoot`, не +реагирует на ввод во время запрещённого этапа, не цепляется за промежуточные опоры и после +приземления стабильно возвращается в `idle`. + +## Частые ошибки + +- **Валидатор сообщает о partial composite API.** Добавлена только часть из двух сигналов и трёх + методов — реализуйте весь набор или удалите его целиком. +- **Персонаж смещается при увеличении.** Pivot `VisualRoot` расположен не в точке контакта лап. +- **Старая анимация продолжает работать после перехода.** После `await` не проверены `run_id` и + `runtime.IsActive()`. +- **Питомец цепляется за окна во время падения.** Слишком рано включены `solid`-контакты; для + сценария с проходом через экран используйте `after_vertical_wrap`. +- **Питомец исчезает и не возвращается.** Не проверены `wrapped`/`landed`, неверен + `landing_surface_id` или поверхность лежит вне roaming bounds. +- **Действие имеет неверную скорость.** Число кадров или FPS в API не совпадает с фактическим + `SpriteFrames`. +- **В PCK нет скрипта или текстуры.** Зависимость лежит в `source/`, а не внутри `package/`. diff --git a/docs/PROJECT_CONTEXT.md b/docs/PROJECT_CONTEXT.md new file mode 100644 index 0000000..748955a --- /dev/null +++ b/docs/PROJECT_CONTEXT.md @@ -0,0 +1,724 @@ +# Контекст проекта и handoff + +Дата актуализации: 14 сентября 2026 года. + +## Текущее состояние + +- Builder работает на Godot 4.7.1, главное preview — `tools/preview/preview.tscn`, размер + `720×1280`. +- Реализован полный формат `ExchangerThemeDlc` v2: 9 production-сцен, 481 обязательный immutable + element-binding из JSON и 24 обязательных supplemental runtime-binding, проверяемых Builder + отдельно. Четыре optional ID (тексты баннеров, выбор промо-изображения и переключатель + питомца) сохраняют обратную совместимость; полностью обновлённая тема содержит 509 + element-binding; + metadata корней экранов и навигации питомца считаются отдельно. +- `themes/example` — валидная тема-шаблон; `themes/space-pixel` — текущая оформленная тема. +- В SETTINGS `space-pixel` кнопка добавления промо-ролика использует явный кегль `17 px`. + Благодаря этому её минимальная ширина равна `365 px`, панель списка промо не расширяет общий + `VBoxContainer`, а все видимые панели раздела «ПРОМО» занимают стандартную ширину `664 px` в + viewport `720×1280`. Актуальные `build/space-pixel.pck` и `build/active_theme.pck` совпадают: + `1700400` bytes, SHA-256 + `8082656B3F8DBAA74D6FC55659FDE99D636BF4A626BCECA99F93BA8C9123ECF7`. +- `space-pixel` содержит самостоятельный компонент интерактивного питомца + `package/components/interactive_pet.tscn`: 22 анимации, 414 кадров, Nearest-фильтрация и публичный + GDScript-API с прямыми именами анимаций/runtime-профилем. Обычное перемещение исполняет host по + отдельному theme-owned navigation v1 активного экрана; составной `interact` остаётся в теме и + управляет экранной anchor-точкой только через scoped runtime host. +- Optional composite contract позволяет теме задавать последовательность клипов, scale и временные + политики навигации, контактов с опорами, границ и ввода. `space-pixel` выполняет условный поворот, + `come_closer` ×2, повторы `action`, вычисляемый `falling` через низ/верх экрана, `landing` на самой + высокой доступной опоре и `idle`. Любая отмена инвалидирует run-scoped bridge; старые темы + сохраняют одиночный semantic fallback. +- Для автора темы добавлен отдельный дизайнерский гайд `docs/COMPOSITE_PET_ANIMATIONS.md`: от + подготовки клипов и pivot `VisualRoot` до раскадровки policy, работы с anchor, отмены и QA. +- Non-sitting состояния питомца используют нулевую локальную поправку дочернего + `AnimatedSprite2D`. Только `sitting` имеет поправку `(0,24)`, которая опускает его на `20,28` + экранного пикселя при scale `0.845`; root, hit box и `GROUND_OFFSET` не меняются. +- Все восемь non-settings сцен `space-pixel` содержат невидимые metadata-графы питомца: всего 54 + поверхности верхних граней пола/кнопок/окон и 49 climb edges. Settings намеренно остаётся без + графа. Визуальные `Control` не менялись; координаты являются реальными contact points в + `720×1280`. +- Exchanger вызывает прямую анимацию `dancing` темы `space-pixel` + при начале клиентской выдачи и явно проигрывает четыре полных цикла после посадки на Success. +- Обычное падение питомца использует последовательность прямых анимаций + `falling → landing → idle`: это относится и к отпусканию после drag, и к падению со старой позиции + при смене экрана. `landing` является необязательным для старых тем: при отсутствии анимации host сразу + включает `idle`. Запрос `celebrate` во время приземления ждёт завершения `landing`, после чего + запускаются четыре праздничных цикла. +- 7 сентября обновлённый набор исходников питомца синхронизирован в package: добавлены девять + состояний (`come_closer`, `idle`, `landing`, `turn_left/right`, `action` и три + `climbing_action*`), + обновлён `dancing`, а `home`/`cross` включены как runtime-пиктограммы. Клип + `walking_finish_right` переименован в `walking_right_stop`, `walking_finish` — в + `walking_left_stop`, а `walking_start` — в `walking_left_start`; имена файлов синхронизированы в + архиве, source и package. Актуальные `space-pixel.pck` и Builder `active_theme.pck` совпадают: + `1658512` bytes, SHA-256 + `76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91`. +- Preview показывает реальные production-сцены, переключает все экраны, отображает binding overlay + первой кнопкой слева и поддерживает live reload с сохранением текущей вкладки. Он не назначает + сценам Theme/фон/decoration и не добавляет демонстрационные дочерние узлы. +- Кнопка `PET` основной галереи открывает отдельный `tools/preview/interactive_pet_preview.tscn`: + viewer динамически загружает `InteractivePetScene` активной темы, строит кнопки из её API и + автоматически вписывает персонажа в stage с масштабом до `4×`. Отдельная кнопка запускает + составной `interact` через тестовый runtime с viewport и верхней опорой. Preview tooling не + входит в PCK. +- Все 18 production-сцен `example` и `space-pixel` самодостаточны: root применяет package Theme, + содержит `ThemeBackground`/`BackgroundDecoration` и metadata + `exchanger_self_contained_visuals = true`. +- Home, CardAmount и Settings содержат готовые theme-owned runtime-узлы: 16 кнопок сумм, + 16 строк бонусов, 16 строк готовых сумм и 12 строк промо. Host не должен изменять визуальное + дерево ThemeView. +- Итоговые панели CashPayment, CardAmount и CardCustomAmount имеют общий заголовок «К ВЫДАЧЕ» и + раздельные theme-owned Label базовых жетонов слева и бонуса справа. В CardAmount исходный + immutable-binding `...reward_panel.content.value` сохранён для базы, а отдельный Bonus использует + supplemental runtime-binding `card_amount.content.reward_panel.content.bonus`; старые темы без + него поддерживаются host legacy fallback. +- В SETTINGS обеих тем заранее находятся скрытые theme-owned текстовая и цифровая клавиатуры: + 33 буквенных слота, переключатели языка/символов/регистра, действия редактирования и цифры 0–9. +- SETTINGS обеих тем содержит готовый раздел «Сервис» для учёта жетонов и скрытый диалог + пересчёта/ручного добавления. Их 14 binding-id входят в неизменяемый контракт, включая + отдельные Label точного остатка hopper 1/2. Три обязательных supplemental binding не входят + в JSON-каталог 481 элемента: Label `...service_inventory_panel.margin.content.description` + позволяет host менять описание по режиму учёта, а `CheckButton` + `...service_inventory_panel.margin.content.inventory_enabled` включает учёт остатка по умолчанию, а + `CheckButton` `...service_inventory_panel.margin.content.purchase_limit_enabled` по умолчанию запрещает + продажу сверх учтённого остатка; + host только обновляет готовые theme-owned узлы и подписывает сигналы. +- Полный supplemental-срез состоит из 24 обязательных ID: 6 Home, 7 кнопок навигации «Главная», + 1 CardAmount и 10 Settings. Кнопки навигации добавлены на все экраны, кроме Home и Settings: + на экранах с Back они находятся справа от неё, а на Success/Error/ServiceAccess занимают её + стандартную позицию. Возврат отменяет незавершённую оплату; на Success кнопка недоступна во + время выдачи. Основа кнопки — `KeypadButton`: в `space-pixel` это готовый + `assets/ui/button_square.png` с наложенной `interactive_pet/home.png`, а `example` рисует + встроенную пиктограмму дома без дополнительного ассета. + Optional `home.decoration.custom_text_block` объединяет готовые речевую плашку и персонажа + справа, когда они есть в дизайне; `home.decoration.right_character` сохранён как legacy + fallback для старых тем. Канонический перечень типов и ID находится в + `docs/BINDING_CONTRACT.md`. +- Встроенный EditorPlugin `Exchanger Theme Manager` добавляет в меню `Редактор` команды + `Выбрать тему`, `Создать тему`, `Экспортировать тему` и `Применить тему к Exchanger`. + Экспорт сначала предлагает любую валидную тему по ID, затем открывает стандартный save-dialog и + асинхронно собирает её в выбранный PCK без переключения preview и установки. Выбор, создание, + экспорт и применение показывают этапы и процент в общем окне прогресса; применение устанавливает + активную тему в стандартный пользовательский каталог. Все каталоги тем постоянно видны в Godot + FileSystem и не содержат `.gdignore`. +- Сборка создаёт `build/.pck` и `build/active_theme.pck`; установка в Exchanger выполняется + только явным `-InstallToDefaultUserPath`. +- Постоянного `exchanger_theme_dlc/` в корне больше нет. Preview читает активный package напрямую + по `build/active-theme.json`; каноническая папка создаётся только во временном изолированном + workspace на время validator/export и затем удаляется. + +## Последняя подтверждённая проверка + +Актуальные подтверждённые проверки: + +- 11 сентября 2026 года после проверки исправленного PCK в Exchanger только сидящий питомец + оставался выше нужной позиции. `sitting` получил отдельный visual offset `(0,24)`, который + опускает его на `20,28` экранного пикселя при scale `0.845`; non-sitting offset остаётся + нулевым. `GROUND_OFFSET=(64,96)`, `VisualRoot`, навигационные точки, Exchanger host и + binding-контракт не менялись. Contract check, validator, pet verifier, preview smoke и build + прошли; живой PET-preview `720×1280` подтвердил current offset `(0,24)` и отсутствие clipping. + `build/space-pixel.pck` и `build/active_theme.pck` совпадают: `1700352` bytes, + SHA-256 `931A2EAA118722B95E49EA097C8CE41CE9E655F2CF7248CCA050B28A9AF50357`; +- 11 сентября 2026 года устранено завышенное положение питомца на поверхностях: в + `interactive_pet.gd` non-sitting visual offset изменён с `(0,-24)` на `(0,0)`. При runtime + scale `0.845` прежняя поправка поднимала видимый спрайт на `20,28` экранного пикселя, хотя host + сохранял корректный anchor. `GROUND_OFFSET=(64,96)`, `VisualRoot`, навигационные точки и + binding-контракт не менялись. Contract check, validator, pet verifier, preview smoke и build + прошли; `build/space-pixel.pck` и `build/active_theme.pck` совпадают: `1700256` bytes, + SHA-256 `C1872763DA443190FA3CA2D281E1599B8C4F772CF290A19F3E4E580CAFE2336F`; +- 10 сентября 2026 года composite-действие `interact` в `space-pixel` синхронизировано по + финальной фазе приближения: `VisualRoot` достигает масштаба ×2 за первые `75%` клипа + `come_closer`, сохраняет его на заключительной четверти клипа и ещё `0.15` секунды после + последнего кадра, и только затем запускает `action`. Точечный runtime-тест PET-preview + зафиксировал scale `2.0` уже на кадре 27, на финальном кадре 35 и в начале `action`; +- 10 сентября 2026 года устранена линейная фильтрация содержимого `space-pixel` в Exchanger при + физическом разрешении `1080×1920`: корни всех девяти self-contained production-сцен теперь + явно задают `texture_filter = 1` (`Nearest`). Раньше nearest был задан фону и отдельным + изображениям, а Builder дополнительно маскировал проблему глобальной настройкой проекта; + текст и прочие наследующие элементы в host могли получать линейный фильтр. Binding-каталог и + host-контракт не изменялись. Валидатор теперь требует Nearest на каждом production-root, если + manifest задаёт `UseNearestTextureFilter: true`. Все девять вкладок с binding overlay проверены + в живом preview `720×1280`; contract check, validator/preview smoke и build прошли. Итоговые + `build/space-pixel.pck` и `build/active_theme.pck` после финальной composite-правки имеют размер + `1698608` bytes и SHA-256 + `4F65DA0758C4234BA752F112C50830010D0914E1EC5FCD76FD70D913614B45A3`; +- 9 сентября 2026 года экранные заголовки `space-pixel` уменьшены: общий `ScreenTitle` использует + `36 px` вместо `42 px`, а заголовок ServiceAccess — `30 px` вместо `34 px`. Блок техподдержки + в собственном footer Home и общем `components/footer.tscn` сдвинут на `32 px` влево + (`x = 341 px`) без изменения размеров, binding-id и runtime-форматирования телефона. Все девять + вкладок просмотрены в живом preview `720×1280`: заголовки и номер не обрезаются, блок поддержки + не пересекается с логотипом. Contract check, validator/preview smoke и build прошли; + `build/space-pixel.pck` и `build/active_theme.pck` совпадают: `1697968` bytes, SHA-256 + `628A7D5BDFFB03DF1DEAF835069C243FCC1FFF8D6AA39850B937A336EB0F6417`; + +- 9 сентября 2026 года добавлены четыре compatible optional supplemental binding: `cash_payment.content.banner_text` + (`Label`) для подписи нижней анимированной плашки CashPayment и + `settings.scroll.content.animated_banner_texts_panel` (`Control`) для готовой панели настройки + всех четырёх нижних баннеров. Immutable JSON-каталог сохраняет 481 binding и прежний SHA-256; + полностью обновлённая тема содержит 509 element-binding, но старый PCK валиден и получает + отсутствующие optional-узлы из встроенной темы. Добавлены также + `settings.scroll.content.advertisement_poster_panel.margin.content.select_button` (`Button`) для + системного выбора изображения промо и + `settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet` + (`CheckButton`) для отключения theme-owned интерактивного питомца. + `Sync-HostBindingContract -Check`, packaged contract для example/space-pixel и `test-theme` + обеих тем прошли. + +- 9 сентября 2026 года добавлена supplemental-навигация `home_navigation_button` для + CashPayment, CardAmount, CardCustomAmount, CardTerminal, Success, Error и ServiceAccess. + Immutable JSON-каталог не менялся: по-прежнему 481 binding и SHA-256 + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`; с supplemental-слоем + на момент этой поставки каждая новая тема содержала 505 обязательных binding. В `space-pixel` расширены верхние + поверхности Back и добавлены три поверхности/перехода навигации, поэтому граф теперь имеет + 54 поверхности и 49 climb edges. `Sync-HostBindingContract -Check`, + `Test-PackagedBindingContract.ps1`, `test-theme example`, `test-theme space-pixel` и + build/install прошли. Установленный PCK Exchanger: `1664336` bytes, SHA-256 + `E2CCD76C0374CE3B6285371DF4113511C39C22BCB131D4D3A10F5B391AFBA0A1`. + +- 8 сентября 2026 года настройка Home «ПОКАЗЫВАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ ТЕКСТ» получила optional + binding `home.decoration.custom_text_block`: в `space-pixel` это готовая группа речевой плашки + и правого персонажа, поэтому host может скрыть её целиком вместе с обязательным Label текста, + не перестраивая ThemeView. Старый optional `home.decoration.right_character` сохранён для + выпущенных тем. Визуальные координаты и ассеты не изменялись; скрипт покачивания использует + новый вложенный путь персонажа. Contract copies (481 immutable binding) не менялись; + `Test-PackagedBindingContract.ps1`, `test-theme example`, `test-theme space-pixel`, packaged + pet verifier (22 анимации, 414 кадров, 51 поверхность, 46 переходов) и build/install прошли. + Установленный PCK Exchanger: `1658288` bytes, SHA-256 + `4DD492DA3B181B86B291D7930F400B1F8B660658EC1AECBC519266C4EFD6B642`; + +- 8 сентября 2026 года документация и валидируемый semantic action list синхронизированы с + обычным host-flow `drop → landing → idle`. `landing` добавлен в generic Theme Validator и + PCK/source pet verifier: если тема возвращает для него непустое имя, оно обязано входить в + `get_pet_animation_names()`, при этом старые темы с пустым mapping остаются допустимыми. + Документы фиксируют одинаковое поведение после drag и смены экрана, а также очередь + `celebrate` до завершения landing. `space-pixel` уже содержал корректные ресурсы и mapping: + `landing` — one-shot на 11 кадров при 24 fps, `idle` — зацикленный на 19 кадров при 24 fps; + production-сцены, sprite-sheet, биндинги и PCK не изменялись. Contract check, `test-theme` + для `example` и `space-pixel`, а также verifier существующего PCK прошли; verifier подтвердил + 22 анимации, 414 кадров, неподвижный root, 51 поверхность и 46 climb edges. Builder PCK-копии + остались байт-в-байт одинаковыми: `1658512` bytes, SHA-256 + `76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91`; + +- 7 сентября 2026 года синхронизация с текущим Exchanger исправлена без изменения immutable + контракта: `Sync-HostBindingContract.ps1` явно исключает все 17 supplemental runtime-binding из + генерации JSON, даже когда host обращается к их каноническому пути через буквальный `GetNode`. + `Test-PackagedBindingContract.ps1` защищает от попадания в каталог полный набор 17 ID, а не + только прежние четыре. `Sync-HostBindingContract -Check` и проверка package-копий проходят: + 9 экранов, 481 binding, SHA-256 + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`; production-сцены и PCK + этой правкой не изменялись. Свежий PCK отдельно прошёл в Exchanger полный pet-smoke и + исправленный payment-format smoke на mock-оборудовании без сохранения пользовательских Settings. + +- 7 сентября 2026 года три клипа ходьбы `space-pixel` переименованы сквозным образом: + `walking_finish_right → walking_right_stop`, `walking_finish → walking_left_stop` и + `walking_start → walking_left_start`. Обновлены sprite-sheet в `themes_src`, theme source и + package, `SpriteFrames`, export-поля, списки кадров/FPS/one-shot, facing-наборы, preview enum, + документация и semantic mapping `walk_start_left`/`walk_finish_left`/`walk_finish_right`. + `walking_start_right` завершает симметричную пару стартовых клипов. Старые четыре имени и файла + отсутствуют. Принудительный + Godot import, contract check, Theme Validator, pet verifier (`22` анимации, `414` кадров, + `51` поверхность, `46` climb edges), preview smoke, build и PCK smoke (`9` экранов, + `23` scripted instances) прошли. `build/space-pixel.pck` и `build/active_theme.pck` совпадают: + `1658512` bytes, SHA-256 + `76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91`. Пользовательская копия + Exchanger не перезаписывалась; + +- 7 сентября 2026 года реализован optional composite contract интерактивного питомца между + `space-pixel` и Exchanger. Theme-owned `interact` выполняет условный поворот, `come_closer` со + scale `VisualRoot` до ×2, заданное число `action`, вычисляет полный путь `falling` через нижнюю и + верхнюю границы, игнорирует опоры до wrap, приземляется на самую высокую доступную поверхность, + проигрывает `landing` и возвращается в `idle`. Exchanger предоставляет только scoped runtime + для anchor/viewport/поверхностей и политик, автоматически отзывает его при смене экрана/темы, + drag и конфликтующих действиях; прежний semantic fallback сохранён. PET-preview получил отдельную + кнопку и реальный запуск Godot завершил сценарий в `idle` без ошибок. Contract-синхронизация + подтвердила 2 темы/481 binding и SHA-256 каталога + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`; `test-theme`, validator, + preview smoke, PCK smoke (`9` экранов, `23` scripted instances), Release-сборка без предупреждений, + NUnit `488/488` (18 аппаратных пропущены) и полный Exchanger `InteractivePetBehaviorSmoke` с + явным PCK/mock прошли. Итоговые `build/space-pixel.pck` и Builder `build/active_theme.pck`: + `1658436` bytes, SHA-256 + `37E86765C7F8DE542F799AF8523241A6EDE3F4DC4C481E28CCAC76D52C807AC6`. Пользовательский каталог + Exchanger не перезаписывался; + +- 7 сентября 2026 года верхняя плашка `CardAmount` темы `space-pixel` приведена к точной + визуальной копии плашки `CashPayment/Summary`: обе используют цельный atlas-region + `panel_medium.png`, `PanelContainer` размером `649×125` в позиции `(36,148)` и одинаковые + трансформации заголовка, базовых жетонов и бонуса. Runtime-инспекция Godot 4.7.1 подтвердила + совпадение global rect всех четырёх видимых элементов; binding-id и канонические пути `Value` и + `Bonus` сохранены. Contract check, validator, interactive-pet verifier, preview smoke, сборка и + PCK smoke (`9` экранов, `23` scripted instances) прошли. `build/space-pixel.pck` и + `build/active_theme.pck` совпадают: `1435772` bytes, SHA-256 + `F505882620719F154319A9CD93208F42ECB59FCC615410827A44DADED8F61404`; + +- 7 сентября 2026 года итоговые панели CashPayment, CardAmount и CardCustomAmount обеих тем + синхронизированы по композиции. Caption CashPayment изменён с «БАЛАНС ЖЕТОНОВ» на «К ВЫДАЧЕ». + CardAmount сохраняет обязательный `Label` Value с ID + `card_amount.content.reward_panel.content.value` по пути + `SafeMargin/Content/RewardPanel/Content/Value` для базовых жетонов слева и содержит отдельный + theme-owned `Label` Bonus справа с supplemental ID + `card_amount.content.reward_panel.content.bonus` по пути + `SafeMargin/Content/RewardPanel/Content/Bonus`; его default — `БЕЗ БОНУСА`, а runtime-формат — + `+ N ЖЕТОНОВ\nВ ПОДАРОК` или `БЕЗ БОНУСА`. CardCustomAmount сохранил контрактные Label Amount и + Tokens на прежних путях, но теперь также размещает базу слева и бонус справа; sample бонуса имеет + явный перенос перед «В ПОДАРОК». Validator проверяет точные типы/пути, порядок, размещение, + default-тексты и CashPayment caption, а contract-test подтверждает сохранность Value и отсутствие + нового supplemental ID в JSON. Visual QA всех трёх экранов обеих production-тем в отдельной + Builder-сессии Godot 4.7.1 при `720×1280` подтвердил полную читаемость, отсутствие визуального + столкновения, clipping и перекрытия соседних панелей/footer. Contract check, `test-theme`, + validator/preview smoke, сборка с `-PreserveActiveTheme` и отдельный PCK smoke прошли; PCK содержат + 9 экранов и 9/23 scripted instances. JSON-контракт остался байт-в-байт прежним: 481 binding, + SHA-256 `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`. Новые PCK: + `example.pck` — `464876` bytes, SHA-256 + `02B8505FB7F0EF4F4E9C2905D97E8F8751A1DDE86DDF460AFC958CCE6AF51994`; + `space-pixel.pck` — `1436988` bytes, SHA-256 + `4D9AA00FE2096794331B348916D1766B47A45D9EDFEE60BEAB0E424ED4761A67`. + `active-theme.json`, Builder `active_theme.pck` и пользовательский `active_theme.pck` не + изменились; тема не устанавливалась; + +- 7 сентября 2026 года в SETTINGS → «Сервис» обеих тем Label `Description` + получил supplemental binding-id + `settings.scroll.content.service_inventory_panel.margin.content.description`, чтобы host мог менять + описание по режиму учёта. Сразу после него добавлен theme-owned `CheckButton` + «УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ» с supplemental binding-id + `settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled` и + включённым состоянием по умолчанию. Сразу после него добавлен второй theme-owned + `CheckButton` «НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА» с supplemental binding-id + `settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled`, также + включённый по умолчанию. Он позволяет host ограничивать продажу доступным учтённым остатком. + Минимальная высота `ServiceInventoryPanel` увеличена только на высоту новой строки и штатный + отступ VBox: с `696` до `772` px. Validator проверяет ID, типы, точные пути, порядок обоих + переключателей, тексты и начальные состояния; contract-test отдельно гарантирует, что все три + supplemental ID не попали в immutable JSON. Visual QA обеих production-сцен в отдельной + Builder-сессии Godot 4.7.1 при `720×1280` подтвердил полную видимость обоих переключателей, + hopper-полей и статуса, отсутствие clipping/перекрытий и корректное отделение footer: у + `example` панель имеет фактическую высоту `773` px и зазор до footer `20` px, у `space-pixel` — + `817` px и `47` px соответственно. Contract check, `test-theme`, validator/preview smoke, + сборка с `-PreserveActiveTheme` и PCK smoke обеих тем прошли; PCK содержат 9 + экранов и 9/23 scripted instances. JSON-контракт остался байт-в-байт прежним: + 481 binding, SHA-256 + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`. Новые PCK: + `example.pck` — `464268` bytes, SHA-256 + `AC03334354D285E36A25BFB81D60880F829700F083AF5D728F10AB15C764B63D`; + `space-pixel.pck` — `1436492` bytes, SHA-256 + `166660916913E4766FC91437155BB8B78A405150B3A599CF401CD78A83DFB727`. + `active-theme.json`, Builder `active_theme.pck` и пользовательский `active_theme.pck` не + изменились; тема не устанавливалась; + +- 7 сентября 2026 года `Exchanger Theme Manager` обновлён до `1.3.3`: результат + `JSON.parse_string()` явно объявлен как `Variant`, а результат `Array.pop_back()` приведён к + `Node`. В `theme_manager_plugin.gd` больше нет небезопасного вывода типа из `Variant`; + +- 7 сентября 2026 года в SETTINGS → «Общие» обеих тем визуально удалены строка названия + приложения и панель предпросмотра, а подпись поля покупательской фразы изменена на + «СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ». Все существующие `application_name` и + `branding_preview_panel` binding-узлы сохранены с прежними ID/типами и скрыты; лимит поля + `short_text` остался равен 48. Пояснение раздела больше не упоминает название или предпросмотр. + Visual QA обеих production-сцен в отдельной Builder-сессии Godot 4.7.1 при `720×1280` + подтвердил отсутствие пустых строк, обрезания и перекрытий, а также сохранность фиксированного + footer. Contract check, validator/preview smoke, `test-theme` и build обеих тем с сохранением + active state прошли; PCK smoke подтвердил 9 экранов и 9/23 scripted instances. Контракт остался + байт-в-байт прежним: 481 binding, SHA-256 + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`, поэтому обязательное + правило обновления `docs/BINDING_CONTRACT.md` не применяется. Новые PCK: + `example.pck` — `463324` bytes, SHA-256 + `25E90059652EC26BD1779F7D6761F1CD1248A458F8C93F8E242596D3988FDE9F`; + `space-pixel.pck` — `1435548` bytes, SHA-256 + `E5941A4E7437BA996945E85551714F8B6E11F77A64808C68B29A8B88F66629AB`. + `active_theme.pck` в Builder и пользовательском каталоге Exchanger не изменялись и не + устанавливались; + +- 4 сентября 2026 года runtime scale интерактивного питомца `space-pixel` увеличен ровно на 30% + (`0.65 → 0.845`), а сниженная высота оставлена только для `sitting`: все остальные анимации + получили локальную поправку `(0,-24)`. Contract check, test/validator с переходом + `sitting → non-sitting → sitting`, preview smoke, build, PCK verifier и host + `InteractivePetBehaviorSmoke` с явным PCK прошли. PCK имеет размер + `1435452` bytes и SHA-256 + `390C9E3F83B026304F0E75E5A6AAD4458684BBCDFC847FFB542B6CFB1AC278E9`. Visual QA preview + `720×1280` подтвердил crisp Nearest, отсутствие clipping и пересечения с заголовком для обеих + высот. Пользовательский `active_theme.pck` не устанавливался. +- 3 сентября 2026 года `Exchanger Theme Manager` обновлён до `1.3.1`: JSON-протокол прогресса + между Windows PowerShell 5.1 и Godot использует только ASCII-сообщения и стабильные stage-id, + а все видимые русские названия этапов формируются внутри GDScript. Это исключает mojibake вида + `РџС...` независимо от системной кодовой страницы. Контрольная сборка `example` через + `powershell.exe` завершилась с `Stage=complete`, `Percent=100`, сохранила активной тему + `space-pixel`; package binding contract синхронизирован для обеих тем, SHA-256 + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`. После editor filesystem + scan Godot 4.7.1 новых parser/runtime errors не зарегистрировал; + +- 3 сентября 2026 года `Exchanger Theme Manager` обновлён до `1.3.0`: диалоги выбора, создания, + экспорта и применения получили сведения о теме и этапах, операции показывают общий progress bar, + а экспорт позволяет выбрать любой валидный ThemeId независимо от активного preview. Скрипт + `build-theme.ps1` принимает `-ProgressPath` и публикует JSON-состояние стадий сборки; режим + `-PreserveActiveTheme` не даёт редакторскому экспорту менять активное состояние и его PCK-копию. + Контрольный экспорт неактивной `example` завершился `complete/100%` и сохранил хэши active state + и `active_theme.pck`; PCK smoke подтвердил 9 экранов/9 scripted instances. Повторные contract, + validator, pet verifier, preview smoke и сборка `space-pixel` прошли; её PCK сохранил размер + `1431068` bytes и SHA-256 + `5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D`. Headless Godot 4.7.1 + подтвердил загрузку плагина и регистрацию команд меню без parser/runtime errors; + +- 3 сентября 2026 года `Exchanger Theme Manager` обновлён до `1.2.0`: добавлена команда + `Редактор → Экспортировать тему` со стандартным `FileDialog`, выбором произвольного `.pck` и + фоновой общей build-задачей. Экспорт не устанавливает тему; команда применения сохранена + отдельно. Аддон загружен в Godot 4.7.1 без parser/runtime errors. Экспорт `space-pixel` через + произвольный `-OutputPath`, validator, pet verifier, общий PCK smoke, preview smoke и contract + check прошли; тестовый PCK содержит 9 экранов/23 scripted instances, имеет размер `1431068` + bytes и SHA-256 `5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D`; + +- 3 сентября 2026 года `space-pixel` получил theme-owned navigation v1 для интерактивного + питомца во всех восьми non-settings сценах. Невидимые metadata-графы содержат 51 + горизонтальную contact surface и 46 связанных climb edges; Settings намеренно исключён. + Визуальные `Control` и 285 кадров не менялись. Component API сопоставляет semantic + actions с существующими анимациями (`drag = hanging`, `drop = falling`, совместимый + `climb_finish = sitting`) и сообщает scale `0.65`, walk/climb speeds `88/72 px/s`, hit size + `128×128`, ground offset `(64,96)`. Generic validator/verifier + требуют граф у каждой non-settings сцены темы с питомцем и проверяют уникальность IDs, + конечность/границы координат, sit points, ссылки и стыковку climb edges с поверхностями. + Contract SHA-256 `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143` + не изменился. `test-theme space-pixel`, validator, preview smoke, export и pet verifier прошли: + `13` анимаций, `285` кадров, `51` поверхность, `46` climb edges. Текущие + `build/space-pixel.pck`, `build/active_theme.pck` и установленная Exchanger-копия совпадают: + `1431068` bytes, SHA-256 + `5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D`. Расширенный host + runtime-smoke с mock-оборудованием подтвердил touch/LMB drag, подъём на Home/CashPayment, + активацию индивидуального графа каждой сцены, сохранение позиции и `falling`-падение при + переходе, скрытие в Settings и возврат с падением. После добавления `celebrate` smoke также + подтвердил очередь до посадки, ровно четыре запуска `dancing` и возврат в `Sitting`; + Exchanger unit-тесты: 419/419; + +- 3 сентября 2026 года feature-level контракт интерактивного питомца нейтрализован: optional + manifest field `InteractivePetScene` указывает на произвольную theme-owned `Node2D`-сцену внутри + package; canonical space-pixel компонент/скрипт и builder tooling переименованы в + `interactive_pet.*`. Viewer больше не инстанцирует space-pixel статически: он загружает + компонент активной темы, строит кнопки из `get_pet_animation_names()` и не обращается к папкам + текстур. Generic verifier используется в `test-theme.ps1` и `build-theme.ps1`, проверяет API, + сигналы, анимации и неподвижность root как в package, так и в PCK. Существующие каталоги + `source/alien_animation` и `package/assets/animations/alien_pet` сохранены без переименования как + внутренняя структура конкретной темы. Legacy `components/alien_pet.tscn` распознаётся только + discovery fallback для старых packages. Contract check, `test-theme example` (pet SKIP), + `test-theme space-pixel`, живой viewer `720×1280`, validator, preview smoke, export и общий PCK + smoke прошли; viewer показал 13 динамических кнопок и 285 кадров без parser/runtime errors. + `build/space-pixel.pck` и `build/active_theme.pck` совпадают: `1388444` bytes, SHA-256 + `BECBD72EDA68B67C5744B4BE642756186876A6D9754E6DF3B025FC78FD0D3C16`; + +- 2 сентября 2026 года `Exchanger Theme Manager` обновлён до `1.1.0`: команда + `Редактор → Применить тему к Exchanger` запускает validator/export/install активной темы в + фоновом `Thread`, показывает компактные состояния выполнения/ошибки и не блокирует UI редактора. + Аддон успешно загружен Godot 4.7.1 в editor mode. Для `space-pixel` прошли byte-identical + contract check, validator, preview smoke и PCK smoke (`9` сцен, `23` scripted instances). + `build/space-pixel.pck`, `build/active_theme.pck` и установленная пользовательская копия имеют + размер `1388536` bytes и SHA-256 + `D2D4BCF640374B76D8EFF48919EA7CD9A46AC7059DA42A73A630BE73B39C12D4`; + +- 2 сентября 2026 года исходные sprite-sheet из `alien_animation` перенесены в theme-specific + `themes/space-pixel/source/alien_animation` и `package/assets/animations/alien_pet`. Компонент, + позднее переименованный в `interactive_pet.tscn`, реализует 13 состояний без движения корня. + Отдельный viewer всех состояний проверен живым запуском при `720×1280`; он использует тот же + production-компонент и стартует с `sitting`. Contract check, validator, preview smoke, общий + PCK smoke и отдельный pet-PCK smoke прошли. Viewer также проверен переходами `PET` → viewer и + `Esc` → галерея; parser-ошибка вывода типа `initial_name` устранена явным `StringName`. + Package-копия binding-контракта синхронизирована с авторитетным JSON. Собранные + `space-pixel.pck` и `active_theme.pck` совпадают: `1389432` bytes, SHA-256 + `1392F51A12014EB1653F976B252FA55DCC5EFDE53B18563858DEF878CA2ADF3C`; установка в Exchanger + не выполнялась. + +- 1 сентября 2026 года обе Home-сцены получили theme-owned Label + `home.scroll.content.stock_status.approximate_count`: состояние расположено слева, полоска + по центру, приблизительный остаток справа. Builder проверяет этот Label и четыре состояния + полоски как supplemental runtime bindings, не меняя JSON-контракт 477; +- template/example дополнительно приведён к актуальной двуххопперной сервисной панели контракта; + contract check, validator и preview smoke прошли для example и space-pixel; + +- package-копии `example` и `space-pixel` совпали с авторитетным контрактом SHA-256 + `7ABC98D7770782D0EB658E6EC8CD8FA4F504B0F61862C84FD5E3580341FE73F2`; +- каталог содержит 473 биндинга, включая 57 keyboard bindings, 4 `short_text` bindings, 12 + сервисных bindings и + отдельное поле введённой суммы CardCustomAmount; +- обе темы прошли Godot import, validator и headless preview smoke после переноса визуального + chrome внутрь всех production-сцен; +- SETTINGS preview получил диагностическое состояние `KEYBOARD: OFF/TEXT/NUM`, которое меняет + только `Visible` двух уже существующих панелей и позволяет проверить их binding overlay; +- валидатор подтвердил уникальность всех 473 ID, допустимые типы и наличие всех 57 keyboard + bindings в `example` и `space-pixel`; +- Godot EditorFileSystem индексирует `themes/example` и `themes/space-pixel` без `.gdignore` и + без duplicate UID; package-сцены открываются напрямую из `themes//package/scenes/`; +- `space-pixel` успешно собран в PCK; export включил вложенную + `components/on_screen_keyboards.tscn` и прошёл предварительный validator; +- validator требует пустой `suffix` у всех 16 полей количества дополнительных жетонов, чтобы + тема не могла снова отнять у многозначного числа место припиской; +- служебные ряды текстовой клавиатуры `example` и `space-pixel` выровнены по единой высоте + `76 px` и зазорам `12 px`; в `space-pixel` отдельный стиль обрезает прозрачные края + `button_long.png`, стрелки имеют touch-target `88×76 px`, а длинные действия не сжимают текст; +- кнопки скрытия обеих экранных клавиатур сохраняют тип `Button`, прежние binding ID и логику, + но используют крупную центрированную стрелку вниз вместо надписи «СКРЫТЬ»; touch-target каждой + кнопки равен `64×64 px`. `space-pixel` переиспользует `button_down.png`, а шаблон `example` — + собственный кодовый SVG `assets/ui/keyboard_hide.svg`; +- описание приложения `subtitle` остаётся удалённым. Отдельная настройка «Короткий текст» использует + новые ID `home.scroll.content.speech_text` и три `settings...short_text` binding: HOME bubble + переносит и центрирует до 48 символов, SETTINGS содержит поле, ошибку и предпросмотр; +- живой preview через `godot-ai` загрузил 9 вкладок, переключил каждую из них, включил/выключил + binding overlay и не записал ошибок в game/editor logs; +- визуально подтверждены прямое открытие `example`/`space-pixel` scene-файлов, все девять + `space-pixel` вкладок без overlay, портретные `720×1280` и отсутствие внешнего preview chrome; +- через `godot-ai` подтверждены готовые Home stock/promo visuals и восемь видимых CardAmount + preset-кнопок; скрытые слоты 08–15 не создают пустых ячеек; +- в шаблоне `example` экран ручного ввода сохраняет полноразмерную панель `652×768 px` и клавиши + `152×152 px`; в `space-pixel` этот экран приведён к отдельному JPG-референсу: панель занимает + `646×466 px`, цифровые клавиши квадратные `46×46 px`, длинные действия находятся в нижнем ряду; +- на экране сервисного входа обеих тем PIN-клавиатура центрирована, а все двенадцать клавиш + имеют одинаковый квадратный размер `112×112 px`; действия и footer не перекрываются; +- `space-pixel` использует пользовательские `tumbler_on.png` и `tumbler_off.png` для всех + `CheckButton`; ON/OFF проверены в живом SETTINGS при исходном размере `128×64 px`, а все + 12 строк имеют одинаковые внутренние отступы слева и справа по `24 px`; +- все 57 `SpinBox` темы `space-pixel` используют пользовательские стрелки вверх/вниз; runtime-копии + `32×32 px` сохраняют пиксельный вид, отделены от поля промежутком `10 px` и проверены действием + цены `10 → 11 → 10`; у 16 бонусных полей удалён суффикс «жет.», чтобы многозначное количество + помещалось в поле целиком; +- все `LineEdit` (normal/focus/read-only), внутренние текстовые поля `SpinBox` и `OptionButton` + используют растягиваемый фон из видимой области `290×64 px` исходного `summa_bar.png`; +- обе полосы `HSlider` в SETTINGS → «ЗВУК» темы `space-pixel` увеличены по высоте с `14` до + `36 px`, видимый круглый grabber отключён, а заполнение `100%` доходит до правого края; + живой Exchanger подтвердил отсутствие обрезания и наложений в обоих блоках громкости; +- установленный `%APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck` сверён со + сборкой по SHA-256; после полного перезапуска Exchanger экран «ОПЛАТА» показал новые тумблеры + ON/OFF и квадратные стрелки SpinBox, а runtime-журнал подтвердил активацию `space-pixel`; +- прямой preview и обе команды test/build подтверждены при физически отсутствующем корневом + `exchanger_theme_dlc/`; временные workspaces после завершения команд пусты; +- после пересохранения открытых `ui_theme.tres` и `screen_home.tscn` Godot Editor заменил + переносимые ссылки на builder-only `res://themes/space-pixel/package/...`; относительные пути + восстановлены, после чего изолированный validator снова загрузил все ресурсы без ошибок; +- `build/example.pck` пересобран из актуального package после обновления Home/Settings и контракта: + размер `437356` bytes, SHA-256 + `38C23A7593082462E58F7DE2354013A9E548E2C45D58ACEDD8FC09CA82E38E95`; validator, preview smoke + и PCK smoke прошли, последний инстанцировал 9 экранов и подтвердил 9 scripted node instances; +- `Test-PackagedBindingContract.ps1`, `test-theme example`, `test-theme space-pixel` и + `build-theme space-pixel` прошли после удаления короткого описания. Импорт, полный validator, + headless preview smoke и export PCK завершились без ошибок; +- Theme DLC не является самостоятельным приложением и намеренно не содержит main scene, поэтому + запуск `--main-pack` не применяется для QA. Готовность пакета подтверждают validator/export и + последующая интеграционная проверка в Exchanger; +- Exchanger переведён на full-trust theme runtime: host больше не отклоняет GDScript, runtime-узлы, + размер PCK или прежний decoration budget; 263 unit-теста прошли, 17 hardware-тестов пропущены + из-за отсутствия оборудования. +- Home темы `space-pixel` приведён к референсу + `themes_src/space_pixel/references/photo_2026-08-20_14-09-56.jpg` в исходном `720×1280`: + восстановлены белые bubble-плашки, исходный масштаб и позиции НЛО, панели на `y=338/490`, + билборд, логотип и блок поддержки; обязательные пути и binding-id сохранены. +- Контрольный Godot-render снизил среднюю абсолютную RGB-разницу Home с референсом с `75,81` до + `6,84`; полученная на том этапе сборка имела размер `684216` bytes и SHA-256 + `CD1AB4B914997A369874F7F1E01FCE44B71EEF0BD2297E544D3C3701D809B13B`. +- CashPayment, CardCustomAmount, CardAmount и CardTerminal темы `space-pixel` приведены к + `photo_2026-08-20_14-10-27/36/40/43.jpg` прямым редактированием production-сцен. Сохранены все + обязательные bindings, скрытые CardAmount-слоты 08–15 и исходные bill/coin/card-анимации. + Повторная строгая сверка CardCustomAmount/CardAmount заменила приблизительный panel chrome на + трёхчастные исходные текстуры и локальные StyleBox с раздельной геометрией фона и текста. + Средняя RGB-разница внутри двух основных панелей снизилась с `13,28` до `7,64` и с `15,31` + до `10,88` соответственно; финальные кадры вручную сверены по геометрии, заголовкам, кнопкам, + CTA, bubble и footer. CashPayment сохраняет MAD `13,66`, CardTerminal — MAD `11,58`. +- Runtime CashPayment в Exchanger исправлен под уже существующий тройной binding-контракт: + `balance` получает только рубли, `tokens` — базовое количество жетонов, `bonus` — бонус в + формате `+ N ЖЕТОНОВ\nВ ПОДАРОК` либо `БЕЗ БОНУСА`. Поэтому host больше не стирает + pixel-perfect значения production-сцены и не объединяет рубли с жетонами в одной строке. + Форматирование покрыто отдельными тестами для нулевого баланса и двух бонусных порогов; + на этом этапе полный набор Exchanger прошёл `272` unit-теста, `17` hardware-тестов штатно пропущены. + Production Windows export успешно запустился, загрузил установленную `space-pixel` и завершился + без theme/binding/fallback-ошибок. PCK осталась байт-в-байт прежней: `718536` bytes, + SHA-256 `AEB8DD1199F71F1114D523CF9928FA6743383746A9DE689755131E8CE9F16BAA`. +- CardCustomAmount получил отдельный обязательный binding + `card_custom_amount.content.keypad_panel.content.input_value`: введённая сумма обновляется внутри + `summa_bar`, а верхние два Label показывают только базовые и бонусные жетоны через общий + `PricingPolicy`. Контракт содержит 461 ID и имеет SHA-256 + `EF5C75B467C87107DF070C3885693D69BF57434259EF3F54DB82E5F074172753`. + После расширения контракта прошли `276` unit-тестов, `17` hardware-тестов штатно пропущены; + production export с mock-hardware загрузил внешнюю тему без theme/binding/fallback-ошибок. + Новая установленная PCK: `721192` bytes, SHA-256 + `30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4`. +- Отдельная настройка «Короткий текст» добавила обязательный HOME Label + `home.scroll.content.speech_text` и три SETTINGS binding с сегментом `short_text`; deprecated + `subtitle` ID не возвращены. Поле ограничено 48 символами, а Label речевой плашки переносит, + центрирует и обрезает текст в пределах авторской композиции. После включения строгого Nearest + кегль HOME bubble увеличен с `12` до `16 px`, межстрочный интервал равен `-2 px`, а область + Label сужена до реальной белой части спрайта (`x=408..590`, `y=62..135`), поэтому короткая + фраза читается крупно и переносится внутри облака. +- После изменения `Test-PackagedBindingContract.ps1`, `test-theme example`, + `test-theme space-pixel`, `build-theme space-pixel` и штатный `verify_theme_pck.gd` прошли. + PCK smoke смонтировал пакет, инстанцировал 9 экранов и нашёл 3 scripted node instances. +- Footer из референса Home с логотипом `Robotic Retailers` и двухстрочным номером техподдержки + присутствует на восьми production-экранах. Семь экранов используют общий + `themes/space-pixel/package/components/footer.tscn`, Home сохраняет собственные обязательные + footer bindings, SETTINGS намеренно остаётся без footer. В `CardCustomAmount` подтверждение + поднято на `12 px`, поэтому его область не пересекается с footer. +- Актуальные `build/space-pixel.pck`, `build/active_theme.pck` и установленный + `%APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck` байт-в-байт совпадают: + размер `721192` bytes, SHA-256 + `30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4`. + 27 августа 2026 года после установки выполнен полный перезапуск Exchanger в `720×1280`: + runtime-журнал подтвердил активацию `space-pixel`, theme/resource/fallback-ошибок не было, + актуальные контрольные кадр и видео сохранены как + `build/exchanger-speech-bubble-runtime.png` и `build/exchanger-speech-bubble-runtime.avi`. + Корни всех девяти сцен наследуют `texture_filter = 1`, а production TTF импортируется без + antialiasing, hinting и subpixel positioning, с oversampling `1.0`. Contract, + validator/preview smoke и PCK smoke прошли; последний инстанцировал 9 экранов и нашёл + 10 scripted node instances. + +## Зафиксированные решения + +- Внешняя тема владеет визуальным деревом экранов; Exchanger владеет логикой и безопасностью. +- Интерактивный питомец является optional theme-owned компонентом из `InteractivePetScene`. + Публичный контракт использует только нейтральные pet-методы/сигналы; расположение и имена + текстурных каталогов не входят в контракт и определяются ссылками самой сцены. +- Навигация питомца также theme-owned: обязательные для темы с питомцем v1 `Node2D`-маркеры во + всех non-settings сценах объявляют bounds, горизонтальные поверхности, точки сидения и + связанные вертикальные края только через metadata. Settings намеренно исключён. + Host не вычисляет маршруты из имён/геометрии `Control`; component API сопоставляет semantic + actions с анимациями и сообщает scale `0.845`, скорости `88/72 px/s`, hit size `128×128` и + ground offset `(64,96)`. `GROUND_OFFSET=(64,96)` остаётся host-точкой контакта для всех + состояний; non-sitting анимации используют нулевую поправку дочернего визуала, а `sitting` — + `(0,24)`. Root, navigation и hit box при переключении состояний не меняются. +- Exchanger не добавляет, не удаляет, не переносит и не стилизует `Control` внутри ThemeView; + коллекции реализованы заранее созданными theme-owned слотами. +- Экранные клавиатуры являются теми же theme-owned слотами: host меняет только значения, + `Visible`/`Disabled` и подключает сигналы; создание или перестройка клавиш в runtime запрещены. +- Сервисная панель и её диалог также являются theme-owned слотами. Preview-переключатель + `INVENTORY: OFF/PANEL/DIALOG` меняет только видимость готовых узлов для диагностики. +- 28 августа 2026 года сервисный интерфейс добавлен в `example` и `space-pixel`: 12 новых + binding-слотов довели контракт до 473 элементов (373 на экране Settings), SHA-256 контракта + `7ABC98D7770782D0EB658E6EC8CD8FA4F504B0F61862C84FD5E3580341FE73F2`. + Contract check, validator и preview smoke прошли для обеих тем. Итоговые + `build/space-pixel.pck` и `build/active_theme.pck` имеют размер `730888` bytes и одинаковый + SHA-256 `AD665F4FFC840091E670407D4ADC82463AA269A91D54E181E3639BC8AB8BEF68`. +- 1 сентября 2026 года `space-pixel` использует проектный `button_cancel.png` для всех действий + «ОТМЕНА»/«УДАЛИТЬ». Пролёты НЛО главного экрана пересобраны по `interface.mp4`: большая + композиция проходит экран на `0–4` секундах, малая — на `9,75–13` секундах 14-секундного + цикла; координаты хранятся в системе `1080×1920` и один раз масштабируются production-сценой + до `720×1280`. Оба набора используют `AnimatedSprite2D` с двумя кадрами: большой — `1 fps`, + малый — `1,5 fps`. Старые одиночные пролёты и двойное уменьшение масштаба удалены. Godot preview + визуально проверен на `t=1/2/3/10,5/12/12,5`; contract check, validator и preview smoke прошли. + `build/space-pixel.pck`, `build/active_theme.pck` и установленная пользовательская копия + совпадают: `741032` bytes, SHA-256 + `E97F95F544BC257CB309789FD67585F93FFD1569F5662FE78ACCE7E7D0193D8A`. +- 2 сентября 2026 года фиксированный 14-секундный `AnimationPlayer` пролётов заменён на + `scripts/ufo_flight_controller.gd`. Большой и малый `AnimatedSprite2D` независимо проходят + экран, после случайной паузы разворачиваются через `flip_h` и летят обратно; высота каждого + нового прохода случайна в диапазоне `260–1660` координат исходной сцены и привязана к шагу + `3 px`. Покадровые циклы из двух кадров продолжают работать параллельно с Tween-движением. + Runtime-проверка подтвердила смену направления/высоты и работающий `flip_h`; contract check, + validator, preview smoke и PCK smoke прошли. PCK smoke инстанцировал 9 экранов и 18 scripted + node instances. Собранная, активная и установленная PCK совпадают: `741708` bytes, SHA-256 + `5034C3DB1DA44565ED45F682757C03E44D238ABDB1A0B2947F371A98C80C10BB`. В запущенном Exchanger + скрипт загружен из `res://exchanger_theme_dlc/` во всех девяти decoration-инстансах; Home + runtime подтвердил смену направления `-1 → 1`, высоты `1632 → 885` и активную смену кадров. +- Два референсных НЛО вокруг ценового блока Home получили отдельный theme-owned скрипт + `scripts/home_ufo_bobbing.gd`: левый движется с амплитудой `4 px` и периодом `3,2 с`, правый — + `5 px` и `3,8 с`, в противофазе. Каждый кадр смещения округлён до целого пикселя; базовые + позиции `AlienLeft y=130` и `AlienRight y=83` не изменены. Contract check, validator, preview + smoke и PCK smoke прошли; PCK smoke подтвердил 9 экранов и 19 scripted node instances. + Exchanger runtime загрузил `res://exchanger_theme_dlc/scripts/home_ufo_bobbing.gd` и подтвердил + изменение обеих Y-позиций при Nearest-фильтрации. PCK-копии совпадают: `743376` bytes, + SHA-256 `1646AA10C8DD5EA9AE70FA21040507889FC1719FF26E122464E105E9D2012AFE`. +- Двухкадровый нижний `Banner` экрана Cash больше не меняет видимый размер при переключении. + Исходные PNG `1024×256` сохранены; `scripts/stable_banner_animation.gd` компенсирует различие + их цветных bounds (`263×167` против `257×163`) масштабом и смещением второго кадра. В builder + runtime и в установленной PCK внутри Exchanger оба кадра получили одинаковый экранный Rect2 + `(34.996, 1000.8, 175.421, 111.389)`, autoplay `1 fps` продолжает работать. Contract check, + validator, preview smoke и PCK smoke прошли; PCK smoke подтвердил 9 экранов и 20 scripted node + instances. Собранная, активная и установленная PCK совпадают: `744728` bytes, SHA-256 + `FAD047504C95D14CFB8E999B7F5E4EA800BD3EE5AB4E95F3FA7F2836A4E3E8D5`. +- На экране CardAmount отдельные `ReferenceAlien` и `SelectionBubble` заменены тем же цельным + двухкадровым НЛО-баннером. Обязательный Label + `card_amount.content.selection_label` сохранён поверх белой части баннера, поэтому Exchanger + продолжает подставлять runtime-подсказку без изменения host-контракта. Нормализация кадров + выполняется `scripts/stable_banner_animation.gd`; preview, validator, contract check и PCK smoke + прошли, PCK smoke подтвердил 9 экранов и 21 scripted node instance. Установленный Exchanger + загрузил Banner и скрипт из `res://exchanger_theme_dlc/`. Собранная, активная и установленная + PCK совпадают: `744984` bytes, SHA-256 + `29A3386FB186415A5A2B30F6B9DFFF42BEBC532A8A43FA8809274F3F927B3784`. +- На CardCustomAmount пары `PromoAlien + PromoBubble`, а на CardTerminal + `ReferenceUfo + StatusBubble` заменены цельными двухкадровыми НЛО-баннерами. Обязательные + `card_custom_amount.content.hint` и `card_terminal.content.countdown` сохранены поверх белой + части. Оба экрана визуально проверены отдельно в `720×1280`; contract check, validator, preview + smoke и PCK smoke прошли, PCK smoke подтвердил 9 экранов и 23 scripted node instances. + PCK-копии совпадают: `745864` bytes, SHA-256 + `44E36EBBA126BADC34FD65FFEF78F8E4C7A280D4F56704EBBDCC0F2C63C479B1`. +- 2 сентября 2026 года host-контракт синхронизирован до 479 биндингов: добавлены + `card_terminal.content.top_bar.back_button`, наличный и безналичный таймауты Settings вместо + прежнего общего поля. `example` и `space-pixel` содержат готовые theme-owned элементы; + contract check, validator и preview smoke обеих тем прошли. Новый `space-pixel.pck` установлен + в Exchanger: 747192 bytes, SHA-256 + `9C42625A26B7620662392FD06F681529157EC129E5BB85BF4990254896A877A1`. + Headless runtime Exchanger с mock-оборудованием загрузил тему без binding-ошибок. +- 2 сентября 2026 года сервисные подписи `Hopper1Label` и `Hopper2Label` получили отдельные + binding-id точного остатка. Контракт синхронизирован до 481 биндинга, SHA-256 — + `DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143`. `example` и + `space-pixel` прошли contract check, validator и preview smoke. Панель `space-pixel` визуально + проверена в preview при `720×1280`: обе подписи целиком помещаются в существующие theme-owned + Label и не перекрывают кнопки. Собранные `space-pixel.pck` и `active_theme.pck` совпадают: + `748120` bytes, SHA-256 `B83FBB273588DA450C5A206BFC69C13517048DFD9D2861A2BEB2190BE4239E32`. + Host runtime-smoke с явным путём к PCK и mock-оборудованием прошёл без binding-ошибок; пакет в + пользовательский каталог не устанавливался. +- Preview и Exchanger инстанцируют те же готовые `ScreenScenes`; optional manifest-пути общего + фона/decoration пусты, чтобы host не дублировал встроенные слои сцены. +- Production-тема является доверенной и может исполнять GDScript и содержать собственные + runtime-узлы; manifest и 481 app-binding остаются обязательными. +- Host ищет элементы по metadata, а не NodePath, и сверяет SHA-256 каталога контракта. +- Основной фон статический. Покадровые анимации и НЛО — отдельные спрайты, не живой фон. +- Внутренние зависимости package задаются относительными путями, чтобы исходники всех тем + безопасно индексировались и открывались одновременно. +- Русская терминология интерфейса: «промо» и «промо-ролик». +- Автономная память проекта использует `project: exchanger-theme-dlc-builder`. +- 10 сентября 2026 года причина отсутствия последних визуальных изменений в Exchanger оказалась + не в новой сборке, а в устаревшей установленной копии PCK от 9 сентября. После повторной сборки + и установки `build/active_theme.pck` и пользовательский + `%APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck` после финальной + composite-правки совпадают: `1698608` bytes, SHA-256 + `4F65DA0758C4234BA752F112C50830010D0914E1EC5FCD76FD70D913614B45A3`. + Exchanger монтирует PCK при запуске, поэтому для применения заменённого файла требуется полностью + закрыть и снова запустить приложение. + +## Известные ограничения + +- Preview не запускает настоящую оплату, выдачу, COM-контроллер и сохранение настроек. Он показывает + начальные значения готовых theme-owned узлов; их реакцию на runtime-данные проверяют в Exchanger. +- Обновление binding-контракта требует доступного исходника совместимой версии Exchanger и + синхронного изменения host hash/tests. +- `themes_src/` и `preview_scenes/` сохранены как архив ранней модели и могут путать поиск; новые + изменения туда не вносятся. +- Фактический TTF идентифицирует себя как `VCR OSD Mono [RUS by Daymarius]`, версия от + 17 августа 2018 года, designer `MrManet`; поля copyright/license/license URL пусты. Оригинальный + автор VCR OSD Mono публично разрешил коммерческое использование, но отдельное разрешение автора + кириллической модификации из первичного источника не найдено. Для внутреннего использования файл + сохранён ради pixel-perfect метрик; перед публичной поставкой нужно получить письменное + подтверждение Daymarius либо заменить шрифт. +- Финальное визуальное совпадение всегда требует ручного просмотра всех экранов; headless smoke + не оценивает композицию. + +## Последнее изменение: переключатель интерактивного питомца + +17 сентября 2026 года готовый `ShowInteractivePet` в Settings обеих production-тем +(`example`, `space-pixel`) получил краткую подпись «ИНТЕРАКТИВНЫЙ ПИТОМЕЦ». Его supplemental +binding ID и тип не менялись. Exchanger делает переключатель недоступным, если активный manifest +не содержит `InteractivePetScene`; сохранённое предпочтение при этом не стирается и применяется +при следующей теме с питомцем. Контракт `BINDING_CONTRACT.md` уточнён; PCK требуется пересобрать +перед установкой в приложение. + +## Ближайшие разумные задачи + +1. Перед публичной поставкой получить письменное разрешение на кириллическую модификацию шрифта + либо заменить её на лицензированную альтернативу; для внутренней установки это не блокирует QA. +2. При изменениях host-контракта выполнить документированную миграцию и повторить runtime QA. +3. Для каждой новой темы начать с `example`, добавить её собственный `source/README.md` и + документировать отличия/лицензии. +4. После визуальных изменений сравнивать preview и реальный Exchanger на одинаковом `720×1280`. + +## Старт для нового ИИ-агента + +1. Полностью прочитать корневой `AGENTS.md`. +2. Выполнить agentmemory recall с project id `exchanger-theme-dlc-builder` по текущей задаче. +3. Проверить `git status`, если папка уже подключена к Git; на момент создания handoff локальная + папка могла ещё не быть инициализирована как отдельный репозиторий. +4. Прочитать профильный документ и `contracts/screen_bindings.v2.json` до изменения сцен. +5. Активировать конкретную тему и работать только в её `source/`/`package/`. +6. Завершить contract check, validator, preview smoke, визуальный QA и сохранение memory. + +Ziva-Godot запрещён. Для Editor используется только `godot-ai`. diff --git a/docs/QA_AND_TROUBLESHOOTING.md b/docs/QA_AND_TROUBLESHOOTING.md new file mode 100644 index 0000000..48f6da1 --- /dev/null +++ b/docs/QA_AND_TROUBLESHOOTING.md @@ -0,0 +1,89 @@ +# QA и решение проблем + +## Автоматический checklist + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId example +.\test-theme.ps1 -ThemeId space-pixel +.\build-theme.ps1 -ThemeId space-pixel +godot --headless --path . --script res://tools/verify_interactive_pet.gd -- --theme space-pixel +``` + +Проверяется формат manifest, девять сцен, root names/metadata, 481 immutable и 24 обязательных supplemental +обязательных ID, типы и уникальность, самодостаточные Theme/background/decoration, импорт GDScript +и остальных ресурсов, запуск preview и export PCK. +Если manifest содержит `InteractivePetScene`, `test-theme.ps1` и `build-theme.ps1` также запускают +generic pet verifier. Он проверяет scene/API/сигналы/анимации и неподвижность корня, но не ищет +текстуры по имени папки. + +## Визуальный checklist 720×1280 + +1. Убедитесь, что в меню `Редактор` доступны `Выбрать тему`, `Создать тему`, + `Экспортировать тему` и `Применить тему к Exchanger`, а selector показывает `example` и + `space-pixel`. Экспорт должен позволять выбрать каждый ID независимо от активной темы, затем + предложить путь `.pck`; применение — показать стандартный путь Exchanger. +2. Для выбора, создания, экспорта и применения проверьте окно прогресса: название этапа, процент, + итоговый путь и доступную после завершения кнопку закрытия. +3. Откройте все девять вкладок: HOME, CASH, SUM, KEYPAD, CARD, SUCCESS, ERROR, SERVICE, SETTINGS. +4. С `BINDINGS: ON` убедитесь, что каждый функциональный элемент имеет рамку и осмысленный ID. +5. С `BINDINGS: OFF` проверьте отступы, центрирование изображений, контраст текста, отсутствие + обрезания и перекрытий. +6. Проверьте длинные суммы, сообщения, русские подписи и все внутренние разделы SETTINGS. +7. В SETTINGS переключите `KEYBOARD: OFF → TEXT → NUM`: обе панели должны быть снизу, + не выходить за 720×1280, иметь кнопку скрытия справа сверху и удобные touch-клавиши. +8. С `BINDINGS: ON` проверьте все 57 keyboard ID; при `OFF` клавиатуры не должны занимать место. +9. Переключите `INVENTORY: OFF → PANEL → DIALOG`: проверьте остаток, обе кнопки, статус, + редактируемое количество и подтверждение; с `BINDINGS: ON` должны быть видны все 14 ID. +10. Убедитесь, что фон неподвижен, а движение ограничено отдельными спрайтами. +11. Сохраните `.tscn` или `.tres` при открытой вкладке и подтвердите live reload без сброса вкладки. +12. Просмотрите game/editor logs через `godot-ai`: новые parser/runtime/resource errors недопустимы. +13. Откройте хотя бы одну `.tscn` прямо из `themes//package/scenes/` и сравните с той же вкладкой: + кроме внешней навигации/overlay галерея не должна менять её вид или дерево. + +## Частые ошибки + +### Godot 4.7 не найден + +Запустите Godot Editor, добавьте `godot`/`godot4` в PATH, задайте в текущем терминале +`$env:GODOT4_EXECUTABLE = 'D:\path\to\Godot.exe'` или передайте `-GodotExecutable`. Не указывайте +исполняемый файл MCP-сервера `godot-ai`: это не Godot Editor. + +### Preview показывает не ту тему + +Повторите `activate-theme.ps1 -ThemeId ` и проверьте `build/active-theme.json`: поле +`Package` должно указывать на нужный `themes//package/`. Preview читает его напрямую. + +### Изменение package не появилось + +Preview должен быть запущен после активации. Сохраните файл на диск, подождите около секунды и +проверьте вывод `[Theme Preview]`. Для нового типа ресурса, которого нет в watched extensions, +перезапустите preview или дополните tooling отдельной задачей. + +### Missing/duplicate/wrong type binding + +Найдите ID в `contracts/screen_bindings.v2.json`, проверьте metadata узла и его Godot-класс. +Иерархия/имя дочернего узла не важны; ID, класс и уникальность обязательны. + +### Packaged binding catalog differs + +Не копируйте JSON вручную с изменением кодировки. Если host не менялся, восстановите точную копию +`contracts/screen_bindings.v2.json` в package. Если host изменился, выполните согласованную миграцию +из `BINDING_CONTRACT.md` и обновите Exchanger. + +### Скрипт работает в preview, но не после сборки + +Убедитесь, что `.gd` находится внутри `themes//package/` и прикреплён к экспортируемой сцене +либо загружается из неё. Проверьте относительные пути, parser errors при `test-theme.ps1` и журнал +Exchanger после полного перезапуска. `_init()` может вызываться при предварительной валидации +PackedScene; runtime-инициализацию, которой требуется SceneTree, размещайте в `_ready()`. + +### PCK собрался, но Exchanger использует fallback + +Закройте и перезапустите Exchanger, проверьте путь установки, manifest v2, hash контракта и журнал +ThemeManager. Затем выполните интеграционный checklist из `THEME_INTEGRATION.md`. + +## Критерий готовности + +Автоматические команды успешны, все девять экранов визуально проверены в портретном окне, журнал +чист, PCK содержит только production-ресурсы, изменения и ограничения отражены в docs/agentmemory. diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md new file mode 100644 index 0000000..93606ae --- /dev/null +++ b/docs/QUICK_START.md @@ -0,0 +1,53 @@ +# Быстрый старт из VS Code + +## Требования + +- Windows 10/11; +- Godot 4.7.x с поддержкой .NET (проект не компилирует C#, но использует ту же версию, что host); +- PowerShell 7 или Windows PowerShell 5.1; +- VS Code и рекомендованное расширение `geequlim.godot-tools`. + +Скрипты находят Godot в таком порядке: параметр `-GodotExecutable`, переменная процесса +`GODOT4_EXECUTABLE`/`GODOT_EXECUTABLE`, запущенный Godot Editor, команда `godot` или `godot4` в +`PATH`. Машинно-зависимый путь в `.vscode/settings.json` не хранится. + +## Первое открытие + +1. Откройте именно папку `ExchangerThemeDlcBuilder` в VS Code. +2. Для ИИ-агента первым сообщением попросите прочитать `AGENTS.md` и + `docs/PROJECT_CONTEXT.md`. Агент сам обязан восстановить память проекта. +3. Разрешите установку рекомендованного расширения. +4. Откройте проект в Godot Editor. Аддон `Exchanger Theme Manager` включён по умолчанию. +5. В меню `Редактор` нажмите `Выбрать тему`, выберите `space-pixel` и подтвердите выбор. + +Команда запишет выбранный package в `build/active-theme.json` и откроет главную preview-сцену +прямо из него. `Создать тему` в том же меню создаёт готовую копию `example`, проверяет ID и +сразу выбирает новую тему. После проверки закройте Exchanger и выберите +`Редактор → Применить тему к Exchanger`: аддон соберёт активную тему в фоне и установит PCK. +Если нужен только переносимый файл без установки, выберите `Редактор → Экспортировать тему` и +сначала укажите нужный ID темы (он не обязан быть активным в preview), затем задайте имя `.pck` в +стандартном диалоге сохранения. Все длительные команды показывают этап и процент выполнения. + +## Happy path новой темы + +Предпочтительный интерактивный путь: `Редактор → Создать тему`. Для скриптовой автоматизации: + +```powershell +Copy-Item -LiteralPath .\themes\example -Destination .\themes\my-theme -Recurse +# Отредактируйте ThemeId/DisplayName в themes/my-theme/package/manifest.json +.\activate-theme.ps1 -ThemeId my-theme +.\preview-theme.ps1 -ThemeId my-theme +.\test-theme.ps1 -ThemeId my-theme +.\build-theme.ps1 -ThemeId my-theme +``` + +Каталог `themes/my-theme/package/` сразу виден в Godot FileSystem — редактируйте сцены и ресурсы +там напрямую. Каждая созданная из `example` сцена уже содержит Theme, фон и decoration и при +прямом открытии выглядит так же, как в preview. Preview читает эти же файлы и автоматически +перезагрузит текущую вкладку после их сохранения. + +## Следующее чтение + +- перед изменением сцены — [BINDING_CONTRACT.md](BINDING_CONTRACT.md); +- перед сборкой и установкой — [WORKFLOW.md](WORKFLOW.md); +- при ошибке — [QA_AND_TROUBLESHOOTING.md](QA_AND_TROUBLESHOOTING.md). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..2d37592 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,34 @@ +# Документация Exchanger Theme DLC Builder + +Документы разделены по назначению, чтобы человек или новый ИИ-агент мог работать без доступа к +контексту основного проекта. + +## Начать работу + +- [QUICK_START.md](QUICK_START.md) — установка, VS Code, первая активация и happy path. +- [APPLY_THEME.md](APPLY_THEME.md) — пошаговое применение изменённой темы в Exchanger: preview, + проверки, сборка, установка и перезапуск. +- [PROJECT_CONTEXT.md](PROJECT_CONTEXT.md) — текущее состояние, подтверждённые ограничения и + ближайшие задачи; обязательное чтение для нового ИИ-агента. +- [CONTRIBUTING.md](../CONTRIBUTING.md) — правила изменения и checklist перед передачей результата. + +## Понять систему + +- [ARCHITECTURE.md](ARCHITECTURE.md) — границы Theme Builder/Exchanger и дерево каталогов. +- [BINDING_CONTRACT.md](BINDING_CONTRACT.md) — manifest v2, девять сцен, 481 immutable и 24 + supplemental runtime-биндингов, metadata и безопасная синхронизация с host. +- [WORKFLOW.md](WORKFLOW.md) — полный цикл activate → edit → live reload → save → validate → build + → install. + +## Создавать и проверять темы + +- [THEME_AUTHORING.md](THEME_AUTHORING.md) — практические правила визуальной разработки. +- [SCRIPTING.md](SCRIPTING.md) — GDScript, сигналы и произвольная runtime-логика доверенной темы. +- [COMPOSITE_PET_ANIMATIONS.md](COMPOSITE_PET_ANIMATIONS.md) — пошаговая сборка составного + действия питомца для дизайнера. +- [THEME_INTEGRATION.md](THEME_INTEGRATION.md) — установка PCK и runtime-проверка в Exchanger. +- [QA_AND_TROUBLESHOOTING.md](QA_AND_TROUBLESHOOTING.md) — visual QA, команды и типовые ошибки. +- [SPACE_PIXEL.md](SPACE_PIXEL.md) — решения, инвентаризация и ограничения темы `space-pixel`. + +Корневой [README](../README.md) — короткая стартовая страница. Инструкции ИИ находятся только в +[AGENTS.md](../AGENTS.md). diff --git a/docs/SCRIPTING.md b/docs/SCRIPTING.md new file mode 100644 index 0000000..f3f20a7 --- /dev/null +++ b/docs/SCRIPTING.md @@ -0,0 +1,280 @@ +# Скрипты и runtime-логика темы + +Темы Exchanger считаются доверенными. Любая production-сцена или вложенный компонент внутри +`themes//package/` может содержать GDScript и стандартные runtime-узлы Godot. + +## Где хранить скрипты + +Рекомендуемая структура: + +```text +themes//package/ +├── scripts/ GDScript темы +├── components/ переиспользуемые сцены со скриптами +├── scenes/ девять обязательных экранов +└── background_decoration.tscn +``` + +Прикрепляйте скрипт к узлу обычным действием Godot `Attach Script`. Путь должен находиться внутри +`package/`, например: + +```text +res://themes/space-pixel/package/scripts/alien_controller.gd +``` + +В текстовых `.tscn` зависимости храните относительным путём, например +`../scripts/alien_controller.gd` из `scenes/` или `scripts/alien_controller.gd` из корня package. +Во время сборки package переносится в `res://exchanger_theme_dlc/`, поэтому жёсткая builder-ссылка +`res://themes//package/...` не является переносимой. Build-workspace автоматически заменяет +известный package-префикс на runtime namespace, если Godot Editor всё же пересохранил такой путь, +но относительные ссылки остаются предпочтительными и понятнее при переносе темы между проектами. + +## Что разрешено + +- `_ready()`, `_process()` и `_physics_process()`; +- собственные сигналы и подключения сигналов Godot; +- `Tween`, `AnimationPlayer`, `AnimatedSprite2D` и method tracks; +- `Timer`, аудиоплееры, видео, частицы, шейдеры и процедурная графика; +- загрузка ресурсов темы, ввод и остальные API Godot, доступные приложению; +- сетевые и файловые операции стандартными API Godot. + +Builder больше не накладывает лимит на количество узлов, кадров, `AnimationPlayer`, FPS или +`speed_scale`. Exchanger также не применяет decoration budget. + +## Жизненный цикл + +Preview инстанцирует те же production-сцены, которые затем загружает Exchanger. Поэтому скрипт +работает в обоих окружениях без отдельной preview-копии. Изменения `.gd`, `.gdshader`, сцен, +ресурсов, изображений, шрифтов, аудио и OGV отслеживаются live reload preview. + +При проверке контракта PackedScene предварительно инстанцируется, чтобы найти binding metadata. +Из-за этого код `_init()` может выполниться ещё до реального показа экрана. Логику, которой нужен +SceneTree, autoload или готовые дочерние узлы, размещайте в `_ready()`. Освобождайте сигналы и +внешние ссылки в `_exit_tree()`, если скрипт подключается к объектам вне своей сцены. + +Экран создаётся заново при переходе к нему, если так работает текущий host-flow. Не храните +важное постоянное состояние только в полях узла темы: для него нужен app-owned сервис либо явно +выбранное внешнее хранилище. + +## Взаимодействие с Exchanger + +Exchanger продолжает подключать оплату, навигацию, настройки и оборудование к 481 обязательному +узлам через `exchanger_binding_id`. Скрипты темы могут параллельно подключаться к сигналам своих +узлов и менять своё дерево. + +Прямые пути вроде `/root/ThemeManager` или внутренние пути C#-контроллеров технически доступны, +но не являются стабильным контрактом темы. При такой интеграции фиксируйте требуемую версию +Exchanger в документации темы. + +## Пример + +В шаблоне находится скрипт: + +```text +themes/example/package/scripts/decoration_controller.gd +``` + +Он прикреплён к `background_decoration.tscn`, экспортирует параметры и показывает простую +анимацию через `_process()`. Свойство `animation_enabled` выключено по умолчанию; добавьте в +decoration дочерний спрайт и включите его, чтобы увидеть движение. + +В `space-pixel` скрипт `scripts/ufo_flight_controller.gd` управляет независимыми Tween-пролётами +двух `AnimatedSprite2D`. Он не вмешивается в их покадровое воспроизведение: после каждого прохода +спрайт разворачивается, выбирает новую случайную высоту и возвращается с противоположной стороны. +Отдельный `scripts/home_ufo_bobbing.gd` прикреплён к `visuals/home_top.tscn` и добавляет двум +референсным `TextureRect` лёгкое независимое вертикальное покачивание с округлением позиции до +целого пикселя. +Скрипт `scripts/stable_banner_animation.gd` прикреплён к двухкадровым `Banner` экранов Cash, +CardAmount, CardCustomAmount и CardTerminal и компенсирует различие видимых границ PNG через +frame-dependent scale/position, не заменяя и не отключая исходные кадры. + +### Нейтральный контракт интерактивного питомца + +Каждая тема может предоставить собственного питомца через необязательное поле manifest +`InteractivePetScene`. Рекомендуемый runtime-путь — +`res://exchanger_theme_dlc/components/interactive_pet.tscn`, однако сам manifest является +источником истины. Корень сцены наследует `Node2D`; анимационный компонент сам не меняет позицию +root, потому что перемещением управляет host. Он предоставляет методы `play_pet_animation()`, `pause_pet_animation()`, +`stop_pet_animation()`, `get_pet_animation_names()`, `get_pet_animation_frame_count()`, +`has_pet_animation()`, `get_current_pet_animation()` и `get_current_pet_frame()`. Сигналы +`pet_animation_started` и `pet_animation_completed` позволяют приложению строить интерактивное +поведение поверх визуального компонента. + +Viewer дополнительно использует необязательные методы `is_pet_animation_looping()`, +`get_pet_animation_frames_per_second()` и `get_pet_preview_size()`. Без них базовые ручное +переключение, пауза и повтор работают, но viewer не обязан знать длительность цикла или исходный +размер сцены. Список кнопок всегда строится из `get_pet_animation_names()` и не фиксирует имена +или количество состояний. + +Тема также может предоставить пару read-only методов `get_pet_animation_visual_offset(animation_name)` +и `get_pet_visual_offset()`. Если присутствует один из них, verifier требует оба. Первый сообщает +локальную поправку каждой анимации, второй — текущую; viewer использует объединённую область всех +объявленных поправок, чтобы вписать состояния разной высоты в stage без clipping. + +Для runtime-поведения компонент может дополнительно предоставить методы: + +```gdscript +get_pet_action_animation(action_name: StringName) -> StringName +get_pet_runtime_scale() -> float +get_pet_walk_speed() -> float +get_pet_climb_speed() -> float +get_pet_hit_size() -> Vector2 +get_pet_ground_offset() -> Vector2 +``` + +Все они необязательны для обратной совместимости. `get_pet_action_animation()` сопоставляет +нейтральные действия host с фактическими именами клипов конкретной темы. Для полного поведения +используются действия `idle`, `sit`, `interact`, `celebrate`, `walk_left`, `walk_right`, +`walk_start_left`, `walk_start_right`, `walk_finish_left`, `walk_finish_right`, `climb_start`, +`climb_up`, `climb_down`, `climb_finish`, `drag`, `drop` и `landing`. +`hanging` активно только во время удержания питомца. `falling` проигрывается во время падения +после отпускания и при падении со сохранённой позиции после смены экрана. После контакта с +опорой host один раз проигрывает прямую анимацию `landing`, затем переходит в `idle`; старые темы, +у которых `landing` отсутствует в списке анимаций, сохраняют fallback в `idle`. Запрос `dancing`, +поступивший во время `landing`, ставится в очередь до завершения приземления, после чего host явно +перезапускает праздничную анимацию четыре раза. Масштаб и обе скорости задаются положительными конечными числами; +`hit_size` — локальная область захвата пальцем/ЛКМ, а `ground_offset` — локальная точка контакта +лап с поверхностью. Host размещает root в `contact_point - ground_offset * runtime_scale`. + +После завершённой ходьбы актуальный Exchanger выбирает состояние простоя вероятностно: с +вероятностью `35%` запускает `idle`, а с вероятностью `65%` — `sitting`. `idle` удобно +использовать для активного ожидания стоя, а `sitting` — для спокойной посадки персонажа. +`sitting` остаётся необязательной: если её нет в списке анимаций, host использует `idle`, поэтому +ранее собранные темы продолжают работать без изменений. + +### Составные действия питомца + +Если вы собираете последовательность со стороны дизайна, начните с отдельного пошагового гайда +[COMPOSITE_PET_ANIMATIONS.md](COMPOSITE_PET_ANIMATIONS.md). Ниже приведён точный технический +контракт между темой и Exchanger. + +Уникальную последовательность конкретного вида питомца можно полностью оставить в теме. Для +этого компонент реализует весь необязательный контракт целиком: + +```gdscript +signal pet_composite_action_started(action_name: StringName, run_id: int) +signal pet_composite_action_finished(action_name: StringName, run_id: int, completed: bool) + +has_pet_composite_action(action_name: StringName) -> bool +start_pet_composite_action(action_name: StringName, runtime: Object, parameters: Dictionary) -> int +cancel_pet_composite_action(run_id: int, reason: StringName) -> void +``` + +Частичный набор методов или сигналов является ошибкой валидатора. `start_*` возвращает ровно +`runtime.GetRunId()` при принятии запуска и `0` при отказе. Тема испускает `started` после +принятия, а `finished(..., true)` — только после полного завершения. При отмене она прекращает +корутину, сбрасывает локальные визуальные преобразования и больше не вызывает переданный runtime. +Host также инвалидирует runtime при смене экрана, выгрузке темы, drag или конфликтующем действии, +поэтому после каждого `await` нужно проверять `runtime.IsActive()`. + +Переданный scoped runtime предоставляет строго ограниченный интерфейс ко внешнему движению: + +```text +GetRunId() -> int +IsActive() -> bool +GetViewportRect() -> Rect2 +GetAnchor() -> Vector2 +GetHighestSupport() -> Dictionary +SetMotionPolicy(policy: Dictionary) -> bool +SetAnchor(anchor: Vector2) -> Dictionary +MoveAnchor(delta: Vector2) -> Dictionary +LandOnSupport(surface_id: String) -> Dictionary +``` + +`anchor` — экранная точка контакта питомца, а не позиция его root. `GetHighestSupport()` возвращает +`accepted`, `valid`, `surface_id` и `anchor`; верхней считается доступная поверхность с наименьшим +Y, а при равенстве выбирается ближайшая по X. Результат `MoveAnchor()` содержит `accepted`, +фактический `anchor`, `wrapped`, `landed` и `surface_id`. `LandOnSupport()` выполняет явную +финальную привязку к существующей доступной поверхности. + +Поддерживаемые поля `SetMotionPolicy()`: + +- `navigation`: `suspended` запрещает обычную app-owned навигацию, `theme_driven` разрешает теме + перемещать anchor; +- `support_contacts`: `ignore`, `solid` или `after_vertical_wrap`; +- `screen_bounds`: `clamp`, `allow` или `wrap_vertical_once`; +- `input_enabled`: разрешает или запрещает drag/tap во время составного действия; +- `landing_surface_id`: целевая опора для контактов после wrap; +- `wrap_margin`: внешний вертикальный запас в пикселях. + +Это политика host-навигации, а не доступ к внутренним узлам приложения. Тема определяет порядок, +число повторов, визуальный scale и момент смены политики; приложение сохраняет экранную позицию, +проверяет границы/опоры и автоматически отзывает полномочия старого запуска. Неизвестные или старые +темы без этого API продолжают использовать одиночную semantic-анимацию `interact`. + +Маршрут принадлежит не персонажу, а конкретному экрану темы. Поэтому каждая production-сцена, +кроме Settings, объявляет собственный невидимый граф поверхностей и вертикальных переходов через +v1 metadata, описанные в +[BINDING_CONTRACT.md](BINDING_CONTRACT.md). Горизонтальные отрезки могут совпадать с полом, +верхними гранями кнопок и окон; отдельные sit points разрешают питомцу останавливаться и сидеть. +Climb edges связывают поверхности и задают, у какого левого/правого края разрешён подъём. Host не +вычисляет эти места по NodePath и не меняет визуальные `Control` темы. При смене экрана он +сохраняет текущую экранную позицию, включает граф новой сцены и проигрывает `falling` до её default +surface, затем `landing` и `idle`; Settings скрывает питомца, не сбрасывая сохранённую позицию. + +Текстуры, SpriteFrames и внутренняя иерархия не входят в публичный контракт. Сцена может ссылаться +на изображения из любой подпапки собственного `package/`; переименовывать каталог в `alien_pet` +не требуется. Важно лишь, чтобы все зависимости оставались внутри package и использовали +переносимые относительные либо канонические runtime-ссылки. + +Реализация `space-pixel` находится в `components/interactive_pet.tscn`; её скрипт +`scripts/interactive_pet.gd` собирает 22 sprite-sheet и предоставляет следующий собственный набор +анимаций: + +```text +action, climbing_action, climbing_action_start, climbing_action_stop, +climbing_down, climbing_start, climbing_up, come_closer, dancing, falling, hanging, idle, +landing, sitting, turn_left, turn_right, +walking_left, walking_left_start, walking_left_stop, walking_right, +walking_start_right, walking_right_stop +``` + +Через `get_pet_action_animation()` тема сопоставляет эти клипы нейтральным действиям host: `idle` +и `sitting` для ожидания, `action` для обычного действия, `dancing` для выдачи, парные +walking-анимации для ходьбы, +`climbing_start/up/down` для подъёма, `hanging` при удержании/перетаскивании, `falling` при +падении и `landing` для одноразового перехода к `idle` после обычной посадки. Актуальный host +после подъёма или спуска +сразу продолжает маршрут и не запрашивает `climb_finish`. Runtime-профиль рассчитан на сцены +`720×1280`: scale `0.845`, walk speed `88 px/s`, climb speed `72 px/s`, hit size `128×128`, +ground offset `(64,96)`. Для `sitting` визуальная поправка равна `(0,24)`, для каждой другой +анимации — `(0,0)`; root и `GROUND_OFFSET` при переключении не меняются. Поправка `sitting` +опускает только это состояние на `20,28` экранного пикселя при scale `0.845`. Прежняя поправка +`(0,-24)` у non-sitting состояний остаётся удалённой. + +`come_closer`, `landing`, `turn_left`, `turn_right`, `climbing_action_start` и +`climbing_action_stop` являются one-shot-переходами. `idle`, `action` и `climbing_action` +зациклены. `space-pixel` предоставляет составной `interact`: учитывает последнее направление, +проигрывает `turn_left`/`turn_right`, при `come_closer` увеличивает `VisualRoot` до ×2, повторяет +`action`, вычисляет число циклов `falling` по полной длине пути, проходит через нижнюю и верхнюю +границы без контакта с промежуточными опорами, садится на самую высокую доступную поверхность, +проигрывает `landing` и возвращается в `idle`. При `reduced_effects=true` приближение и проход +через границу пропускаются, но действие, посадка и возврат в idle сохраняются. + +Стартовые и завершающие состояния проигрываются один раз; остальные состояния зациклены. Экспорт +`return_to_sitting_after_one_shot` при необходимости автоматически возвращает питомца к `sitting`. +Все состояния можно проверить в отдельной сцене `tools/preview/interactive_pet_preview.tscn` или открыть +кнопкой `PET` в верхней панели основной галереи. Просмотрщик вписывает объединённую область всех +объявленных per-animation visual offsets в Stage; это только tooling и не меняет production-компонент. +Кнопка «СОСТАВНОЕ ДЕЙСТВИЕ: INTERACT» передаёт компоненту тестовый runtime с viewport и верхней +опорой, поэтому полный theme-owned сценарий можно проверить без запуска Exchanger. + +## Проверка и сборка + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId +.\build-theme.ps1 -ThemeId +``` + +`test-theme.ps1` импортирует скрипты в изолированном Godot-проекте и обнаруживает parser/resource +errors. Для проверки `_ready()`, сигналов и runtime-поведения дополнительно запустите preview, а +после сборки — Exchanger с установленным PCK. + +Готовый PCK можно отдельно смонтировать, инстанцировать все девять экранов и проверить наличие +прикреплённых скриптов: + +```powershell +godot --headless --path . --script res://tools/verify_theme_pck.gd -- ` + --pack (Resolve-Path .\build\example.pck) --require-scripts +``` diff --git a/docs/SPACE_PIXEL.md b/docs/SPACE_PIXEL.md new file mode 100644 index 0000000..d872c78 --- /dev/null +++ b/docs/SPACE_PIXEL.md @@ -0,0 +1,441 @@ +# Тема `space-pixel` + +## Реализованный вид + +- Статический pixel-art фон `background.png` размером 1080×1920. +- Кириллический pixel-font `VCR OSD Mono Cyr` для Label и Button. +- Зелёная текстура `button_big.png` как масштабируемый StyleBoxTexture для normal, hover, + pressed и disabled-состояний. +- Безопасная тёмно-синяя default-панель для существующих экранов Exchanger и отдельная + `WhitePanel`-вариация с настоящей белой заливкой, зелёной шапкой и тонкой рамкой из исходника. +- Семантические вариации текста, кнопок и панелей, включая `ScreenTitle`, `PanelTitle`, + `PanelText`, `AdvertisementPanel`, `FooterPanel`, `StatusPanel` и `WhitePanel`, для точного + воспроизведения контрастов референса без глобальной перекраски всех Control. +- Экранные заголовки используют общий кегль `36 px`; более компактный заголовок сервисного входа + — `30 px`. Блок техподдержки в Home и общем footer начинается с `x = 341 px`, поэтому обе строки + номера остаются левее правой границы при том же масштабе и не пересекаются с логотипом. +- Decoration-сцена с theme-owned скриптом `scripts/ufo_flight_controller.gd`: два кадра звёзд + и два `AnimatedSprite2D` с независимыми двусторонними пролётами. После выхода за край каждый + НЛО выдерживает случайную паузу, разворачивается через `flip_h` и возвращается на новой + случайной высоте в диапазоне `260–1660` исходной системы `1080×1920`. Высота привязана к шагу + `3 px`, чтобы после масштабирования production-экраном до `720×1280` коэффициентом `2/3` + оставаться целочисленной. Оба спрайта независимо переключают `frame_01.png`/`frame_02.png`; + скорость большого набора — `1 fps`, малого — `1,5 fps`. +- Два НЛО ценового блока Home в `visuals/home_top.tscn` сохраняют референсные базовые позиции, + но независимо покачиваются вверх-вниз через `scripts/home_ufo_bobbing.gd`: амплитуда слева + `4 px`, справа `5 px`, периоды `3,2` и `3,8` секунды. Смещение округляется до целого пикселя, + поэтому Nearest-фильтрация остаётся чёткой. +- Двухкадровый нижний баннер экранов Cash, CardAmount, CardCustomAmount и CardTerminal сохраняет + оба исходных кадра, но + `scripts/stable_banner_animation.gd` компенсирует различие их внутренней геометрии. Для + `frame_02` корректируются масштаб и опорная точка, поэтому видимая цветная область обоих + кадров занимает один `Rect2(34.996, 1000.8, 175.421, 111.389)` в координатах экрана. +- Красная текстура `button_cancel.png` используется через variation `CancelButton` для действий + «ОТМЕНА» и через `DangerButton` для всех кнопок «УДАЛИТЬ». +- Nearest-фильтрация в preview и decoration-сцене. Manifest `space-pixel` задаёт + `UseNearestTextureFilter: true`, поэтому Exchanger включает nearest только для этой DLC. +- Корни всех девяти production-сцен также явно задают `texture_filter = 1`. Это необходимо для + self-contained режима: Exchanger не переопределяет визуальные параметры такой сцены, а весь + текст и вложенные изображения наследуют Nearest непосредственно от theme-owned root даже при + физическом разрешении `1080×1920` и коэффициенте масштабирования `1,5`. + Интерполяционное размытие при этом устраняется; из-за дробного коэффициента отдельные исходные + пиксели неизбежно занимают разное число физических пикселей. + +## Сравнение с визуальными референсами + +Полностью просмотрены восемь JPG и 64 последовательных кадра `interface.mp4` с интервалом +0,5 секунды. Фото и видео находятся только в локальном, игнорируемом Git каталоге +`themes/space-pixel/source/references/` и никогда не экспортируются в PCK. + +Подтверждённые паттерны интерфейса: + +- фон всегда остаётся одним статическим космическим изображением; +- экранный заголовок белый, крупный и расположен сверху; кнопка `НАЗАД` — слева от него; +- информационные поверхности белые, с зелёной шапкой и тонкой зелёной окантовкой; +- между зелёной шапкой и содержимым сохраняется видимый белый интервал 16–20 px; в текущих + preview-сценах ему соответствует `separation = 28` с учётом внутренних полей текстуры панели; +- заголовки панелей и основной текст — тёмно-синие/почти чёрные; +- основное действие — одна широкая зелёная CTA-кнопка, вспомогательные действия компактнее; +- пинпад ручного ввода занимает основную рабочую область экрана и состоит из двенадцати + одинаковых квадратных клавиш `152×152 px` в сетке `3×4` с зазором `12 px`; +- PIN-клавиатура сервисного входа использует тот же квадратный визуальный стиль: двенадцать + клавиш `112×112 px` в центрированной сетке `3×4` с зазором `12 px`; +- иерархия читается сверху вниз: заголовок → баланс/состав выдачи → инструкция/выбор → действие; +- нижняя зона бренда и технической поддержки постоянна и отделена от основного действия; +- пришелец, НЛО и speech bubble занимают свободные зоны, но не закрывают функциональный контент; +- покадровые bill/coin/card/result-анимации принадлежат конкретным состояниям экрана, а не фону. +- экранные изображения центрируются по внутренней белой области после полей `WhitePanel`, поэтому + их координата не обязана совпадать с геометрическим центром внешней рамки панели. + +Home воспроизводит `themes_src/space_pixel/references/photo_2026-08-20_14-09-56.jpg` в его +исходном размере `720×1280`. Bubble-плашки, оба НЛО, панели наличия/оплаты, кнопки, билборд, +логотип и поддержка выставлены по измеренным пиксельным координатам; исходные PNG масштабируются +nearest-фильтром без подмены на приблизительные `StyleBoxFlat`. Скрипты `home_reference_label.gd` +и `home_stock_presenter.gd` сохраняют референсный формат цены/телефона и переключают индикатор +`МНОГО`/`МАЛО`, не меняя app-owned binding-id. + +Четыре транзакционных экрана также собраны непосредственно по JPG `720×1280`, без внешнего +preview chrome и без подмены их дерева галереей: + +- `screen_cash_payment.tscn` соответствует `photo_2026-08-20_14-10-27.jpg`: восстановлены + две балансные карточки, панель инструкции с исходной bill/coin-анимацией, широкая кнопка выдачи, + нижний НЛО, речевая плашка и footer; +- `screen_card_custom_amount.tscn` соответствует `photo_2026-08-20_14-10-36.jpg`: верхняя карточка + выдачи и панель ручного ввода имеют измеренные границы, клавиши `46×46 px`, а действия + `ОТМЕНА`/`0`/`OK` находятся в том же нижнем ряду, что и на фото; +- `screen_card_amount.tscn` соответствует `photo_2026-08-20_14-10-40.jpg`: показаны восемь + референсных сумм в двух колонках, отдельная кнопка «ДРУГАЯ СУММА», CTA подтверждения и нижняя + композиция с НЛО, bubble и footer; обязательные слоты 08–15 сохранены скрытыми; +- `screen_card_terminal.tscn` соответствует `photo_2026-08-20_14-10-43.jpg`: карточная анимация + остаётся внутри production-сцены, под ней расположена кнопка отмены и исходная нижняя композиция. + +Обязательные binding ID и типы узлов во всех четырёх сценах сохранены. Контрольные прямые рендеры +сделаны из самих production `.tscn`, а не из вручную собранного preview-макета. + +Последовательность видео подтверждает длительный home-loop с НЛО, cash-инструкцию с чередованием +кадров купюры/монеты, возврат на home, выбор карточной суммы, card-terminal loop и финальную +анимацию неуспешной оплаты. + +`tools/preview/preview.tscn` является переключаемой галереей в 720×1280. Девять production-сцен в +`themes/space-pixel/package/scenes/` показывают все текущие `ScreenId`: Home, cash-screen, выбор карточной суммы, +ручной ввод, терминал, успешную и неуспешную оплату, сервисный вход и настройки. SETTINGS содержит +восемь внутренних разделов и демонстрирует LineEdit, SpinBox, OptionButton, CheckButton, HSlider +и полосы прокрутки. Bill/coin/card/success/failed-анимации, кнопки, белые карточки, безопасные зоны +декора и footer принадлежат самим production-сценам. Галерея ничего не добавляет в их дерево и +только переключает сцены; live reload сохраняет основную вкладку и раздел SETTINGS. + +Отдельная builder-сцена `tools/preview/interactive_pet_preview.tscn` открывается кнопкой `PET` +основной галереи и динамически загружает `InteractivePetScene` активной темы. Для `space-pixel` +это `components/interactive_pet.tscn`, показанный в масштабе до `4×`. Все 22 анимации получают +кнопки из публичного списка компонента; также работают предыдущая/следующая, пауза, повтор, +счётчик кадров и автопоказ полного цикла каждого состояния. `Esc` и кнопка «← ГАЛЕРЕЯ» возвращают +к девяти production-экранам. Сцена и её `InteractivePetPreview.gd` являются только builder tooling +и в PCK не экспортируются. Кнопка `PET` недоступна для активной темы без питомца. + +Runtime-профиль питомца для сцен `720×1280`: scale `0.845`, ходьба `88 px/s`, подъём `72 px/s`, +touch/ЛКМ hit size `128×128`, точка лап `(64,96)`. Host вызывает реальные имена анимаций +напрямую: `idle`, `sitting`, `action`, `dancing`, все парные walking-анимации и +`climbing_start/up/down`; +в composite-действии `interact` увеличение до ×2 завершается за первые `75%` клипа +`come_closer`; заключительная четверть показывается в полном масштабе, затем выдерживается ещё +`0.15` секунды до запуска первого цикла `action`. +при начале выдачи host проигрывает четыре полных цикла `dancing`. `hanging` проигрывается при +удержании/перетаскивании, `falling` — при падении после отпускания и при смене экрана, а +одноразовый `landing` — после контакта с опорой; затем host включает зацикленный `idle`. Запрос +`celebrate` во время `landing` ждёт окончания приземления и только потом запускает четыре цикла +`dancing`. После завершённой ходьбы host выбирает `idle` с вероятностью `35%` или `sitting` с +вероятностью `65%`. +После подъёма или спуска host сразу продолжает маршрут без отдельной hanging-анимации. +Кадры и исходные каталоги текстур не менялись. + +Non-sitting состояния используют нулевую локальную поправку дочернего спрайта. `sitting` +использует отдельную поправку `(0,24)`, которая опускает только сидящего питомца на `20,28` +экранного пикселя при runtime scale `0.845`. Root, navigation, hit box и общая точка лап +`(64,96)` при переключении состояний не меняются. + +Невидимый `PetNavigation` присутствует во всех восьми production-сценах, кроме Settings, и в +сумме объявляет 51 реальную горизонтальную поверхность и 46 связанных climb edges. Каждый экран +имеет собственные поверхности пола, кнопок и окон; при переключении host сохраняет старую +позицию, переключает граф и опускает питомца на default-floor нового экрана. Settings намеренно +не содержит графа и скрывает питомца. + +В `screen_home.tscn` bounds равен `(32,48,656,1192)`, объявлены восемь поверхностей и десять +climb edges. Default surface — пол +`x=40..680, y=1240`. Питомец может останавливаться на верхних гранях billboard +`x=144..576, y=827`, окна способов оплаты `x=40..680, y=490`, окна остатка +`x=40..680, y=337`, кнопок наличной/безналичной оплаты (`y=550`), ценового окна и речевой +плашки (`y=60/61`). Парные переходы у `x=40` и `x=680` дают подъём по левому/правому краю между +полом, платёжным и верхним окном; дополнительные edges связывают billboard, обе кнопки и верхние +плашки. Узлы маршрута — только `Node2D` с metadata, поэтому они ничего не рисуют и не меняют +геометрию production `Control`. + +## Инвентаризация исходников + +| Группа | Материалы | +| --- | --- | +| Фон | `background.png`, два полноэкранных кадра звёзд | +| Кнопки | big, long, square, back, cancel и стрелки SpinBox вверх/вниз | +| Контейнеры | пять окон, три bubble-панели, billboard | +| Индикаторы | many, less, summa bar и тумблеры ON/OFF | +| Декорации | alien1–alien3, logo | +| Покадровая графика | banner (2), bill (4), coin (3), card (2), payment failed (3), payment success (5), UFO small (2), UFO large (2) | +| Интерактивный питомец | 22 sprite-sheet по сетке `128×128 px`, 414 непустых кадров | +| Шрифт | `VCR OSD Mono Cyr.ttf` | + +Всего в production package используется 75 PNG. `Цвета.txt` пуст, поэтому палитра определена по изображениям: +`#00183D` для fallback-фона, тёмно-синие поверхности/текст, зелёные контуры/кнопки, +фиолетовый focus-акцент и почти белый экранный текст. + +## Разделение runtime и исходников + +- `themes/space-pixel/source/` — сохранённый исходный материал пользователя и references. +- `themes/space-pixel/package/assets/` — копии с ASCII-путями для стабильной сборки PCK. +- `package/scenes/` — девять полноценных сцен с 481 immutable, 24 обязательными и двумя optional supplemental + metadata binding; optional правый персонаж Home также размечен собственным runtime ID. +- `package/components/on_screen_keyboards.tscn` — две оформленные пиксельные экранные + клавиатуры SETTINGS, скрытые по умолчанию и полностью принадлежащие теме. +- `package/components/interactive_pet.tscn` — визуальный компонент интерактивного питомца со всеми 22 + анимациями из `source/alien_animation`; runtime-API находится в + `package/scripts/interactive_pet.gd`. Имена `source/alien_animation` и + `package/assets/animations/alien_pet` сохранены только как theme-specific структура исходных + материалов; generic pet contract не требует таких имён от других тем. +- `package/ui_theme.tres`, decoration, visuals и `manifest.json` — исходник темы DLC v2. +- `tools/preview/` — tooling вне PCK; preview читает `package/` напрямую, без корневого staging. + +В PCK входят активные зависимости темы. Остальные runtime-копии сохранены в builder для +следующего расширения контракта. + +Обновление исходников от 7 сентября добавило `come_closer`, `idle`, `landing`, +`turn_left`, `turn_right`, `action`, `climbing_action_start`, `climbing_action_stop` и +`climbing_action`, +обновило `dancing` и добавило runtime-пиктограммы питомца `home`/`cross`. Собранный PCK содержит +все эти ресурсы; одноимённые дубликаты climbing-action листов сохранены только в `source/`. + +## Runtime-supported и preview-only ресурсы + +В runtime через DLC v2 поддерживаются: + +- базовые стили Godot Control и семантические variations из `ui_theme.tres`; +- один неподвижный фон, встроенный в каждую экранную сцену; +- один инстанс decoration-сцены с тремя покадровыми `AnimatedSprite2D` и theme-owned + GDScript/Tween-контроллером двусторонних пролётов в каждом экране; +- переиспользуемый компонент питомца `components/interactive_pet.tscn`: приложение получает путь + из `InteractivePetScene` manifest, semantic mapping и runtime-профиль; Home предоставляет + theme-owned граф поверхностей/подъёмов, а host исполняет перемещение и touch/ЛКМ drag; +- девять полноценных визуальных сцен, включая ServiceAccess и Settings. + +В блоке запаса Home слева остаётся состояние `МНОГО/ДОСТАТОЧНО/МАЛО`, по центру находится +theme-owned полоска, а справа Label `home.scroll.content.stock_status.approximate_count` +показывает приблизительный остаток: например `нет жетонов`, `<100`, `~100` или `>100`. + +Manifest сохраняет `UiThemePath` как описание package Theme, но его legacy-пути общего фона +и decoration пусты: production-сцены уже содержат эти слои, поэтому preview и Exchanger не должны +монтировать их повторно. + +Manifest `ExchangerThemeDlc` версии 2 использует `ScreenScenes` и временно сохраняет обратно +совместимый словарь `VisualSlots`. +Анимации купюры, монеты, карты и результатов, НЛО главного экрана и рамка промо-блока входят в +`active_theme.pck` и отображаются только в своих контейнерах. Интерактивные элементы и рабочий +текст остаются в Exchanger. + +## Семантическая интеграция с Exchanger + +Все `theme_type_variation`, размеры и отступы назначены внутри production-сцен, включая +фиксированные строки SETTINGS. Host не стилизует ThemeView. Поддерживаемый набор: + +- `ScreenTitle`: `CashPaymentScreen/.../TopBar/Title`, `CardAmountScreen/.../Content/Title`, + `CardCustomAmountScreen/.../TopBar/Title`, `CardTerminalScreen/.../Content/Title`; +- `BackButton`: одноимённые TopBar-кнопки CashPayment, CardAmount и CardCustomAmount; +- `WhitePanel`: Home `PricePanel`, `PaymentPanel` и `TokenStockStatus`; Cash `Summary`, + `BanknotePanel`, `CoinPanel`; CardAmount `AmountPanel`; CardCustom `AmountPanel`; + CardTerminal `InstructionPanel`, `PaymentPanel`; Success `ResultPanel`; Error `ErrorPanel`; +- `PanelTitle`: Home `PricePanel/.../Caption`, `PaymentPanel/.../Title`, TokenStockStatus `Title`; + Cash `Summary/.../Caption`; CardCustom `AmountPanel/.../Caption`; CardTerminal + `PaymentPanel/.../Caption`; Success/Error заголовки внутри result-панелей; +- `PanelText`: значения и описания внутри перечисленных WhitePanel, включая Balance/Tokens/Bonus, + Amount, Instruction, Message и stock State; +- `PrimaryButton`: Cash `DispenseButton`, CardCustom `ConfirmButton`, Success/Error `HomeButton`; +- `CompactButton`: Home `CashButton`/`CardButton`, CardAmount `OtherAmountButton` и динамически + создаваемые preset-кнопки, keypad CardCustom; +- `CancelButton`: CardCustom `ClearButton`, CardTerminal и ServiceAccess `CancelButton`, а также + кнопка отмены theme-owned сервисного диалога SETTINGS; +- `SupportText`: Home `Footer/.../Support` и новый общий footer остальных экранов. +- `ScreenDescription`: пояснения SERVICE и SETTINGS; +- `SectionTabButton`: пять переключателей разделов SETTINGS владельца; +- `SecondaryButton` и `DangerButton`: вторичные и удаляющие действия; +- `FieldLabel`, `StatusText`, `WarningText`, `ErrorText`: формы и состояния служебных экранов. +- `AdvertisementPanel`: промо-блок Home; `FooterPanel`: общий preview-footer; + `StatusPanel`: Home `StockPanel` и компактная панель подключения. + +Кроме variations тема задаёт базовые стили `LineEdit`, `SpinBox`, `OptionButton`, +`CheckButton`, `HSlider`, `VScrollBar` и `HScrollBar`; все такие Control уже находятся +в тематических сценах. + +Runtime-композиция синхронизирована с preview: host использует ту же сетку 720×1280, общий footer, +BackButton и объединённые панели Cash и Card. Кнопки preset/keypad и все фиксированные слоты +оформлены самой темой. SETTINGS намеренно сохраняет только пять вкладок владельца; технические панели +не возвращаются ради старого preview. + +Footer с логотипом `Robotic Retailers` и двухстрочным номером техподдержки занимает нижние +`152 px` и показывается на восьми production-экранах. Home содержит собственную идентичную +композицию с обязательными binding ID, остальные семь экранов подключают +`package/components/footer.tscn`. На SETTINGS footer намеренно отсутствует. + +## Проверки + +- 11 сентября 2026 года по итогам проверки в Exchanger только `sitting` опущен ещё на `24` + локальных пикселя: его visual offset теперь `(0,24)`, то есть `+20,28` экранного пикселя при + scale `0.845`. Все non-sitting анимации сохраняют исправленную нулевую поправку; verifier + проверяет переход `(0,24) → (0,0) → (0,24)` без движения root. Contract check, validator, + pet verifier, preview smoke и build прошли. Живой PET-preview `720×1280` подтвердил + current offset `(0,24)` и отсутствие clipping. `build/space-pixel.pck` и + `build/active_theme.pck` совпадают: `1700352` bytes, SHA-256 + `931A2EAA118722B95E49EA097C8CE41CE9E655F2CF7248CCA050B28A9AF50357`. +- 11 сентября 2026 года удалено ошибочное локальное смещение `(0,-24)` у всех non-sitting + анимаций питомца. Теперь переход `sitting → non-sitting → sitting` сохраняет нулевую поправку, + а положение root и точка лап `(64,96)` не меняются; это опускает прежние поднятые состояния + ровно на `20,28` экранного пикселя при scale `0.845`. Contract check, validator, pet verifier, + preview smoke и build прошли. `build/space-pixel.pck` и `build/active_theme.pck` совпадают: + `1700256` bytes, SHA-256 + `C1872763DA443190FA3CA2D281E1599B8C4F772CF290A19F3E4E580CAFE2336F`. +- 7 сентября 2026 года `CardAmount/RewardPanel` повторяет `CashPayment/Summary` по atlas-region, + размеру `649×125`, позиции `(36,148)` и rect заголовка/базового значения/бонуса. Обязательный + `Value` и supplemental `Bonus` сохранили прежние binding-id и канонические пути. Runtime QA + `720×1280`, contract check, validator/preview smoke, build и PCK smoke прошли; PCK — `1435772` bytes, + SHA-256 `F505882620719F154319A9CD93208F42ECB59FCC615410827A44DADED8F61404`. +- 4 сентября 2026 года scale питомца увеличен ровно на 30% (`0.65 → 0.845`), а сниженная высота + оставлена только для `sitting`; verifier подтвердил переход поправок `(0,0) → (0,-24) → (0,0)` + без смещения root. Contract check, validator, preview smoke, build, PCK verifier и host + `InteractivePetBehaviorSmoke` с явным PCK прошли. + Preview `720×1280` подтвердил отсутствие clipping, пересечения с заголовком и сохранение + Nearest для sitting/non-sitting; PCK — `1435452` bytes, SHA-256 + `390C9E3F83B026304F0E75E5A6AAD4458684BBCDFC847FFB542B6CFB1AC278E9`. +- Godot 4.7.1 импортирует все runtime-файлы без ошибок; pixel-font распознан автоматически. +- В `assets/fonts/vcr_osd_mono_cyr.ttf.import` отключены antialiasing, hinting и subpixel + positioning, oversampling зафиксирован в `1.0`. Все девять корней экранов имеют + `texture_filter = 1`, поэтому Labels, Buttons, LineEdit, SpinBox и прочий текст наследуют + Nearest без покомпонентных настроек. +- У всех текстовых variations отключены тени и обводка кнопок: при масштабировании preview до + 720×1280 символы не смешиваются с полупрозрачной копией. Светлый текст использует чистый белый, + а текст на белых и зелёных поверхностях — контрастный тёмно-синий цвет. +- Все девять вкладок production preview и восемь разделов SETTINGS запускаются без ошибок и визуально + проверены в окне 720×1280. +- В `CardCustomAmount` темы `space-pixel` проверена референсная панель `646×466 px`; все цифровые + клавиши имеют одинаковый квадратный размер `46×46 px`, длинные действия выровнены с нижним + рядом, а содержимое и footer не перекрываются. +- В `ServiceAccess` все двенадцать PIN-клавиш имеют одинаковый размер `112×112 px`; кнопки + `ВОЙТИ`, `ОТМЕНА` и footer остаются видимыми и не перекрываются. +- Нижние служебные ряды текстовой клавиатуры используют отдельный `KeyboardActionButton` без + прозрачных боковых полей исходной текстуры: все кнопки имеют высоту `76 px`, зазоры `12 px`, + стрелки — touch-target `88×76 px`, а `СТЕРЕТЬ`, `ОЧИСТИТЬ` и `ПРОБЕЛ` получили увеличенную + ширину под полные подписи. +- Кнопки скрытия текстовой и цифровой клавиатур остаются обычными `Button` с прежними binding ID, + но вместо надписи используют контрастную стрелку вниз из `button_down.png`. Обе кнопки имеют + квадратную область нажатия `64×64 px`, крупную центрированную пиктограмму и подсказку + «Скрыть клавиатуру». +- Описание приложения `subtitle` остаётся удалённым. Новая отдельная настройка «Короткий текст» + управляет фразой в белой речевой плашке возле НЛО: HOME Label ограничен геометрией bubble, + переносит до 48 символов, центрирует строки и обрезает выход за границы. Для читаемости при + Nearest его кегль увеличен с `12` до `16 px`; Label занимает внутреннюю белую область + `182×73 px`, использует `line_spacing = -2` и переносит текущую фразу на две строки. В SETTINGS + добавлены поле, ошибка и предпросмотр `short_text`; панели увеличены ровно под новый ряд без + пустых мест. +- `CheckButton` использует тёмно-синий текст, крупную зелёную touch-строку и исходные + `tumbler_on.png`/`tumbler_off.png` размером `128×64 px`; в живом SETTINGS проверены оба состояния + без обрезания и растяжения. У всех 12 строк отступ от левого края до текста и от правого края + до тумблера одинаковый — `24 px`. +- Все 57 `SpinBox` используют исходные `button_up.png`/`button_down.png`; их runtime-копии + уменьшены ближайшим соседом с `64×64` до `32×32 px`, поэтому обе квадратные кнопки целиком + помещаются справа от поля. Между полем и кнопками задан единый промежуток `10 px`, а variation + `SpinBoxInnerLineEdit` использует шрифт `18 px`. У 16 полей количества дополнительных жетонов + нет текстового суффикса: вся доступная ширина отведена многозначному числу. В живом SETTINGS + проверено изменение цены `10 → 11 → 10` и отображение бонусных строк. +- Фон всех текстовых полей `LineEdit` (включая focus/read-only), текстовых частей `SpinBox` + и полей выбора `OptionButton` использует видимую область `290×64 px` исходного + `summa_bar.png` через растягиваемый `StyleBoxTexture`. В живом SETTINGS проверены обычные + текстовые и числовые поля без искажения краёв и обрезания текста. +- Обе полосы `HSlider` в разделе SETTINGS → «ЗВУК» имеют высоту `36 px` вместо прежних + `14 px` (примерно в 2,6 раза выше). Видимый круглый grabber отключён; при значении `100%` + заполнение доходит до правого края. В живом Exchanger проверено, что полосы не обрезаются + и не нарушают компоновку соседних элементов. +- Decoration `space-pixel` использует корневой scripted `Node2D` и три `AnimatedSprite2D`. + Звёзды и оба НЛО имеют по два кадра; НЛО воспроизводят собственные покадровые циклы + одновременно с независимыми Tween-траекториями. + Это существенно ниже всех лимитов host. +- Live reload проверен реальным изменением `ScreenTitle/font_sizes/font_size`: новое значение + появилось в запущенной галерее без перезапуска, а активная вкладка сохранилась. +- Фон остаётся статическим; движение ограничено отдельными Sprite2D/AnimatedSprite2D. +- `build-theme.ps1` собирает `build/active_theme.pck`. +- Компонент `interactive_pet.tscn` проверен отдельно в builder и из смонтированного PCK: доступны все + 22 имени, 414 кадров, корректные loop/one-shot флаги и неизменная позиция корня. Sprite использует + Nearest-фильтрацию. Отдельная preview-сцена проверена в живом Godot при `720×1280`: стартовое + состояние `sitting`, все 22 кнопки доступны в прокручиваемом списке. + Итоговые `space-pixel.pck` и `active_theme.pck` совпадают: `1325176` bytes, + SHA-256 `7DB9F2108D478E7CDB77E3A85ACA33C8DD2EC27A68FA2CF61A28BF78B4331595`. +- Exchanger загружает пакет и активирует `space-pixel` вместо fallback-темы. +- После настройки Nearest фактический Exchanger повторно запущен в `720×1280`; контрольный кадр + `build/exchanger-speech-bubble-runtime.png` подтверждает жёсткие пиксельные края глифов и + читаемый перенос короткого текста. Собранная, активная и установленная PCK совпадают: + `721192` bytes, SHA-256 + `30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4`. +- После этих изменений `Test-PackagedBindingContract.ps1`, `test-theme example`, + `test-theme space-pixel` и `build-theme space-pixel` завершились успешно. +- Pixel-perfect Home QA выполнен прямым рендером production-сцены в `720×1280`: крупные белые + компоненты совпали с координатами JPG, а средняя абсолютная RGB-разница контрольного кадра + уменьшилась с `75,81` до `6,84` (разница включает JPEG-компрессию и rasterization текста). +- Транзакционные референсы проверены тем же прямым рендером `720×1280`: средняя абсолютная + RGB-разница CashPayment уменьшена с `66,66` до `13,66`, CardTerminal — с `59,14` до `11,58`; + после повторной строгой сверки средняя RGB-разница внутри двух основных панелей + CardCustomAmount уменьшена с `13,28` до `7,64`, CardAmount — с `15,31` до `10,88`. + Вручную подтверждены заголовки, текстурные рамки, квадратные клавиши, CTA, исходные анимации + и общий footer на финальных кадрах. Значение выдачи CardAmount совпадает с reference bounding + box полностью; «ДРУГАЯ СУММА» и CTA отличаются не более чем на один пиксель по краю текста. +- CashPayment использует три раздельных обязательных Label из контракта: `Balance` показывает + только рубли, `Tokens` — базовые жетоны, `Bonus` — дополнительные жетоны двумя строками. + Их исходные значения и расположение соответствуют `photo_2026-08-20_14-10-27.jpg`, а Exchanger + обновляет только текст, не меняя геометрию сцены. +- В CardCustomAmount Label `InputValue` внутри `summa_bar` теперь имеет собственный обязательный + binding и показывает фактически набранную сумму. Верхняя панель «К ВЫДАЧЕ» получает только + базовые и бонусные жетоны; host больше не объединяет рубли и жетоны и не оставляет статическое + значение `1000` в поле ввода. +- Актуальные `build/space-pixel.pck` и `build/active_theme.pck` с единым footer, Nearest-шрифтом + и отдельным `InputValue` binding имеют размер `721192` bytes и SHA-256 + `30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4`. + Штатный PCK smoke смонтировал пакет, инстанцировал девять экранов и подтвердил 10 scripted node + instances. Та же сборка установлена в стандартный каталог Exchanger и подтверждена совпадением + SHA-256. После полного запуска Exchanger в `720×1280` журнал подтвердил активацию `space-pixel` + без theme/resource/fallback-ошибок; актуальный Home-кадр сохранён в + `build/exchanger-speech-bubble-runtime.png`. +- 1 сентября 2026 года красный `button_cancel.png` подтверждён во всех variation + `CancelButton`/`DangerButton`. Пролёты `UfoLarge` и `UfoSmall` повторно измерены по + `interface.mp4`: контрольные позиции проверены на `t=1/2/3/10,5/12/12,5`, лишние старые + одиночные НЛО удалены, двойное уменьшение масштаба устранено. Оба набора остаются покадровыми: + `frame_01.png` и `frame_02.png` подключены к `AnimatedSprite2D` и воспроизводятся параллельно + уже выверенному движению. После + contract check, validator и preview smoke актуальные `build/space-pixel.pck` и + `build/active_theme.pck` совпадают: `741032` bytes, SHA-256 + `E97F95F544BC257CB309789FD67585F93FFD1569F5662FE78ACCE7E7D0193D8A`. + Эта же PCK установлена в `%APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck`; + runtime-журнал Exchanger подтвердил активацию внешней темы `space-pixel` без fallback и + theme/resource-ошибок, а контрольный кадр `720×1280` — корректную отрисовку Home. +- 2 сентября 2026 года runtime-проверка нового двустороннего контроллера подтвердила смену + направления `1 → -1`, `flip_h`, новую случайную высоту и продолжающуюся смену кадров. + Contract check, validator, preview smoke и PCK smoke прошли; PCK smoke инстанцировал девять + экранов и 18 scripted node instances. `build/space-pixel.pck`, `build/active_theme.pck` и + установленная пользовательская копия совпадают: `741708` bytes, SHA-256 + `5034C3DB1DA44565ED45F682757C03E44D238ABDB1A0B2947F371A98C80C10BB`. Exchanger загрузил + package-скрипт на всех девяти экранах; Home runtime подтвердил обратный пролёт, новую высоту + и продолжающуюся покадровую анимацию без ошибок журнала. +- Два статичных НЛО возле цены дополнены независимым мягким вертикальным покачиванием. Builder + runtime зафиксировал для левого позиции `132 → 133 → 127`, для правого `81 → 88 → 85` при + исходных `y=130/83`; исходная композиция и Nearest-фильтрация сохранены. Contract check, + validator, preview smoke и PCK smoke прошли; PCK smoke подтвердил 9 экранов и 19 scripted node + instances. Собранная, активная и установленная PCK совпадают: `743376` bytes, SHA-256 + `1646AA10C8DD5EA9AE70FA21040507889FC1719FF26E122464E105E9D2012AFE`. Живой Exchanger загрузил + `home_ufo_bobbing.gd` из package и подтвердил движение обоих НЛО без ошибок журнала. +- Для нижнего двухкадрового баннера Cash устранён скачок размера НЛО: исходные цветные области + `263×167` и `257×163 px` нормализуются runtime-трансформацией второго кадра. Принудительная + проверка `frame=0/1` подтвердила полностью одинаковые экранные bounds обоих кадров; autoplay + продолжает переключать изображения с исходной скоростью `1 fps`. +- 7 сентября три клипа ходьбы и их sprite-sheet получили актуальные имена: + `walking_right_stop`, `walking_left_stop` и `walking_left_start`. Semantic actions приложения + остались прежними и теперь сопоставлены новым клипам; `walking_start_right` завершает симметричную + пару стартовых состояний. + Contract check, validator, pet verifier, preview smoke, build и PCK smoke прошли. Итоговые + `build/space-pixel.pck` и `build/active_theme.pck` совпадают: `1658512` bytes, SHA-256 + `76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91`. +- 14 сентября у кнопки «ВЫБРАТЬ И ДОБАВИТЬ ПРОМО-РОЛИК» в SETTINGS задан явный кегль `17 px`. + До исправления inherited-кегль создавал минимальную ширину кнопки `636 px` и растягивал все + видимые панели раздела «ПРОМО» до `742 px`; после исправления минимум кнопки равен `365 px`, + поэтому панели укладываются в стандартные `664 px` между боковыми полями экрана `720×1280`. + Contract check, validator/preview smoke и build прошли. Итоговые `build/space-pixel.pck` и + `build/active_theme.pck` совпадают: `1700400` bytes, SHA-256 + `8082656B3F8DBAA74D6FC55659FDE99D636BF4A626BCECA99F93BA8C9123ECF7`. +- Production-ресурсы используют относительные ссылки внутри `package/`. Если Godot Editor + пересохранил их как `res://themes/space-pixel/package/...`, перед validator/build нужно вернуть + относительные пути, иначе изолированный workspace не найдёт ассеты. + +TTF идентифицирует себя как `VCR OSD Mono [RUS by Daymarius]`, но не содержит copyright/license +metadata. Автор оригинального VCR OSD Mono публично разрешил коммерческое использование; для +кириллической модификации первичное разрешение не найдено. Текущий файл допустим для внутренней +темы, но перед публичным распространением требуется письменное подтверждение Daymarius либо замена. diff --git a/docs/THEME_AUTHORING.md b/docs/THEME_AUTHORING.md new file mode 100644 index 0000000..dabf160 --- /dev/null +++ b/docs/THEME_AUTHORING.md @@ -0,0 +1,323 @@ +# Создание полносценовой темы Exchanger + +Для первого запуска начните с [быстрого старта](QUICK_START.md). Каноническое описание manifest и +metadata находится в [BINDING_CONTRACT.md](BINDING_CONTRACT.md), а последовательность команд — в +[WORKFLOW.md](WORKFLOW.md). + +## Модель темы + +Manifest версии 2 передаёт приложению полный визуальный корень каждого экрана. Exchanger оставляет +у себя бизнес-логику, навигацию, оплату, COM-контроллер и сохранение настроек, а тематическая сцена +определяет расположение, графику, анимацию и Godot `Control`-узлы. Приложение находит нужные узлы +по metadata binding-id и подключает к ним свою логику. + +Production-тема считается доверенной. На корень, дочерние и вложенные сцены можно назначать +GDScript, подключать сигналы и использовать обычные runtime-узлы Godot: `AnimationPlayer`, +`AnimatedSprite2D`, `Timer`, `AudioStreamPlayer*`, `HTTPRequest`, частицы и шейдеры. Подробный +порядок и особенности жизненного цикла описаны в [SCRIPTING.md](SCRIPTING.md). + +Оплата, выдача, COM-протокол и постоянные настройки остаются app-owned подсистемами Exchanger. +Скрипт темы может управлять своим деревом и взаимодействовать с доступным Godot runtime, но прямые +обращения к внутренним NodePath host не входят в стабильный binding-контракт. + +Визуальное дерево самодостаточно: root `Control` применяет `../ui_theme.tres`, содержит +полноэкранный `ThemeBackground` и инстанс `BackgroundDecoration` перед рабочим UI, а +также metadata `exchanger_self_contained_visuals = true`. Поэтому открытая `.tscn`, вкладка preview +и экран Exchanger используют одну и ту же композицию. В manifest `UiThemePath` сохраняется как +описание package Theme, но `BackgroundTexturePath` и `BackgroundDecorationPath` пусты — иначе +внешний background-layer host продублирует содержимое сцены. + +## Структура builder + +```text +themes/ +├── example/ # копируемая валидная тема-шаблон +│ ├── source/ # исходники и локальные references +│ └── package/ # единственное содержимое будущего PCK +└── space-pixel/ + ├── source/ # сохранённые исходные материалы пользователя + └── package/ + ├── manifest.json + ├── ui_theme.tres + ├── background_decoration.tscn + ├── assets/ + ├── components/ + ├── visuals/ + └── scenes/ +contracts/screen_bindings.v2.json # точный machine-readable каталог биндингов +tools/preview/ # preview overlay; никогда не входит в PCK +addons/exchanger_theme_manager/ # EditorPlugin выбора и создания тем +build/ # PCK, выбор темы и скрытые временные workspaces +``` + +Редактируйте `themes//package/`: это единственный источник preview и будущего PCK. +`source/references/` не экспортируется и игнорируется Git. +Старые `themes_src/` и `preview_scenes/` временно сохранены как архив исходных материалов и прежних +визуальных макетов; новые темы создаются только внутри `themes/`. + +## Создание новой темы + +1. В Godot Editor выберите `Редактор → Создать тему`. +2. Введите ID из строчных латинских букв, цифр и дефисов и понятное название. +3. Аддон скопирует `themes/example`, обновит `ThemeId`/`DisplayName`, активирует тему и откроет + preview. + +Все темы сразу видны в Godot FileSystem: `.gdignore` внутри `themes/` не используется. Аддон +удаляет legacy-файл из корня каждой темы при открытии проекта и не копирует его при создании темы. +Для неинтерактивной автоматизации новая тема создаётся копированием `example`, после чего +активируется: + +```powershell +.\activate-theme.ps1 -ThemeId +``` + +4. Откройте `res://themes//package/` в Godot и редактируйте исходники темы напрямую: + работающий preview читает эти же файлы и автоматически перезагружается после сохранения. +5. Запустите проект (`F6`/`F5`). Все девять production-сцен видны во вкладках, а overlay биндингов + включён по умолчанию. +6. Соберите PCK командой из раздела «Сборка». + +## Имена сцен + +Имена и пути фиксированы: + +| Screen binding | Файл | Имя корня | +| --- | --- | --- | +| `screen.home` | `screen_home.tscn` | `ThemeScreen_Home` | +| `screen.cash_payment` | `screen_cash_payment.tscn` | `ThemeScreen_CashPayment` | +| `screen.card_amount` | `screen_card_amount.tscn` | `ThemeScreen_CardAmount` | +| `screen.card_custom_amount` | `screen_card_custom_amount.tscn` | `ThemeScreen_CardCustomAmount` | +| `screen.card_terminal` | `screen_card_terminal.tscn` | `ThemeScreen_CardTerminal` | +| `screen.success` | `screen_success.tscn` | `ThemeScreen_Success` | +| `screen.error` | `screen_error.tscn` | `ThemeScreen_Error` | +| `screen.service_access` | `screen_service_access.tscn` | `ThemeScreen_ServiceAccess` | +| `screen.settings` | `screen_settings.tscn` | `ThemeScreen_Settings` | + +В PCK каждый файл обязан находиться в `res://exchanger_theme_dlc/scenes/`. + +Сцена `screen_card_custom_amount.tscn` в шаблоне уже содержит эталонную раскладку пинпада: +широкую рабочую панель, центрированную сетку `3×4`, зазоры `12 px` и двенадцать квадратных +клавиш `152×152 px`. При оформлении новой темы можно менять их графику и стили, сохраняя +binding-id, типы узлов и удобную touch-геометрию. + +Клавиатура PIN-кода в `screen_service_access.tscn` использует ту же вариацию `KeypadButton`: +центрированную сетку `3×4`, зазоры `12 px` и двенадцать квадратных клавиш `112×112 px`. +Меньший размер оставляет место для статуса, действий `ВОЙТИ`/`ОТМЕНА` и общего footer. + +## Metadata биндингов + +Корень имеет metadata: + +```text +exchanger_screen_binding_id = screen. +``` + +Каждый интерактивный или динамически обновляемый элемент имеет: + +```text +exchanger_binding_id = <точный id из contracts/screen_bindings.v2.json> +``` + +Идентификатор не зависит от фактической иерархии тематической сцены. Узлы можно перемещать и +переименовывать, но binding-id, требуемый тип и уникальность изменять нельзя. Для `Button` нужен +узел класса `Button` или наследник, для `Label` — `Label`, для `Control` — любой наследник +`Control`. Каталог содержит 481 обязательный immutable element-binding и исходный fallback path +каждого. Текущий Builder дополнительно требует 24 supplemental runtime-binding; ещё два +совместимых optional ID для текстов баннеров не препятствуют проверке старой темы. Полностью +обновлённая тема содержит 509 element-binding. Их полный список приведён в +[BINDING_CONTRACT.md](BINDING_CONTRACT.md#supplemental-runtime-bindings). +Его байт-в-байт копия обязана находиться в каждой теме по пути +`package/contracts/screen_bindings.v2.json` и экспортируется как +`res://exchanger_theme_dlc/contracts/screen_bindings.v2.json`. Перед загрузкой сцен Exchanger +сверяет SHA-256 этого файла с закреплённым в приложении хешем контракта. Поэтому каталог нельзя +переформатировать, сокращать или генерировать независимо от host: нужна точная байтовая копия. + +Ни один binding-контейнер не является пустым местом для runtime UI. Home содержит готовые +theme-owned состояния запаса/подключения и узлы промо. CardAmount и Settings содержат полный набор +фиксированных индексированных слотов. Дизайнер оформляет каждый слот в сцене; Exchanger только +заполняет существующие поля и скрывает неиспользуемые root-слоты. + +Итоговые панели CashPayment, CardAmount и CardCustomAmount используют общий визуальный паттерн с +заголовком «К ВЫДАЧЕ»: базовые жетоны находятся слева, бонус — справа. В CardAmount сохраняйте +обязательный `Label` `Value` с binding-id `card_amount.content.reward_panel.content.value` по пути +`SafeMargin/Content/RewardPanel/Content/Value` и добавляйте сразу после него `Label` `Bonus` с +supplemental binding-id `card_amount.content.reward_panel.content.bonus` по пути +`SafeMargin/Content/RewardPanel/Content/Bonus`. `Value` содержит только базовые жетоны, `Bonus` — +`+ N ЖЕТОНОВ\nВ ПОДАРОК` либо `БЕЗ БОНУСА`. Supplemental ID не добавляется в JSON-каталог 481 +элемента; его отсутствие в старой теме обрабатывает host fallback, но в новых темах он обязателен +для Builder Validator. + +В CardCustomAmount существующие `Amount` и `Tokens` сохраняют контрактные ID и пути, но также +размещаются соответственно слева и справа. Двухстрочный bonus sample должен содержать явный перенос +перед «В ПОДАРОК»; динамический текст меняет host. Не объединяйте эти значения и не создавайте +runtime-узлы из host-кода. + +Отдельный Label `home.scroll.content.speech_text` выводит короткую фразу покупателю в речевой +плашке Home. В SETTINGS ей соответствуют `short_text`, `short_text_error` и строка предпросмотра; +поле ограничено 48 символами. Это самостоятельная настройка, не описание приложения и не +устаревший `subtitle`. Label Home должен переносить текст, обрезать выход за границы и сохранять +горизонтальное/вертикальное центрирование внутри авторской плашки. + +В актуальном интерфейсе SETTINGS → «Общие» владельцу автомата показывается поле с подписью +«СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ» и контакты техподдержки. Узлы `application_name` и весь +`branding_preview_panel` сохраняются с прежними binding-id и типами только для совместимости, +но по умолчанию скрыты и не занимают место в композиции. Не удаляйте и не переименовывайте эти +узлы при оформлении темы. + +Не добавляйте в preview демонстрационные замены этих узлов: начальные значения и видимость +настраиваются прямо в production-сцене. В `example` и `space-pixel` первые восемь сумм видимы, +резервные слоты 08–15 скрыты; бонусы и промо-строки начинают с видимого `empty_state`. + +Экран SETTINGS также инстанцирует собственный +`package/components/on_screen_keyboards.tscn`. В нём заранее находятся две скрытые панели: +текстовая (33 буквенных слота 12/11/10 и служебные действия) и цифровая (0–9, очистка, +удаление). Менять композицию и оформление можно, но нельзя удалять binding metadata, менять тип +клавиш или включать фокус у `Button`. Кнопка скрытия каждой панели располагается справа в её +верхней строке. Для проверки используйте `KEYBOARD: OFF/TEXT/NUM` на вкладке SETTINGS preview. + +В той же SETTINGS-сцене заранее создаются скрытые `ServiceInventoryPanel` и +`ServiceDialogOverlay`. Панель показывает учтённый остаток и две операции, а диалог содержит +редактируемое количество и подтверждение. Сохраняйте 14 точных ID из контракта, тип `SpinBox` +для `amount`, пустой suffix и начальное `visible = false` у панели и overlay. На самом +`Description` обязателен supplemental binding-id +`...service_inventory_panel.margin.content.description`, чтобы host мог менять описание +по режиму учёта. Сразу после `Description` панель также содержит supplemental +`CheckButton` `InventoryAccountingEnabled` с binding-id +`...service_inventory_panel.margin.content.inventory_enabled`, подписью +«УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ» и включённым состоянием по умолчанию. Сразу после него обязателен +второй `CheckButton` `PurchaseLimitEnabled` с binding-id +`...service_inventory_panel.margin.content.purchase_limit_enabled`, подписью «НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА» и +включённым состоянием по умолчанию. Минимальная высота сервисной панели — `772 px`; тема может увеличить +фактическую высоту из-за своих minimum sizes. Все три supplemental ID не входят в JSON-каталог 481 +элемента, но обязательны для совместимого runtime и проверяются Builder +Validator. Для визуальной проверки используйте `INVENTORY: OFF/PANEL/DIALOG`. + +## Preview и подписи + +`tools/preview/BindingOverlay.gd` обходит реально загруженную production-сцену и показывает рамку +и binding-id каждого размеченного узла. Кнопка `BINDINGS: ON/OFF` находится первой слева в общей +верхней панели экранов и управляет overlay. Overlay и preview-скрипты находятся вне package, +поэтому не экспортируются в production PCK. + +Галерея не меняет root, anchors, Theme или дочерние узлы production-сцены и не добавляет +демонстрационные подписи в Home-host. Единственное наложение — отдельный sibling `BindingOverlay`. + +Preview следит за package активной темы, путь к которой записан в `build/active-theme.json`. +После изменения `.tscn`, `.tres`, JSON, изображений, шрифтов или звука галерея перезагружается +с сохранением выбранной вкладки. + +## Интерактивный питомец темы + +Питомец необязателен и полностью принадлежит конкретной теме. Создайте любую `Node2D`-сцену +внутри `package/`, реализуйте публичные методы и сигналы из [SCRIPTING.md](SCRIPTING.md), затем +укажите её канонический runtime-путь в `InteractivePetScene` manifest. Рекомендуемое имя сцены — +`components/interactive_pet.tscn`, но графику можно хранить в любой собственной подпапке package +и подключать обычными относительными resource-ссылками. Builder не требует `alien_pet`, +`alien_animation` или другого персонажно-зависимого имени каталога. + +Кнопка `PET` доступна только когда active manifest объявляет загружаемую сцену. Viewer сам +инстанцирует компонент и создаёт кнопки по `get_pet_animation_names()`, поэтому число и имена +состояний выбирает автор темы. Старый путь `components/alien_pet.tscn` распознаётся только как +fallback миграции ранее собранных тем и не должен использоваться в новых packages. + +Для составного действия начните с дизайнерской раскадровки и пошагового руководства +[COMPOSITE_PET_ANIMATIONS.md](COMPOSITE_PET_ANIMATIONS.md). Composite API не добавляет новых +`exchanger_binding_id`: питомец подключается через manifest и методы сцены, а его маршруты — через +navigation v1 metadata экранов. + +Чтобы питомец ходил по элементам всех экранов, добавьте под root каждой production-сцены, кроме +`screen.settings`, невидимый `Node2D` с `exchanger_pet_navigation_root = true` и v1 metadata из +[BINDING_CONTRACT.md](BINDING_CONTRACT.md). Отдельными `Node2D` разметьте горизонтальные верхние +грани пола, кнопок и окон, допустимые точки сидения и вертикальные climb edges между ними. +Координаты являются реальными scene-local точками контакта; имена marker-узлов произвольны и host +их не читает. При смене экрана питомец падает со старой позиции на default surface нового графа, +затем использует все его поверхности. В Settings питомец скрыт. Не меняйте ради навигации +размеры/позиции визуальных `Control` и не добавляйте видимые линии: маркеры сами ничего не рисуют. + +Для корректной посадки персонажа реализуйте optional `get_pet_ground_offset()` и runtime-профиль +из [SCRIPTING.md](SCRIPTING.md). Имена, передаваемые host, совпадают с реальными именами +анимаций темы. `get_pet_hit_size()` определяет зону захвата пальцем и зажатой ЛКМ; `hanging` +выбирает анимацию на время удержания и перетаскивания, `falling` — на время падения после +отпускания или перехода между экранами, +`landing` — одноразовую анимацию после контакта с опорой, а `idle` — устойчивый цикл ожидания +после её завершения. Если тема не предоставляет `landing`, host сразу переходит из `falling` в +`idle`, сохраняя совместимость со старыми темами. `celebrate` запускает праздничную анимацию при +начале выдачи жетонов; запрос, пришедший во время `landing`, ждёт окончания приземления. Host +проигрывает четыре полных цикла `celebrate`; для точного времени тема должна возвращать корректную +скорость через `get_pet_animation_frames_per_second()`. + +После завершённой ходьбы Exchanger выбирает состояние простоя случайно: с вероятностью `35%` +запускает `idle`, а с вероятностью `65%` — `sitting`. Если `sitting` отсутствует, host использует +`idle`, поэтому старые темы не требуют обновления. + +## Manifest v2 + +`ScreenScenes` должен содержать ровно девять канонических пар из таблицы выше. Старый словарь +`VisualSlots` допускается для обратной совместимости `space-pixel`, но полноэкранный host использует +`ScreenScenes`. Внутренние English-идентификаторы `Advertisement*` остаются стабильными; видимый +русский текст использует только «промо» и «промо-ролик». + +## Проверка и синхронизация контракта + +Для обычной автономной разработки темы сначала проверяйте копии без обращения к host: + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId +``` + +Каталог можно пересобрать из C# host: + +```powershell +.\tools\Sync-HostBindingContract.ps1 -HostProject ..\exchanger +.\tools\Sync-HostBindingContract.ps1 -HostProject ..\exchanger -Check +``` + +Эталонные структуры сцен можно повторно импортировать из fallback-сцен host и автоматически +разметить: + +```powershell +.\tools\Import-HostSceneTemplates.ps1 -HostProject ..\exchanger -ThemeIds example,space-pixel +``` + +Команда импорта перезаписывает `package/scenes`, поэтому индивидуальную композицию темы сначала +сохраните отдельно. Валидатор запускается автоматически при сборке и проверяет manifest, имена, +root metadata, наличие и типы всех биндингов и уникальность id. Скрипты и runtime-узлы темы +разрешены и проверяются обычным импортом Godot. + +## Сборка + +```powershell +.\build-theme.ps1 -ThemeId space-pixel +.\build-theme.ps1 -ThemeId my-theme -InstallToDefaultUserPath +.\build-theme.ps1 -ThemeSource D:\Themes\my-theme -OutputPath build\my-theme.pck +``` + +Сборка выбирает тему, копирует только `package/` во временный изолированный проект под +канонический runtime-путь `res://exchanger_theme_dlc/`, валидирует, создаёт +`build/.pck` и удаляет workspace. Совместимая копия также записывается в +`build/active_theme.pck`. + +Для шрифтов сборка сохраняет настройки соседнего `.import` и переносит их на runtime-путь. +Для строгого pixel-font вида выставьте в Godot `Antialiasing: None`, `Hinting: None`, +`Subpixel Positioning: Disabled`, `Oversampling: 1.0`, а на корне production-сцены — +`Texture Filter: Nearest`. Это действует на весь текст, наследующий фильтр корня. +Если manifest содержит `UseNearestTextureFilter: true`, валидатор требует `Nearest` на корне +каждой из девяти production-сцен: одной фильтрации `ThemeBackground` недостаточно. При переходе +с логического `720×1280` на физическое `1080×1920` коэффициент равен `1,5`; Nearest убирает +смешивание соседних пикселей, но не может сделать дробное масштабирование равномерным — строгие +одинаковые pixel-блоки возможны только при целочисленном коэффициенте. + +## Критерии готовности + +- manifest версии 2 содержит девять `ScreenScenes`; +- имена файлов, корней и screen metadata строго канонические; +- 481 immutable и 24 обязательных supplemental element-binding присутствуют по одному разу и + имеют допустимые типы; +- GDScript и все его зависимости импортируются без parser/runtime-ошибок; +- каждая сцена сама содержит package Theme, `ThemeBackground`, `BackgroundDecoration` и root-флаг + `exchanger_self_contained_visuals = true`; +- визуальные эффекты и скриптовая логика корректно работают в preview и Exchanger; +- overlay показывает все биндинги на всех девяти вкладках; +- валидатор, preview smoke и export PCK проходят без ошибок; +- PCK проверен в Exchanger, включая переходы, ввод, настройки, оплату и выдачу. diff --git a/docs/THEME_INTEGRATION.md b/docs/THEME_INTEGRATION.md new file mode 100644 index 0000000..134ca7b --- /dev/null +++ b/docs/THEME_INTEGRATION.md @@ -0,0 +1,73 @@ +# Интеграция полносценовой темы в Exchanger + +Этот документ описывает границу с основным приложением. Для локального цикла разработки используйте +[WORKFLOW.md](WORKFLOW.md), а для точной схемы контракта — +[BINDING_CONTRACT.md](BINDING_CONTRACT.md). + +## Граница ответственности + +Exchanger монтирует один внешний PCK, проверяет manifest v2 и создаёт визуальный корень выбранного +экрана из `ScreenScenes`. C#-контроллер экрана остаётся в приложении. Он разрешает нужные тематические +узлы по `exchanger_binding_id`, подписывает кнопки и обновляет текст/состояния. Он не добавляет, +не удаляет, не переносит и не стилизует визуальные узлы ThemeView. Тема считается доверенной: +прикреплённый GDScript и её runtime-узлы исполняются как часть инстанцированной сцены. +App-owned C#-контроллеры оплаты, оборудования и настроек остаются вне ThemeView, но тема может +содержать собственные таймеры, аудио, сетевые запросы и другую вспомогательную логику. + +PackedScene уже содержит root Theme, `ThemeBackground` и `BackgroundDecoration`; это тот же файл, +который открывается напрямую и показывается в builder preview. `UiThemePath` описывает Theme +самодостаточных сцен. `BackgroundTexturePath` и `BackgroundDecorationPath` у +самодостаточных тем пусты, поэтому общий background-layer Exchanger не дублирует визуальные слои +экранной сцены. + +При любой ошибке PCK приложение использует единственную встроенную fallback-тему. + +## Установка + +```powershell +.\build-theme.ps1 -ThemeId space-pixel -InstallToDefaultUserPath +``` + +Пакет устанавливается в: + +```text +%APPDATA%\Godot\app_userdata\Exchanger\theme_dlc\active_theme.pck +``` + +Перед заменой PCK закройте Exchanger. После установки выполните полный перезапуск. + +## Контракт + +Источником истины для автономной работы builder является `contracts/screen_bindings.v2.json`. +Он генерируется и при согласованной миграции синхронизируется с: + +- `src/core/ThemeManager/ThemeSceneContract.cs`; +- `src/core/ThemeManager/ThemeBindingResolver.cs`; +- вызовами `GetNode(SafeMargin/...)` в девяти C#-контроллерах экранов. + +Путь, имя root, screen metadata, element metadata и тип каждого обязательного узла должны совпасть. +Фактическая иерархия узлов внутри сцены темы свободна: приложение ищет их по metadata, а не NodePath. + +Каждая тема включает точную байтовую копию каталога по каноническому runtime-пути +`res://exchanger_theme_dlc/contracts/screen_bindings.v2.json`. Host до создания ThemeView вычисляет +SHA-256 встроенного файла и сравнивает его с закреплённым хешем поддерживаемой версии контракта. +Несовпадение означает несовместимый или изменённый пакет и приводит к безопасной fallback-теме. + +## Проверка интеграции + +1. В журнале активирован ожидаемый `ThemeId` и manifest версии 2. +2. Все девять экранов созданы из соответствующих `ScreenScenes`. +3. Кнопки навигации и оплаты реагируют на касание. +4. Динамические Label, формы, PIN-клавиатуры и настройки обновляются через биндинги. +5. Home находит готовые stock/connection/promo nodes без изменения дерева ThemeView. +6. Технические панели остаются скрытыми/управляются host-логикой так же, как во fallback-сцене. +7. В production PCK нет preview overlay, builder tooling, `source/` и references; GDScript и + runtime-ресурсы самой темы присутствуют и запускаются без ошибок. +8. При повреждённой сцене, неверном типе или отсутствующем binding-id активируется безопасный fallback. + +## Совместимость + +Manifest v1 и `VisualSlots` относятся к прежней частичной модели. `space-pixel` пока сохраняет +старые English `Advertisement*` identifiers и `VisualSlots` для миграции, но новым темам следует +использовать v2 `ScreenScenes`. В пользовательском русском интерфейсе используются «промо» и +«промо-ролик». diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md new file mode 100644 index 0000000..7d042b7 --- /dev/null +++ b/docs/WORKFLOW.md @@ -0,0 +1,103 @@ +# Жизненный цикл темы + +## 1. Создание + +В Godot Editor выберите `Редактор → Создать тему`. Укажите стабильный lowercase ID с +латинскими буквами, цифрами и дефисами и человекочитаемое название. Аддон скопирует `example`, +обновит manifest и сразу активирует новую тему. + +Для автоматизации можно скопировать `themes/example` в `themes/`. Используйте ID с +латинскими буквами, цифрами и дефисами. Измените только `ThemeId` и человекочитаемый +`DisplayName` в manifest; канонические scene keys/paths не меняйте. + +## 2. Активация + +В Godot Editor выберите `Редактор → Выбрать тему`. После подтверждения аддон остановит запущенный +preview при необходимости, запишет выбранный package в `build/active-theme.json`, откроет preview +и восстановит запуск. + +Эквивалентная PowerShell-команда: + +```powershell +.\activate-theme.ps1 -ThemeId space-pixel +``` + +Команда только проверяет manifest и пишет `build/active-theme.json`. Корневая копия темы не +создаётся: активный package остаётся единственным источником. + +## 3. Редактирование и live reload + +Источник — видимый в Godot FileSystem каталог `themes//package/`. Запущенный preview +загружает его сцены напрямую, следит за изменёнными `.tscn`, `.tres`, JSON, изображениями, +шрифтами и звуком и сохраняет выбранную вкладку при перезагрузке. + +Открывайте production-сцены прямо из `res://themes//package/scenes/`. Их ссылки относительные: +каждая тема использует собственные `assets/`, `components/` и `visuals`, даже когда рядом +индексируются остальные темы. Сцена уже содержит собственные `Theme`, статический фон и +decoration, поэтому её вид в редакторе является production-видом, а не упрощённым каркасом. +Если Godot Editor пересохранил ссылку с полным builder-префиксом, временный test/build workspace +автоматически заменит его на `res://exchanger_theme_dlc/`; исходный package при этом не меняется. + +## 4. Preview + +```powershell +.\preview-theme.ps1 -ThemeId space-pixel +``` + +Верхняя панель переключает девять экранов. `BINDINGS: ON/OFF` включает подписи metadata. Overlay +нужен для проверки контракта, а финальный визуальный QA делается с выключенными подписями. Галерея +не меняет инстанцированные сцены и не добавляет им оформление или preview-only содержимое. + +## 5. Проверка + +```powershell +.\tools\Test-PackagedBindingContract.ps1 +.\test-theme.ps1 -ThemeId space-pixel +``` + +Первая команда без Godot сверяет byte-identical копии контракта во всех темах. Вторая выбирает +тему, валидирует её в изолированном временном workspace и запускает headless smoke preview, +который читает исходный package напрямую. + +## 6. Сборка + +В Godot Editor выберите `Редактор → Экспортировать тему`, выберите любую валидную тему по ID, +затем укажите каталог и имя `.pck` в стандартном диалоге сохранения. Аддон проверит и соберёт +именно выбранную тему в фоне, не переключая preview и не заменяя установленную тему Exchanger. +Окно прогресса показывает импорт, проверку контракта, экспорт, проверку пакета и завершение. + +Эквивалентная команда с путём по умолчанию: + +```powershell +.\build-theme.ps1 -ThemeId space-pixel +``` + +Результаты: `build/space-pixel.pck` и совместимая копия `build/active_theme.pck`. Для сохранения +обязательных runtime-путей сборка кратковременно создаёт +`build/theme-workspaces/-build/exchanger_theme_dlc/`, экспортирует PCK и удаляет workspace. +`build/` скрыт от Godot через собственный `.gdignore` и игнорируется системой контроля версий. +Выбор другого пути в Editor передаётся скрипту как `-OutputPath -PreserveActiveTheme`: поэтому +редакторский экспорт не меняет `build/active-theme.json` и `build/active_theme.pck`. Прямой запуск +скрипта без `-PreserveActiveTheme` сохраняет прежнее поведение и обновляет совместимую копию. + +## 7. Установка + +Закройте Exchanger, затем в Godot Editor выберите +`Редактор → Применить тему к Exchanger`. В компактном окне проверьте ID активной темы и путь, +нажмите `Собрать и применить`. Аддон выполняет validator, export и установку в фоновом потоке; +редактор остаётся доступен, а отдельное окно показывает текущий этап, процент и результат. + +Эквивалентная команда для автоматизации: + +```powershell +.\build-theme.ps1 -ThemeId space-pixel -InstallToDefaultUserPath +``` + +Команда заменяет `%APPDATA%\Godot\app_userdata\Exchanger\theme_dlc\active_theme.pck`. После этого +нужен полный перезапуск Exchanger и интеграционный checklist из `THEME_INTEGRATION.md`. + +## 8. Изменение host-контракта + +Это отдельная миграция, а не часть обычного оформления темы. Сначала изменяется Exchanger и его +тесты, затем builder синхронизируется штатной командой. Последовательность описана в +[BINDING_CONTRACT.md](BINDING_CONTRACT.md). Никогда не правьте 481 ID вручную в обход host. diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..eac44a2 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,74 @@ +[preset.0] + +name="Theme DLC" +platform="Windows Desktop" +dedicated_server=false +custom_features="" +export_filter="resources" +export_files=PackedStringArray() +include_filter="exchanger_theme_dlc/**" +exclude_filter="" +export_path="build/active_theme.pck" +patches=PackedStringArray() +patch_delta_encoding=false +patch_delta_compression_level_zstd=19 +patch_delta_min_reduction=0.1 +patch_delta_include_filters="*" +patch_delta_exclude_filters="" +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=false +texture_format/s3tc_bptc=true +texture_format/etc2_astc=true +shader_baker/enabled=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=true +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +application/export_d3d12=0 +application/d3d12_agility_sdk_multiarch=true +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" +dotnet/include_scripts_content=false +dotnet/include_debug_symbols=true +dotnet/embed_build_outputs=false diff --git a/godot-ai-LICENSE.txt b/godot-ai-LICENSE.txt new file mode 100644 index 0000000..7806d22 --- /dev/null +++ b/godot-ai-LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Godot AI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/preview-theme.ps1 b/preview-theme.ps1 new file mode 100644 index 0000000..9b10552 --- /dev/null +++ b/preview-theme.ps1 @@ -0,0 +1,16 @@ +param( + [string]$ThemeId = "space-pixel", + [string]$ThemeSource = "", + [string]$GodotExecutable = "" +) + +$ErrorActionPreference = "Stop" +$projectRoot = (Resolve-Path $PSScriptRoot).Path +. (Join-Path $projectRoot "tools\Resolve-GodotExecutable.ps1") +$GodotExecutable = Resolve-ThemeGodotExecutable -GodotExecutable $GodotExecutable + +& (Join-Path $projectRoot "tools\Select-Theme.ps1") -ThemeId $ThemeId -ThemeSource $ThemeSource +& $GodotExecutable --path $projectRoot +if ($LASTEXITCODE -ne 0) { + throw "Preview for theme '$ThemeId' failed." +} diff --git a/preview.tscn b/preview.tscn new file mode 100644 index 0000000..53a1221 --- /dev/null +++ b/preview.tscn @@ -0,0 +1,131 @@ +[gd_scene format=3 uid="uid://d252sroyl85e6"] + +[ext_resource type="Texture2D" path="res://themes/space-pixel/package/assets/background/background.png" id="1_background"] +[ext_resource type="Theme" path="res://themes/space-pixel/package/ui_theme.tres" id="2_theme"] +[ext_resource type="PackedScene" path="res://themes/space-pixel/package/background_decoration.tscn" id="3_decoration"] +[ext_resource type="PackedScene" uid="uid://cs8me8jggvo48" path="res://preview_scenes/HomePreview.tscn" id="4_home"] +[ext_resource type="PackedScene" uid="uid://cr4uwvtqa6nlw" path="res://preview_scenes/CashPreview.tscn" id="5_cash"] +[ext_resource type="PackedScene" uid="uid://c4bbashsu0wad" path="res://preview_scenes/CardAmountPreview.tscn" id="6_sum"] +[ext_resource type="PackedScene" uid="uid://dmbn0n0i8vyij" path="res://preview_scenes/CardCustomPreview.tscn" id="7_keypad"] +[ext_resource type="PackedScene" uid="uid://dadn5uck0dn57" path="res://preview_scenes/CardTerminalPreview.tscn" id="8_card"] +[ext_resource type="PackedScene" uid="uid://cyepwpigxpvau" path="res://preview_scenes/SuccessPreview.tscn" id="9_success"] +[ext_resource type="PackedScene" uid="uid://bvynyjtfxum6i" path="res://preview_scenes/ErrorPreview.tscn" id="10_error"] +[ext_resource type="Script" uid="uid://b0fuom2r8d6vj" path="res://preview_scenes/PreviewLiveReload.gd" id="11_live_reload"] +[ext_resource type="PackedScene" path="res://preview_scenes/ServiceAccessPreview.tscn" id="12_service"] +[ext_resource type="PackedScene" path="res://preview_scenes/SettingsPreview.tscn" id="13_settings"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tabs"] + +[sub_resource type="StyleBoxFlat" id="StyleBox_tab_unselected"] +content_margin_left = 10.0 +content_margin_top = 4.0 +content_margin_right = 10.0 +content_margin_bottom = 4.0 +bg_color = Color(0.005, 0.03, 0.09, 0.9) + +[sub_resource type="StyleBoxFlat" id="StyleBox_tab_hovered"] +content_margin_left = 10.0 +content_margin_top = 4.0 +content_margin_right = 10.0 +content_margin_bottom = 4.0 +bg_color = Color(0.08, 0.28, 0.2, 0.96) + +[sub_resource type="StyleBoxFlat" id="StyleBox_tab_selected"] +content_margin_left = 10.0 +content_margin_top = 4.0 +content_margin_right = 10.0 +content_margin_bottom = 4.0 +bg_color = Color(0.45, 0.86, 0.31, 0.98) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color(0.72, 1, 0.58, 1) + +[node name="SpacePixelPreviewGallery" type="Control" unique_id=2025692250] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_theme") +script = ExtResource("11_live_reload") + +[node name="Background" type="TextureRect" parent="." unique_id=242445040] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="Decoration" parent="." unique_id=1738874259 instance=ExtResource("3_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="Screens" type="TabContainer" parent="." unique_id=2074523310] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_selected_color = Color(0.02, 0.08, 0.18, 1) +theme_override_colors/font_unselected_color = Color(0.92, 0.98, 1, 1) +theme_override_font_sizes/font_size = 16 +theme_override_styles/panel = SubResource("StyleBoxEmpty_tabs") +theme_override_styles/tab_unselected = SubResource("StyleBox_tab_unselected") +theme_override_styles/tab_hovered = SubResource("StyleBox_tab_hovered") +theme_override_styles/tab_selected = SubResource("StyleBox_tab_selected") +tab_alignment = 1 +current_tab = 0 +use_hidden_tabs_for_min_size = true + +[node name="HOME" parent="Screens" unique_id=1309203819 instance=ExtResource("4_home")] +layout_mode = 2 +metadata/_tab_index = 0 + +[node name="CASH" parent="Screens" unique_id=1335897324 instance=ExtResource("5_cash")] +visible = false +layout_mode = 2 +metadata/_tab_index = 1 + +[node name="SUM" parent="Screens" unique_id=467515431 instance=ExtResource("6_sum")] +visible = false +layout_mode = 2 +metadata/_tab_index = 2 + +[node name="KEYPAD" parent="Screens" unique_id=674122645 instance=ExtResource("7_keypad")] +visible = false +layout_mode = 2 +metadata/_tab_index = 3 + +[node name="CARD" parent="Screens" unique_id=883192782 instance=ExtResource("8_card")] +visible = false +layout_mode = 2 +metadata/_tab_index = 4 + +[node name="SUCCESS" parent="Screens" unique_id=1292278757 instance=ExtResource("9_success")] +visible = false +layout_mode = 2 +metadata/_tab_index = 5 + +[node name="ERROR" parent="Screens" unique_id=2137224203 instance=ExtResource("10_error")] +visible = false +layout_mode = 2 +metadata/_tab_index = 6 + +[node name="SERVICE" parent="Screens" unique_id=2084691589 instance=ExtResource("12_service")] +visible = false +layout_mode = 2 +metadata/_tab_index = 7 + +[node name="SETTINGS" parent="Screens" unique_id=943449370 instance=ExtResource("13_settings")] +visible = false +layout_mode = 2 +metadata/_tab_index = 8 diff --git a/preview_scenes/.gdignore b/preview_scenes/.gdignore new file mode 100644 index 0000000..dacb7b3 --- /dev/null +++ b/preview_scenes/.gdignore @@ -0,0 +1 @@ +# Archived preview layouts are not part of the active Godot project. diff --git a/preview_scenes/CardAmountPreview.tscn b/preview_scenes/CardAmountPreview.tscn new file mode 100644 index 0000000..2709696 --- /dev/null +++ b/preview_scenes/CardAmountPreview.tscn @@ -0,0 +1,177 @@ +[gd_scene format=3 uid="uid://c4bbashsu0wad"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://sntindr0yqtc" path="res://exchanger_theme_dlc/assets/ui/back_button.png" id="2_back"] + +[node name="SUM" type="Control" unique_id=21701794] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackIcon" type="TextureRect" parent="." unique_id=727102079] +texture_filter = 1 +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +texture = ExtResource("2_back") +expand_mode = 1 +stretch_mode = 5 + +[node name="BackText" type="Label" parent="." unique_id=1863709339] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="." unique_id=959122858] +layout_mode = 0 +offset_left = 92.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 + +[node name="RewardPanel" type="PanelContainer" parent="." unique_id=749756036] +layout_mode = 0 +offset_left = 34.0 +offset_top = 110.0 +offset_right = 686.0 +offset_bottom = 250.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="RewardPanel" unique_id=703241980] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="RewardPanel/Content" unique_id=1676855582] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="Value" type="Label" parent="RewardPanel/Content" unique_id=459557488] +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 27 +text = "100 ЖЕТОНОВ + 50 В ПОДАРОК" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AmountPanel" type="PanelContainer" parent="." unique_id=1806004633] +layout_mode = 0 +offset_left = 34.0 +offset_top = 274.0 +offset_right = 686.0 +offset_bottom = 828.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="AmountPanel" unique_id=205229911] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="AmountPanel/Content" unique_id=1947589315] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОПЛАТА" +vertical_alignment = 1 + +[node name="Grid" type="GridContainer" parent="AmountPanel/Content" unique_id=1392864743] +custom_minimum_size = Vector2(0, 350) +layout_mode = 2 +theme_override_constants/h_separation = 20 +theme_override_constants/v_separation = 14 +columns = 2 + +[node name="Amount10" type="Button" parent="AmountPanel/Content/Grid" unique_id=505006584] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "10 РУБ." + +[node name="Amount50" type="Button" parent="AmountPanel/Content/Grid" unique_id=606799949] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "50 РУБ." + +[node name="Amount100" type="Button" parent="AmountPanel/Content/Grid" unique_id=987842818] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "100 РУБ." + +[node name="Amount150" type="Button" parent="AmountPanel/Content/Grid" unique_id=218471006] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "150 РУБ." + +[node name="Amount200" type="Button" parent="AmountPanel/Content/Grid" unique_id=273401422] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "200 РУБ." + +[node name="Amount300" type="Button" parent="AmountPanel/Content/Grid" unique_id=605529934] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "300 РУБ." + +[node name="Amount400" type="Button" parent="AmountPanel/Content/Grid" unique_id=2050233395] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "400 РУБ." + +[node name="Amount500" type="Button" parent="AmountPanel/Content/Grid" unique_id=1413881908] +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "500 РУБ." + +[node name="Other" type="Button" parent="AmountPanel/Content" unique_id=558538431] +custom_minimum_size = Vector2(340, 68) +layout_mode = 2 +size_flags_horizontal = 4 +theme_type_variation = &"CompactButton" +text = "ДРУГАЯ СУММА" + +[node name="Confirm" type="Button" parent="." unique_id=229954390] +layout_mode = 0 +offset_left = 34.0 +offset_top = 858.0 +offset_right = 686.0 +offset_bottom = 952.0 +theme_type_variation = &"PrimaryButton" +text = "ПОДТВЕРДИТЬ" + +[node name="Hint" type="Label" parent="." unique_id=1898482115] +layout_mode = 0 +offset_left = 60.0 +offset_top = 974.0 +offset_right = 660.0 +offset_bottom = 1038.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 18 +text = "ВЫБЕРИТЕ СУММУ ДЛЯ ПЕРЕХОДА К ТЕРМИНАЛУ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Footer" parent="." unique_id=756615138 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/CardCustomPreview.tscn b/preview_scenes/CardCustomPreview.tscn new file mode 100644 index 0000000..5408d2d --- /dev/null +++ b/preview_scenes/CardCustomPreview.tscn @@ -0,0 +1,182 @@ +[gd_scene format=3 uid="uid://dmbn0n0i8vyij"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://sntindr0yqtc" path="res://exchanger_theme_dlc/assets/ui/back_button.png" id="2_back"] + +[node name="KEYPAD" type="Control" unique_id=1473255093] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackIcon" type="TextureRect" parent="." unique_id=2063912065] +texture_filter = 1 +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +texture = ExtResource("2_back") +expand_mode = 1 +stretch_mode = 5 + +[node name="BackText" type="Label" parent="." unique_id=973004298] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="." unique_id=650414558] +layout_mode = 0 +offset_left = 92.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ДРУГАЯ СУММА" +horizontal_alignment = 1 + +[node name="AmountPanel" type="PanelContainer" parent="." unique_id=833520481] +layout_mode = 0 +offset_left = 70.0 +offset_top = 112.0 +offset_right = 650.0 +offset_bottom = 288.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="AmountPanel" unique_id=1256168150] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="AmountPanel/Content" unique_id=2076137117] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "СУММА ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="AmountPanel/Content" unique_id=794675741] +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 36 +text = "1000 ₽ • 100 ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="KeypadPanel" type="PanelContainer" parent="." unique_id=223784690] +layout_mode = 0 +offset_left = 104.0 +offset_top = 320.0 +offset_right = 616.0 +offset_bottom = 872.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="KeypadPanel" unique_id=1346008923] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="KeypadPanel/Content" unique_id=979359435] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВВЕДИТЕ СУММУ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Grid" type="GridContainer" parent="KeypadPanel/Content" unique_id=19340587] +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="Key1" type="Button" parent="KeypadPanel/Content/Grid" unique_id=292513137] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "1" + +[node name="Key2" type="Button" parent="KeypadPanel/Content/Grid" unique_id=2059796320] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "2" + +[node name="Key3" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1606281080] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "3" + +[node name="Key4" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1575091527] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "4" + +[node name="Key5" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1264618676] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "5" + +[node name="Key6" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1221752006] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "6" + +[node name="Key7" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1146303995] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "7" + +[node name="Key8" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1022590765] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "8" + +[node name="Key9" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1628652970] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "9" + +[node name="Clear" type="Button" parent="KeypadPanel/Content/Grid" unique_id=1400291329] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_font_sizes/font_size = 17 +text = "СБРОС" + +[node name="Key0" type="Button" parent="KeypadPanel/Content/Grid" unique_id=2048436846] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0" + +[node name="Backspace" type="Button" parent="KeypadPanel/Content/Grid" unique_id=980931690] +custom_minimum_size = Vector2(145, 82) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "⌫" + +[node name="Confirm" type="Button" parent="." unique_id=892179263] +layout_mode = 0 +offset_left = 70.0 +offset_top = 902.0 +offset_right = 650.0 +offset_bottom = 996.0 +theme_type_variation = &"PrimaryButton" +text = "ПОДТВЕРДИТЬ" + +[node name="Footer" parent="." unique_id=191299046 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/CardTerminalPreview.tscn b/preview_scenes/CardTerminalPreview.tscn new file mode 100644 index 0000000..5a848ff --- /dev/null +++ b/preview_scenes/CardTerminalPreview.tscn @@ -0,0 +1,127 @@ +[gd_scene format=3 uid="uid://dadn5uck0dn57"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://sntindr0yqtc" path="res://exchanger_theme_dlc/assets/ui/back_button.png" id="2_back"] +[ext_resource type="Texture2D" uid="uid://b3usa242mfern" path="res://exchanger_theme_dlc/assets/animations/card/frame_01.png" id="3_card_1"] +[ext_resource type="Texture2D" uid="uid://de6pb3jrexihf" path="res://exchanger_theme_dlc/assets/animations/card/frame_02.png" id="4_card_2"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_card"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_card_1") +}, { +"duration": 1.0, +"texture": ExtResource("4_card_2") +}], +"loop": 1, +"name": &"default", +"speed": 2.0 +}] + +[node name="CARD" type="Control" unique_id=2023585296] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackIcon" type="TextureRect" parent="." unique_id=838274810] +texture_filter = 1 +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +texture = ExtResource("2_back") +expand_mode = 1 +stretch_mode = 5 + +[node name="BackText" type="Label" parent="." unique_id=1051493463] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="." unique_id=861663064] +layout_mode = 0 +offset_left = 92.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 + +[node name="PaymentPanel" type="PanelContainer" parent="." unique_id=648967317] +layout_mode = 0 +offset_left = 112.0 +offset_top = 204.0 +offset_right = 608.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="PaymentPanel" unique_id=2112945038] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="PaymentPanel/Content" unique_id=1931358880] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОПЛАТА" +vertical_alignment = 1 + +[node name="Body" type="Control" parent="PaymentPanel/Content" unique_id=1680174075] +custom_minimum_size = Vector2(0, 520) +layout_mode = 2 + +[node name="CardAnimation" type="AnimatedSprite2D" parent="PaymentPanel/Content/Body" unique_id=1670614075] +texture_filter = 1 +position = Vector2(226, 224) +scale = Vector2(0.72, 0.72) +sprite_frames = SubResource("SpriteFrames_card") +autoplay = "default" + +[node name="Instruction" type="Label" parent="PaymentPanel/Content/Body" unique_id=805003299] +layout_mode = 0 +offset_left = 26.0 +offset_top = 404.0 +offset_right = 426.0 +offset_bottom = 494.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 21 +text = "ПРИЛОЖИТЕ КАРТУ +К ТЕРМИНАЛУ ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="." unique_id=1532983865] +layout_mode = 0 +offset_left = 110.0 +offset_top = 856.0 +offset_right = 610.0 +offset_bottom = 924.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 24 +text = "К ОПЛАТЕ: 1000 ₽ • 100 ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Cancel" type="Button" parent="." unique_id=1065301015] +layout_mode = 0 +offset_left = 210.0 +offset_top = 946.0 +offset_right = 510.0 +offset_bottom = 1018.0 +theme_type_variation = &"CompactButton" +text = "ОТМЕНА" + +[node name="Footer" parent="." unique_id=1866459506 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/CashPreview.tscn b/preview_scenes/CashPreview.tscn new file mode 100644 index 0000000..8149124 --- /dev/null +++ b/preview_scenes/CashPreview.tscn @@ -0,0 +1,222 @@ +[gd_scene format=3 uid="uid://cr4uwvtqa6nlw"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://sntindr0yqtc" path="res://exchanger_theme_dlc/assets/ui/back_button.png" id="2_back"] +[ext_resource type="Texture2D" uid="uid://co8f6snofsikl" path="res://exchanger_theme_dlc/assets/animations/bill/frame_01.png" id="3_bill_1"] +[ext_resource type="Texture2D" uid="uid://dfobk36rg1j0q" path="res://exchanger_theme_dlc/assets/animations/bill/frame_02.png" id="4_bill_2"] +[ext_resource type="Texture2D" uid="uid://bcpdaecm5egr8" path="res://exchanger_theme_dlc/assets/animations/bill/frame_03.png" id="5_bill_3"] +[ext_resource type="Texture2D" uid="uid://cl2qmi0ieqhd" path="res://exchanger_theme_dlc/assets/animations/bill/frame_04.png" id="6_bill_4"] +[ext_resource type="Texture2D" uid="uid://sv5r7i74bs5" path="res://exchanger_theme_dlc/assets/animations/coin/frame_01.png" id="7_coin_1"] +[ext_resource type="Texture2D" uid="uid://d2iaks2d6flqb" path="res://exchanger_theme_dlc/assets/animations/coin/frame_02.png" id="8_coin_2"] +[ext_resource type="Texture2D" uid="uid://ddo0fm0ophvci" path="res://exchanger_theme_dlc/assets/animations/coin/frame_03.png" id="9_coin_3"] +[ext_resource type="Texture2D" uid="uid://wxf81owt4q13" path="res://exchanger_theme_dlc/assets/decorations/alien3.png" id="10_alien"] +[ext_resource type="Texture2D" uid="uid://bdyjsoj5lwxu0" path="res://exchanger_theme_dlc/assets/ui/bubble_text.png" id="11_bubble"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_bill"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_bill_1") +}, { +"duration": 1.0, +"texture": ExtResource("4_bill_2") +}, { +"duration": 1.0, +"texture": ExtResource("5_bill_3") +}, { +"duration": 1.0, +"texture": ExtResource("6_bill_4") +}], +"loop": 1, +"name": &"default", +"speed": 4.0 +}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_coin"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("7_coin_1") +}, { +"duration": 1.0, +"texture": ExtResource("8_coin_2") +}, { +"duration": 1.0, +"texture": ExtResource("9_coin_3") +}], +"loop": 1, +"name": &"default", +"speed": 3.0 +}] + +[node name="CASH" type="Control" unique_id=617693511] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackIcon" type="TextureRect" parent="." unique_id=46384435] +texture_filter = 1 +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +texture = ExtResource("2_back") +expand_mode = 1 +stretch_mode = 5 + +[node name="BackText" type="Label" parent="." unique_id=2102036995] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="." unique_id=382438172] +layout_mode = 0 +offset_left = 92.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НАЛИЧНЫМИ" +horizontal_alignment = 1 + +[node name="BalancePanel" type="PanelContainer" parent="." unique_id=744516633] +layout_mode = 0 +offset_left = 34.0 +offset_top = 108.0 +offset_right = 686.0 +offset_bottom = 244.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="BalancePanel" unique_id=677837882] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="BalancePanel/Content" unique_id=1604443831] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ТЕКУЩИЙ БАЛАНС" +vertical_alignment = 1 + +[node name="Value" type="Label" parent="BalancePanel/Content" unique_id=530140376] +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 30 +text = "100 РУБЛЕЙ • 10 ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="InstructionPanel" type="PanelContainer" parent="." unique_id=1702548195] +layout_mode = 0 +offset_left = 34.0 +offset_top = 264.0 +offset_right = 686.0 +offset_bottom = 750.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="InstructionPanel" unique_id=1466233221] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="InstructionPanel/Content" unique_id=249944596] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "КАК ВНЕСТИ" +vertical_alignment = 1 + +[node name="Body" type="Control" parent="InstructionPanel/Content" unique_id=1172503487] +custom_minimum_size = Vector2(0, 380) +layout_mode = 2 + +[node name="Bill" type="AnimatedSprite2D" parent="InstructionPanel/Content/Body" unique_id=1473978289] +texture_filter = 1 +position = Vector2(108, 106) +scale = Vector2(0.52, 0.52) +sprite_frames = SubResource("SpriteFrames_bill") +autoplay = "default" + +[node name="BillText" type="Label" parent="InstructionPanel/Content/Body" unique_id=1142826781] +layout_mode = 0 +offset_left = 206.0 +offset_top = 58.0 +offset_right = 566.0 +offset_bottom = 154.0 +theme_type_variation = &"PanelText" +text = "ВСТАВЬТЕ КУПЮРЫ +В КУПЮРОПРИЁМНИК" +vertical_alignment = 1 + +[node name="Coin" type="AnimatedSprite2D" parent="InstructionPanel/Content/Body" unique_id=839503345] +texture_filter = 1 +position = Vector2(108, 274) +scale = Vector2(0.52, 0.52) +sprite_frames = SubResource("SpriteFrames_coin") +autoplay = "default" + +[node name="CoinText" type="Label" parent="InstructionPanel/Content/Body" unique_id=1769314122] +layout_mode = 0 +offset_left = 206.0 +offset_top = 224.0 +offset_right = 566.0 +offset_bottom = 326.0 +theme_type_variation = &"PanelText" +text = "ЛИБО МОНЕТЫ +В МОНЕТОПРИЕМНИК" +vertical_alignment = 1 + +[node name="Action" type="Button" parent="." unique_id=1957243040] +layout_mode = 0 +offset_left = 34.0 +offset_top = 774.0 +offset_right = 686.0 +offset_bottom = 866.0 +theme_type_variation = &"PrimaryButton" +text = "ВЫДАТЬ" + +[node name="Alien" type="TextureRect" parent="." unique_id=775495492] +texture_filter = 1 +layout_mode = 0 +offset_left = 34.0 +offset_top = 892.0 +offset_right = 174.0 +offset_bottom = 1032.0 +texture = ExtResource("10_alien") +expand_mode = 1 +stretch_mode = 5 + +[node name="Bubble" type="TextureRect" parent="." unique_id=2111671620] +texture_filter = 1 +layout_mode = 0 +offset_left = 164.0 +offset_top = 914.0 +offset_right = 676.0 +offset_bottom = 1042.0 +texture = ExtResource("11_bubble") +expand_mode = 1 +stretch_mode = 5 + +[node name="BubbleText" type="Label" parent="." unique_id=1764793564] +layout_mode = 0 +offset_left = 270.0 +offset_top = 938.0 +offset_right = 570.0 +offset_bottom = 1018.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 14 +text = "АВТОМАТ НЕ ВЫДАЁТ СДАЧУ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Footer" parent="." unique_id=1630848867 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/ErrorPreview.tscn b/preview_scenes/ErrorPreview.tscn new file mode 100644 index 0000000..c4debc3 --- /dev/null +++ b/preview_scenes/ErrorPreview.tscn @@ -0,0 +1,98 @@ +[gd_scene format=3 uid="uid://bvynyjtfxum6i"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://dwvk6pkpvh63t" path="res://exchanger_theme_dlc/assets/animations/payment_failed/frame_01.png" id="2_failed_1"] +[ext_resource type="Texture2D" uid="uid://bmv4rutkbnudh" path="res://exchanger_theme_dlc/assets/animations/payment_failed/frame_02.png" id="3_failed_2"] +[ext_resource type="Texture2D" uid="uid://b5v7kqjrfhqjw" path="res://exchanger_theme_dlc/assets/animations/payment_failed/frame_03.png" id="4_failed_3"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_failed"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_failed_1") +}, { +"duration": 1.0, +"texture": ExtResource("3_failed_2") +}, { +"duration": 1.0, +"texture": ExtResource("4_failed_3") +}], +"loop": 1, +"name": &"default", +"speed": 3.0 +}] + +[node name="ERROR" type="Control" unique_id=111555268] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Title" type="Label" parent="." unique_id=152037192] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НЕ ПРОШЛА" +horizontal_alignment = 1 + +[node name="ErrorPanel" type="PanelContainer" parent="." unique_id=2060585109] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="ErrorPanel" unique_id=35202737] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="ErrorPanel/Content" unique_id=910778326] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОШИБКА ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="ErrorPanel/Content" unique_id=159572421] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 + +[node name="Animation" type="AnimatedSprite2D" parent="ErrorPanel/Content/Body" unique_id=13659618] +texture_filter = 1 +position = Vector2(242, 220) +scale = Vector2(0.72, 0.72) +sprite_frames = SubResource("SpriteFrames_failed") +autoplay = "default" + +[node name="Message" type="Label" parent="ErrorPanel/Content/Body" unique_id=685857508] +layout_mode = 0 +offset_left = 30.0 +offset_top = 410.0 +offset_right = 454.0 +offset_bottom = 506.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 22 +text = "ПОПРОБУЙТЕ ЕЩЁ РАЗ +ИЛИ ВЫБЕРИТЕ ДРУГОЙ СПОСОБ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Home" type="Button" parent="." unique_id=1613589566] +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="." unique_id=214379731 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/HomePreview.tscn b/preview_scenes/HomePreview.tscn new file mode 100644 index 0000000..95f20ff --- /dev/null +++ b/preview_scenes/HomePreview.tscn @@ -0,0 +1,191 @@ +[gd_scene format=3 uid="uid://cs8me8jggvo48"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://btsthd6xtskwu" path="res://exchanger_theme_dlc/assets/decorations/alien1.png" id="2_alien_left"] +[ext_resource type="Texture2D" uid="uid://niifdcrv3ap" path="res://exchanger_theme_dlc/assets/decorations/alien2.png" id="3_alien_right"] +[ext_resource type="Texture2D" uid="uid://bdyjsoj5lwxu0" path="res://exchanger_theme_dlc/assets/ui/bubble_text.png" id="4_bubble"] +[ext_resource type="Texture2D" uid="uid://c0kbwcs8mic3f" path="res://exchanger_theme_dlc/assets/ui/billboard_ads.png" id="5_billboard"] + +[node name="HOME" type="Control" unique_id=388200253] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="AlienLeft" type="TextureRect" parent="." unique_id=415598416] +texture_filter = 1 +layout_mode = 0 +offset_left = 18.0 +offset_top = 22.0 +offset_right = 172.0 +offset_bottom = 176.0 +mouse_filter = 2 +texture = ExtResource("2_alien_left") +expand_mode = 1 +stretch_mode = 5 + +[node name="PricePanel" type="PanelContainer" parent="." unique_id=952610858] +layout_mode = 0 +offset_left = 148.0 +offset_top = 24.0 +offset_right = 398.0 +offset_bottom = 184.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="PricePanel" unique_id=1295849823] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="PricePanel/Content" unique_id=123962868] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ЦЕНА ЖЕТОНА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Price" type="Label" parent="PricePanel/Content" unique_id=245845008] +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 32 +text = "10 РУБ." +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AlienRight" type="TextureRect" parent="." unique_id=552282646] +texture_filter = 1 +layout_mode = 0 +offset_left = 532.0 +offset_top = 26.0 +offset_right = 696.0 +offset_bottom = 190.0 +mouse_filter = 2 +texture = ExtResource("3_alien_right") +expand_mode = 1 +stretch_mode = 5 + +[node name="Speech" type="TextureRect" parent="." unique_id=1409022347] +texture_filter = 1 +layout_mode = 0 +offset_left = 394.0 +offset_top = 30.0 +offset_right = 574.0 +offset_bottom = 122.0 +mouse_filter = 2 +texture = ExtResource("4_bubble") +expand_mode = 1 +stretch_mode = 5 + +[node name="SpeechText" type="Label" parent="." unique_id=545656950] +layout_mode = 0 +offset_left = 412.0 +offset_top = 48.0 +offset_right = 548.0 +offset_bottom = 102.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 12 +text = "ПОЛУЧИ +СВОИ ЖЕТОНЫ!" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="StockPanel" type="PanelContainer" parent="." unique_id=1108839080] +layout_mode = 0 +offset_left = 30.0 +offset_top = 206.0 +offset_right = 690.0 +offset_bottom = 340.0 +theme_type_variation = &"StatusPanel" + +[node name="Content" type="VBoxContainer" parent="StockPanel" unique_id=676038112] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="StockPanel/Content" unique_id=2120524316] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ДОСТУПНО К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="State" type="Label" parent="StockPanel/Content" unique_id=419001717] +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 29 +text = "МНОГО ЖЕТОНОВ :)" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PaymentPanel" type="PanelContainer" parent="." unique_id=2009320934] +layout_mode = 0 +offset_left = 30.0 +offset_top = 360.0 +offset_right = 690.0 +offset_bottom = 548.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="PaymentPanel" unique_id=773738540] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="PaymentPanel/Content" unique_id=706439829] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВЫБЕРИТЕ СПОСОБ ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Buttons" type="HBoxContainer" parent="PaymentPanel/Content" unique_id=1766802133] +layout_mode = 2 +theme_override_constants/separation = 20 +alignment = 1 + +[node name="Cash" type="Button" parent="PaymentPanel/Content/Buttons" unique_id=1036074934] +custom_minimum_size = Vector2(280, 70) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "НАЛИЧНЫЕ" + +[node name="Card" type="Button" parent="PaymentPanel/Content/Buttons" unique_id=1970038171] +custom_minimum_size = Vector2(280, 70) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "БЕЗНАЛИЧНЫЕ" + +[node name="AdvertisementFrame" type="PanelContainer" parent="."] +layout_mode = 0 +offset_left = 62.0 +offset_top = 590.0 +offset_right = 658.0 +offset_bottom = 938.0 +mouse_filter = 2 +theme_type_variation = &"AdvertisementPanel" + +[node name="Billboard" type="TextureRect" parent="." unique_id=943947521] +texture_filter = 1 +layout_mode = 0 +offset_left = 72.0 +offset_top = 602.0 +offset_right = 648.0 +offset_bottom = 926.0 +mouse_filter = 2 +texture = ExtResource("5_billboard") +expand_mode = 1 +stretch_mode = 5 + +[node name="AdLabel" type="Label" parent="." unique_id=353224380] +layout_mode = 0 +offset_left = 174.0 +offset_top = 730.0 +offset_right = 546.0 +offset_bottom = 792.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 20 +text = "ПРОМО-БЛОК" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Footer" parent="." unique_id=279899163 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/PreviewFooter.tscn b/preview_scenes/PreviewFooter.tscn new file mode 100644 index 0000000..e97cfdc --- /dev/null +++ b/preview_scenes/PreviewFooter.tscn @@ -0,0 +1,45 @@ +[gd_scene format=3] + +[node name="PreviewFooter" type="Control"] +layout_mode = 3 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -82.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 2 + +[node name="Background" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_type_variation = &"FooterPanel" + +[node name="Brand" type="Label" parent="."] +layout_mode = 0 +offset_left = 28.0 +offset_top = 8.0 +offset_right = 296.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 20 +text = "РАЗМЕН\nЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Support" type="Label" parent="."] +layout_mode = 0 +offset_left = 310.0 +offset_top = 8.0 +offset_right = 692.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 18 +text = "ТЕХПОДДЕРЖКА:\nТелефон поддержки уточняется" +horizontal_alignment = 2 +vertical_alignment = 1 diff --git a/preview_scenes/PreviewLiveReload.gd b/preview_scenes/PreviewLiveReload.gd new file mode 100644 index 0000000..5b48ee9 --- /dev/null +++ b/preview_scenes/PreviewLiveReload.gd @@ -0,0 +1,157 @@ +extends Control + +const POLL_INTERVAL_SECONDS := 0.25 +const RELOAD_DEBOUNCE_SECONDS := 0.45 +const SELECTED_TAB_META := &"theme_preview_selected_tab" +const SELECTED_SETTINGS_TAB_META := &"theme_preview_selected_settings_tab" +const WATCHED_DIRECTORIES := [ + "res://exchanger_theme_dlc", + "res://preview_scenes", +] +const WATCHED_FILES := [ + "res://preview.tscn", +] +const WATCHED_EXTENSIONS := { + "jpeg": true, + "jpg": true, + "json": true, + "gd": true, + "mp3": true, + "ogg": true, + "otf": true, + "png": true, + "svg": true, + "tres": true, + "tscn": true, + "ttf": true, + "wav": true, + "webp": true, +} +const HASHED_EXTENSIONS := { + "json": true, + "tres": true, + "tscn": true, +} + +var _poll_elapsed := 0.0 +var _reload_countdown := -1.0 +var _snapshot: Dictionary = {} +var _pending_changes: Dictionary = {} + + +func _ready() -> void: + _restore_selected_tab() + _snapshot = _capture_snapshot() + print("[Theme Preview] Live reload is active.") + + +func _process(delta: float) -> void: + if _reload_countdown >= 0.0: + _reload_countdown -= delta + if _reload_countdown <= 0.0: + _reload_preview() + return + + _poll_elapsed += delta + if _poll_elapsed < POLL_INTERVAL_SECONDS: + return + + _poll_elapsed = 0.0 + var next_snapshot := _capture_snapshot() + var changed_paths := _find_changed_paths(_snapshot, next_snapshot) + _snapshot = next_snapshot + if changed_paths.is_empty(): + return + + for path in changed_paths: + _pending_changes[path] = true + _reload_countdown = RELOAD_DEBOUNCE_SECONDS + + +func _restore_selected_tab() -> void: + var screens := get_node_or_null("Screens") as TabContainer + if screens == null or screens.get_tab_count() == 0: + return + + var selected_tab := int(get_tree().root.get_meta(SELECTED_TAB_META, screens.current_tab)) + screens.current_tab = clampi(selected_tab, 0, screens.get_tab_count() - 1) + + var settings_tabs := get_node_or_null("Screens/SETTINGS/Sections") as TabContainer + if settings_tabs != null and settings_tabs.get_tab_count() > 0: + var selected_settings_tab := int( + get_tree().root.get_meta(SELECTED_SETTINGS_TAB_META, settings_tabs.current_tab) + ) + settings_tabs.current_tab = clampi( + selected_settings_tab, + 0, + settings_tabs.get_tab_count() - 1 + ) + + +func _capture_snapshot() -> Dictionary: + var result: Dictionary = {} + for directory_path in WATCHED_DIRECTORIES: + _scan_directory(directory_path, result) + for file_path in WATCHED_FILES: + if FileAccess.file_exists(file_path): + result[file_path] = _file_fingerprint(file_path) + return result + + +func _scan_directory(directory_path: String, result: Dictionary) -> void: + if not DirAccess.dir_exists_absolute(directory_path): + return + + for file_name in DirAccess.get_files_at(directory_path): + var file_path := directory_path.path_join(file_name) + var extension := file_name.get_extension().to_lower() + if WATCHED_EXTENSIONS.has(extension): + result[file_path] = _file_fingerprint(file_path) + + for child_directory in DirAccess.get_directories_at(directory_path): + _scan_directory(directory_path.path_join(child_directory), result) + + +func _file_fingerprint(file_path: String) -> String: + var modified_time := FileAccess.get_modified_time(file_path) + var file := FileAccess.open(file_path, FileAccess.READ) + var file_size := file.get_length() if file != null else -1 + var extension := file_path.get_extension().to_lower() + if HASHED_EXTENSIONS.has(extension): + return "%s:%s:%s" % [modified_time, file_size, FileAccess.get_md5(file_path)] + return "%s:%s" % [modified_time, file_size] + + +func _find_changed_paths(previous: Dictionary, current: Dictionary) -> PackedStringArray: + var changed := PackedStringArray() + for path in current: + if not previous.has(path) or previous[path] != current[path]: + changed.append(path) + for path in previous: + if not current.has(path): + changed.append(path) + return changed + + +func _reload_preview() -> void: + var screens := get_node_or_null("Screens") as TabContainer + if screens != null: + get_tree().root.set_meta(SELECTED_TAB_META, screens.current_tab) + + var settings_tabs := get_node_or_null("Screens/SETTINGS/Sections") as TabContainer + if settings_tabs != null: + get_tree().root.set_meta(SELECTED_SETTINGS_TAB_META, settings_tabs.current_tab) + + var changed_paths := PackedStringArray(_pending_changes.keys()) + changed_paths.sort() + _pending_changes.clear() + _reload_countdown = -1.0 + + for path in changed_paths: + if ResourceLoader.exists(path): + ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_REPLACE_DEEP) + + print("[Theme Preview] Reloading after changes: %s" % ", ".join(changed_paths)) + var reload_error := get_tree().reload_current_scene() + if reload_error != OK: + push_error("[Theme Preview] Scene reload failed with error %s." % reload_error) diff --git a/preview_scenes/ServiceAccessPreview.tscn b/preview_scenes/ServiceAccessPreview.tscn new file mode 100644 index 0000000..efb6168 --- /dev/null +++ b/preview_scenes/ServiceAccessPreview.tscn @@ -0,0 +1,172 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] + +[node name="SERVICE" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Title" type="Label" parent="."] +layout_mode = 0 +offset_left = 40.0 +offset_top = 18.0 +offset_right = 680.0 +offset_bottom = 72.0 +theme_type_variation = &"ScreenTitle" +theme_override_font_sizes/font_size = 34 +text = "ВХОД В НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Description" type="Label" parent="."] +layout_mode = 0 +offset_left = 52.0 +offset_top = 78.0 +offset_right = 668.0 +offset_bottom = 140.0 +theme_type_variation = &"ScreenDescription" +theme_override_font_sizes/font_size = 16 +text = "ВВЕДИТЕ PIN-КОД, ЧТОБЫ ОТКРЫТЬ НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="AccessPanel" type="PanelContainer" parent="."] +layout_mode = 0 +offset_left = 60.0 +offset_top = 152.0 +offset_right = 660.0 +offset_bottom = 916.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="AccessPanel"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="AccessPanel/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "PIN-КОД" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PinDisplay" type="Label" parent="AccessPanel/Content"] +custom_minimum_size = Vector2(0, 62) +layout_mode = 2 +theme_type_variation = &"StatusText" +theme_override_font_sizes/font_size = 34 +text = "—" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Status" type="Label" parent="AccessPanel/Content"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 17 +text = "ПОСЛЕ ПЯТИ ОШИБОК ВХОД БЛОКИРУЕТСЯ НА 30 СЕКУНД" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Keypad" type="GridContainer" parent="AccessPanel/Content"] +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="Digit1" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "1" + +[node name="Digit2" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "2" + +[node name="Digit3" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "3" + +[node name="Digit4" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "4" + +[node name="Digit5" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "5" + +[node name="Digit6" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "6" + +[node name="Digit7" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "7" + +[node name="Digit8" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "8" + +[node name="Digit9" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "9" + +[node name="Clear" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_font_sizes/font_size = 16 +text = "СБРОС" + +[node name="Digit0" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0" + +[node name="Erase" type="Button" parent="AccessPanel/Content/Keypad"] +custom_minimum_size = Vector2(170, 76) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "⌫" + +[node name="Enter" type="Button" parent="AccessPanel/Content"] +custom_minimum_size = Vector2(0, 90) +layout_mode = 2 +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 32 +text = "ВОЙТИ" + +[node name="Cancel" type="Button" parent="."] +layout_mode = 0 +offset_left = 110.0 +offset_top = 940.0 +offset_right = 610.0 +offset_bottom = 1026.0 +theme_type_variation = &"SecondaryButton" +text = "ОТМЕНА" + +[node name="Footer" parent="." instance=ExtResource("1_footer")] diff --git a/preview_scenes/SettingsPreview.gd b/preview_scenes/SettingsPreview.gd new file mode 100644 index 0000000..f560e53 --- /dev/null +++ b/preview_scenes/SettingsPreview.gd @@ -0,0 +1,317 @@ +extends Control + +const PANEL_TITLE_SIZE := 46.0 +const FIELD_HEIGHT := 62.0 +const ACTION_HEIGHT := 66.0 + +@onready var _page: VBoxContainer = $PageScroll/PageMargin/Page +@onready var _buttons: Array[Button] = [ + $SectionTabs/General, + $SectionTabs/Audio, + $SectionTabs/Advertisement, + $SectionTabs/Pricing, + $SectionTabs/Payment, +] + + +func _ready() -> void: + for index in _buttons.size(): + _buttons[index].pressed.connect(_show_section.bind(index)) + _show_section(0) + + +func _show_section(index: int) -> void: + for child in _page.get_children(): + child.free() + for button_index in _buttons.size(): + _buttons[button_index].button_pressed = button_index == index + match index: + 0: _build_general(_page) + 1: _build_audio(_page) + 2: _build_advertisement(_page) + 3: _build_pricing(_page) + 4: _build_payment(_page) + + +func _add_panel(page: VBoxContainer, title: String, minimum_height: float = 0.0) -> VBoxContainer: + var panel := PanelContainer.new() + panel.theme_type_variation = &"WhitePanel" + panel.custom_minimum_size = Vector2(0, minimum_height) + page.add_child(panel) + + var margin := MarginContainer.new() + margin.add_theme_constant_override("margin_left", 25) + margin.add_theme_constant_override("margin_top", 23) + margin.add_theme_constant_override("margin_right", 25) + margin.add_theme_constant_override("margin_bottom", 23) + panel.add_child(margin) + + var content := VBoxContainer.new() + content.add_theme_constant_override("separation", 9) + margin.add_child(content) + + var header := Label.new() + header.custom_minimum_size = Vector2(0, PANEL_TITLE_SIZE) + header.theme_type_variation = &"PanelTitle" + header.add_theme_font_size_override("font_size", 23) + header.text = title + header.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + content.add_child(header) + + var body := VBoxContainer.new() + body.add_theme_constant_override("separation", 9) + content.add_child(body) + return body + + +func _panel_label(text: String, font_size: int = 18, centered: bool = false) -> Label: + var label := Label.new() + label.theme_type_variation = &"PanelText" + label.text = text + if text.length() > 42 or text.contains("\n"): + label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + label.add_theme_font_size_override("font_size", font_size) + if centered: + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + return label + + +func _semantic_label(text: String, variation: StringName, centered: bool = false) -> Label: + var label := Label.new() + label.theme_type_variation = variation + label.text = text + if text.length() > 42 or text.contains("\n"): + label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + if centered: + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + return label + + +func _line_edit(placeholder: String, value: String = "") -> LineEdit: + var field := LineEdit.new() + field.custom_minimum_size = Vector2(0, FIELD_HEIGHT) + field.placeholder_text = placeholder + field.text = value + return field + + +func _check(text: String, pressed: bool = false, disabled: bool = false) -> CheckButton: + var field := CheckButton.new() + field.custom_minimum_size = Vector2(0, ACTION_HEIGHT) + field.text = text + field.button_pressed = pressed + field.disabled = disabled + return field + + +func _action(text: String) -> Button: + var button := Button.new() + button.custom_minimum_size = Vector2(0, ACTION_HEIGHT) + button.theme_type_variation = &"CompactButton" + button.text = text + return button + + +func _semantic_action(text: String, variation: StringName) -> Button: + var button := Button.new() + button.custom_minimum_size = Vector2(0, ACTION_HEIGHT) + button.theme_type_variation = variation + button.text = text + return button + + +func _spin(minimum: float, maximum: float, value: float, suffix: String = "") -> SpinBox: + var field := SpinBox.new() + field.custom_minimum_size = Vector2(190, FIELD_HEIGHT) + field.min_value = minimum + field.max_value = maximum + field.value = value + field.suffix = suffix + return field + + +func _option(items: PackedStringArray, selected: int = 0) -> OptionButton: + var field := OptionButton.new() + field.custom_minimum_size = Vector2(0, FIELD_HEIGHT) + for item in items: + field.add_item(item) + field.select(clampi(selected, 0, maxi(0, field.item_count - 1))) + return field + + +func _row() -> HBoxContainer: + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 14) + return row + + +func _expand(control: Control) -> Control: + control.size_flags_horizontal = Control.SIZE_EXPAND_FILL + return control + + +func _build_general(page: VBoxContainer) -> void: + var identity := _add_panel(page, "ТЕКСТ НА ГЛАВНОМ ЭКРАНЕ", 593) + identity.add_child(_semantic_label("НАЗВАНИЕ • ДО 48 ЗНАКОВ", &"FieldLabel")) + identity.add_child(_line_edit("РАЗМЕН ЖЕТОНОВ", "РАЗМЕН ЖЕТОНОВ")) + identity.add_child(_semantic_label("КОРОТКОЕ ОПИСАНИЕ • ДО 80 ЗНАКОВ", &"FieldLabel")) + identity.add_child(_line_edit("Автомат выдачи жетонов", "Автомат выдачи жетонов")) + identity.add_child(_semantic_label("ТЕЛЕФОН ПОДДЕРЖКИ • ДО 80 ЗНАКОВ", &"FieldLabel")) + identity.add_child(_line_edit("Телефон поддержки уточняется", "Телефон поддержки уточняется")) + + var preview := _add_panel(page, "КАК ЭТО УВИДИТ ПОКУПАТЕЛЬ", 273) + preview.add_child(_panel_label("РАЗМЕН ЖЕТОНОВ", 28, true)) + preview.add_child(_panel_label("Автомат выдачи жетонов", 20, true)) + preview.add_child(_panel_label("ТЕХПОДДЕРЖКА • Телефон поддержки уточняется", 17, true)) + + +func _build_audio(page: VBoxContainer) -> void: + var master := _add_panel(page, "ОБЩАЯ ГРОМКОСТЬ", 330) + master.add_child(_panel_label("ВЛИЯЕТ НА ВСЕ ЗВУКИ ПРИЛОЖЕНИЯ")) + var master_row := _row() + var master_slider := HSlider.new() + master_slider.custom_minimum_size = Vector2(0, 60) + master_slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL + master_slider.max_value = 100 + master_slider.value = 80 + master_row.add_child(master_slider) + master_row.add_child(_panel_label("80%", 22)) + master.add_child(master_row) + master.add_child(_check("ОТКЛЮЧИТЬ ВСЕ ЗВУКИ")) + + var advertisement := _add_panel(page, "ГРОМКОСТЬ ПРОМО-РОЛИКА", 250) + advertisement.add_child(_panel_label("ОТДЕЛЬНАЯ ГРОМКОСТЬ ПРОМО-РОЛИКОВ")) + var ad_slider := HSlider.new() + ad_slider.custom_minimum_size = Vector2(0, 60) + ad_slider.max_value = 100 + ad_slider.value = 45 + advertisement.add_child(ad_slider) + + var test := _add_panel(page, "ПРОВЕРКА", 250) + test.add_child(_action("ПРОВЕРИТЬ ЗВУК")) + test.add_child(_semantic_label("ИЗМЕНЕНИЯ СОХРАНЯЮТСЯ АВТОМАТИЧЕСКИ", &"StatusText", true)) + + +func _build_advertisement(page: VBoxContainer) -> void: + var settings := _add_panel(page, "ПРОМО НА ГЛАВНОМ ЭКРАНЕ", 390) + settings.add_child(_check("ПОКАЗЫВАТЬ ПРОМО", true)) + settings.add_child(_check("ПРОМО-РОЛИК БЕЗ ЗВУКА", true)) + settings.add_child(_semantic_label("ТЕКСТ ВМЕСТО ПРОМО • ДО 120 СИМВОЛОВ", &"FieldLabel")) + settings.add_child(_line_edit("ПРОМО-БЛОК", "ПОЛУЧИ СВОИ ЖЕТОНЫ!")) + + var media := _add_panel(page, "ПОСТЕР И ПЛЕЙЛИСТ", 390) + media.add_child(_semantic_label("ПУТЬ К ПОСТЕРУ PNG / JPG / WEBP", &"FieldLabel")) + media.add_child(_line_edit("user://promo/poster.png")) + media.add_child(_semantic_label("ЛОКАЛЬНЫЙ ПРОМО-РОЛИК OGV", &"FieldLabel")) + var video_row := _row() + video_row.add_child(_expand(_line_edit("D:/media/promo.ogv"))) + var remove := _action("УДАЛИТЬ") + remove.custom_minimum_size.x = 150 + remove.theme_type_variation = &"DangerButton" + video_row.add_child(remove) + media.add_child(video_row) + media.add_child(_action("+ ДОБАВИТЬ ПРОМО-РОЛИК")) + + var summary := _add_panel(page, "ПРЕДВАРИТЕЛЬНЫЙ ИТОГ", 190) + summary.add_child(_panel_label("ПРОМО ВКЛЮЧЕНО • ПОСТЕР ЗАДАН • ПРОМО-РОЛИКОВ: 1", 17, true)) + + +func _build_appearance(page: VBoxContainer) -> void: + var theme_panel := _add_panel(page, "ВНЕШНЯЯ ТЕМА", 390) + theme_panel.add_child(_check("ИСПОЛЬЗОВАТЬ ВНЕШНИЙ DLC", true)) + theme_panel.add_child(_semantic_label("ПУТЬ К ПАКЕТУ .PCK", &"FieldLabel")) + theme_panel.add_child(_line_edit("user://theme_dlc/active_theme.pck", "user://theme_dlc/active_theme.pck")) + theme_panel.add_child(_semantic_label("ПАКЕТ НАЙДЕН. РЕСУРСЫ ПРОВЕРЯТСЯ ПРИ ЗАПУСКЕ.", &"StatusText")) + + var effects := _add_panel(page, "ЭФФЕКТЫ", 250) + effects.add_child(_panel_label("ОБЛЕГЧЁННЫЙ РЕЖИМ ОТКЛЮЧАЕТ НЕОБЯЗАТЕЛЬНЫЕ СПРАЙТЫ", 17)) + effects.add_child(_check("ОБЛЕГЧЁННЫЙ РЕЖИМ")) + + var status := _add_panel(page, "ПРИМЕНЕНИЕ ИЗМЕНЕНИЙ", 240) + status.add_child(_panel_label("ЭФФЕКТЫ ПРИМЕНЯЮТСЯ СРАЗУ.", 17)) + status.add_child(_panel_label("DLC И ПУТЬ — ПОСЛЕ ПЕРЕЗАПУСКА.", 17)) + status.add_child(_panel_label("СЕЙЧАС АКТИВНА: SPACE PIXEL", 18)) + + +func _build_pricing(page: VBoxContainer) -> void: + var price := _add_panel(page, "СТОИМОСТЬ ОДНОГО ЖЕТОНА", 260) + price.add_child(_panel_label("ЦЕНА ДОЛЖНА БЫТЬ ПОЛОЖИТЕЛЬНОЙ")) + price.add_child(_spin(1, 10000, 10, " ₽")) + + var bonus := _add_panel(page, "ДОПОЛНИТЕЛЬНЫЕ ЖЕТОНЫ", 380) + bonus.add_child(_panel_label("ПОРОГ СУММЫ → БОНУС")) + var bonus_row := _row() + bonus_row.add_child(_expand(_spin(10, 100000, 500, " ₽"))) + bonus_row.add_child(_panel_label("→", 24, true)) + bonus_row.add_child(_expand(_spin(0, 10000, 50, " ЖЕТ."))) + bonus.add_child(bonus_row) + bonus.add_child(_action("+ ДОБАВИТЬ ПРАВИЛО")) + + var preview := _add_panel(page, "ПРЕДВАРИТЕЛЬНЫЙ РАСЧЁТ", 230) + preview.add_child(_panel_label("100 ₽ → 10 + 0 = 10 ЖЕТ.\n500 ₽ → 50 + 50 = 100 ЖЕТ.", 19, true)) + + +func _build_payment(page: VBoxContainer) -> void: + var methods := _add_panel(page, "СПОСОБЫ ОПЛАТЫ", 280) + methods.add_child(_check("НАЛИЧНАЯ ОПЛАТА", true)) + methods.add_child(_check("ОПЛАТА КАРТОЙ", true)) + + var card := _add_panel(page, "КАРТОЧНЫЕ СУММЫ", 400) + card.add_child(_panel_label("МАКСИМАЛЬНАЯ СУММА")) + card.add_child(_spin(10, 100000, 5000, " ₽")) + card.add_child(_panel_label("ШАГ РУЧНОГО ВВОДА")) + card.add_child(_spin(1, 10000, 10, " ₽")) + card.add_child(_action("+ ДОБАВИТЬ СУММУ")) + + var timeouts := _add_panel(page, "ТАЙМАУТЫ", 330) + for item in [["БЕЗДЕЙСТВИЕ", 120], ["ОЖИДАНИЕ ОПЛАТЫ", 90], ["ПОКАЗ РЕЗУЛЬТАТА", 8]]: + var timeout_row := _row() + timeout_row.add_child(_expand(_panel_label(item[0], 17))) + timeout_row.add_child(_spin(3, 600, item[1], " С")) + timeouts.add_child(timeout_row) + + +func _build_equipment(page: VBoxContainer) -> void: + var connection := _add_panel(page, "ПОДКЛЮЧЕНИЕ К КОНТРОЛЛЕРУ", 500) + connection.add_child(_check("ИСПОЛЬЗОВАТЬ ИМИТАЦИЮ ОБОРУДОВАНИЯ")) + connection.add_child(_panel_label("COM-ПОРТ")) + connection.add_child(_option(PackedStringArray(["COM1", "COM3", "COM7"]), 1)) + connection.add_child(_panel_label("СКОРОСТЬ ПОРТА")) + connection.add_child(_option(PackedStringArray(["9600", "57600", "115200"]), 2)) + connection.add_child(_panel_label("ПОВТОР ПОДКЛЮЧЕНИЯ")) + connection.add_child(_spin(1, 60, 5, " С")) + + var window := _add_panel(page, "ОКНО И ПРОИЗВОДИТЕЛЬНОСТЬ", 390) + window.add_child(_check("ПОЛНОЭКРАННЫЙ РЕЖИМ", true)) + window.add_child(_check("ОКНО БЕЗ РАМКИ", true)) + window.add_child(_check("DEBUG-СБОРКА В ОКНЕ • НЕДОСТУПНО", false, true)) + window.add_child(_option(PackedStringArray(["30 FPS", "60 FPS", "120 FPS"]), 1)) + + +func _build_diagnostics(page: VBoxContainer) -> void: + var status := _add_panel(page, "СОСТОЯНИЕ ПРИЛОЖЕНИЯ", 290) + status.add_child(_panel_label("ВЕРСИЯ: 0.1.0 • КОНТРОЛЛЕР: ГОТОВ", 18)) + status.add_child(_panel_label("ПОСЛЕДНИЕ БЕЗОПАСНЫЕ ПРЕДУПРЕЖДЕНИЯ")) + status.add_child(_panel_label("НЕТ ПРЕДУПРЕЖДЕНИЙ.", 17)) + + var logging := _add_panel(page, "ЖУРНАЛИРОВАНИЕ", 390) + logging.add_child(_panel_label("МИНИМАЛЬНЫЙ УРОВЕНЬ")) + logging.add_child(_option(PackedStringArray(["DEBUG", "INFO", "WARNING", "ERROR"]), 1)) + var limits := _row() + limits.add_child(_expand(_spin(1, 100, 10, " МБ"))) + limits.add_child(_expand(_spin(1, 365, 30, " ДН."))) + logging.add_child(limits) + + var test := _add_panel(page, "ТЕСТОВАЯ ВЫДАЧА", 280) + test.add_child(_panel_label("ВЫДАЁТ ОДИН ЖЕТОН БЕЗ ОПЛАТЫ.", 17)) + test.add_child(_action("ПОДТВЕРДИТЬ ВЫДАЧУ 1 ЖЕТОНА")) + test.add_child(_semantic_label("НАЖМИТЕ КНОПКУ ЕЩЁ РАЗ ДЛЯ ПОДТВЕРЖДЕНИЯ.", &"WarningText", true)) + + var contract := _add_panel(page, "СОСТОЯНИЯ UI-КОНТРАКТА", 420) + contract.add_child(_semantic_label("ПОЛЕ: ОБЯЗАТЕЛЬНОЕ ЗНАЧЕНИЕ", &"FieldLabel")) + contract.add_child(_semantic_label("ГОТОВО: ИЗМЕНЕНИЯ СОХРАНЕНЫ.", &"StatusText")) + contract.add_child(_semantic_label("ПРЕДУПРЕЖДЕНИЕ: НУЖЕН ПЕРЕЗАПУСК.", &"WarningText")) + contract.add_child(_semantic_label("ОШИБКА: ИСПРАВЬТЕ ЗНАЧЕНИЕ.", &"ErrorText")) + contract.add_child(_semantic_action("ВТОРИЧНОЕ ДЕЙСТВИЕ", &"SecondaryButton")) + contract.add_child(_semantic_action("ОПАСНОЕ ДЕЙСТВИЕ", &"DangerButton")) + contract.add_child(_semantic_action("ВКЛАДКА РАЗДЕЛА", &"SectionTabButton")) diff --git a/preview_scenes/SettingsPreview.tscn b/preview_scenes/SettingsPreview.tscn new file mode 100644 index 0000000..f583853 --- /dev/null +++ b/preview_scenes/SettingsPreview.tscn @@ -0,0 +1,100 @@ +[gd_scene load_steps=3 format=3] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Script" path="res://preview_scenes/SettingsPreview.gd" id="2_script"] + +[node name="SETTINGS" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("2_script") + +[node name="Header" type="PanelContainer" parent="."] +layout_mode = 0 +offset_left = 28.0 +offset_top = 28.0 +offset_right = 692.0 +offset_bottom = 142.0 + +[node name="Title" type="Label" parent="Header"] +layout_mode = 2 +theme_type_variation = &"ScreenTitle" +theme_override_font_sizes/font_size = 31 +text = "НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SectionTabs" type="GridContainer" parent="."] +layout_mode = 0 +offset_left = 60.0 +offset_top = 162.0 +offset_right = 660.0 +offset_bottom = 319.0 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="General" type="Button" parent="SectionTabs"] +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"SectionTabButton" +text = "ОБЩИЕ" +toggle_mode = true + +[node name="Audio" type="Button" parent="SectionTabs"] +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"SectionTabButton" +text = "ЗВУК" +toggle_mode = true + +[node name="Advertisement" type="Button" parent="SectionTabs"] +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"SectionTabButton" +text = "ПРОМО" +toggle_mode = true + +[node name="Pricing" type="Button" parent="SectionTabs"] +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"SectionTabButton" +text = "ТАРИФЫ" +toggle_mode = true + +[node name="Payment" type="Button" parent="SectionTabs"] +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"SectionTabButton" +text = "ОПЛАТА" +toggle_mode = true + +[node name="PageScroll" type="ScrollContainer" parent="."] +layout_mode = 0 +offset_left = 28.0 +offset_top = 340.0 +offset_right = 692.0 +offset_bottom = 1170.0 +horizontal_scroll_mode = 0 + +[node name="PageMargin" type="MarginContainer" parent="PageScroll"] +custom_minimum_size = Vector2(646, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/margin_right = 10 + +[node name="Page" type="VBoxContainer" parent="PageScroll/PageMargin"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 19 + +[node name="Footer" parent="." instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/preview_scenes/SuccessPreview.tscn b/preview_scenes/SuccessPreview.tscn new file mode 100644 index 0000000..d489cef --- /dev/null +++ b/preview_scenes/SuccessPreview.tscn @@ -0,0 +1,105 @@ +[gd_scene format=3 uid="uid://cyepwpigxpvau"] + +[ext_resource type="PackedScene" path="res://preview_scenes/PreviewFooter.tscn" id="1_footer"] +[ext_resource type="Texture2D" uid="uid://bxc8ku68xb4r8" path="res://exchanger_theme_dlc/assets/animations/payment_success/frame_01.png" id="2_success_1"] +[ext_resource type="Texture2D" uid="uid://clubcslpx4qdr" path="res://exchanger_theme_dlc/assets/animations/payment_success/frame_02.png" id="3_success_2"] +[ext_resource type="Texture2D" uid="uid://ckqpek4skkm77" path="res://exchanger_theme_dlc/assets/animations/payment_success/frame_03.png" id="4_success_3"] +[ext_resource type="Texture2D" uid="uid://c33lc27tqncru" path="res://exchanger_theme_dlc/assets/animations/payment_success/frame_04.png" id="5_success_4"] +[ext_resource type="Texture2D" uid="uid://w8adsbfld640" path="res://exchanger_theme_dlc/assets/animations/payment_success/frame_05.png" id="6_success_5"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_success"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_success_1") +}, { +"duration": 1.0, +"texture": ExtResource("3_success_2") +}, { +"duration": 1.0, +"texture": ExtResource("4_success_3") +}, { +"duration": 1.0, +"texture": ExtResource("5_success_4") +}, { +"duration": 1.0, +"texture": ExtResource("6_success_5") +}], +"loop": 1, +"name": &"default", +"speed": 5.0 +}] + +[node name="SUCCESS" type="Control" unique_id=542554992] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Title" type="Label" parent="." unique_id=1877645034] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА ПРОШЛА" +horizontal_alignment = 1 + +[node name="ResultPanel" type="PanelContainer" parent="." unique_id=1033809395] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="ResultPanel" unique_id=1107502705] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="ResultPanel/Content" unique_id=3989466] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВЫДАЧА ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="ResultPanel/Content" unique_id=652635619] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 + +[node name="Animation" type="AnimatedSprite2D" parent="ResultPanel/Content/Body" unique_id=118426354] +texture_filter = 1 +position = Vector2(242, 220) +scale = Vector2(0.72, 0.72) +sprite_frames = SubResource("SpriteFrames_success") +autoplay = "default" + +[node name="Message" type="Label" parent="ResultPanel/Content/Body" unique_id=11368542] +layout_mode = 0 +offset_left = 28.0 +offset_top = 418.0 +offset_right = 456.0 +offset_bottom = 504.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 23 +text = "ЗАБЕРИТЕ 100 ЖЕТОНОВ +СПАСИБО ЗА ПОКУПКУ!" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Home" type="Button" parent="." unique_id=1638722420] +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="." unique_id=1175664387 instance=ExtResource("1_footer")] +layout_mode = 1 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..794db94 --- /dev/null +++ b/project.godot @@ -0,0 +1,47 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Exchanger Theme DLC Builder" +run/main_scene="res://tools/preview/preview.tscn" +config/features=PackedStringArray("4.7", "GL Compatibility") + +[autoload] + +_mcp_game_helper="*res://addons/godot_ai/runtime/game_helper.gd" + +[display] + +window/size/viewport_width=720 +window/size/viewport_height=1280 +window/size/window_width_override=720 +window/size/window_height_override=1280 +window/stretch/mode="canvas_items" +window/stretch/aspect="expand" + +[dotnet] + +project/assembly_name="Exchanger Theme DLC Builder" + +[editor] + +export/convert_text_resources_to_binary=false + +[editor_plugins] + +enabled=PackedStringArray("res://addons/exchanger_theme_manager/plugin.cfg", "res://addons/godot_ai/plugin.cfg") + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_etc2_astc=true diff --git a/test-theme.ps1 b/test-theme.ps1 new file mode 100644 index 0000000..3240571 --- /dev/null +++ b/test-theme.ps1 @@ -0,0 +1,58 @@ +param( + [string]$ThemeId = "space-pixel", + [string]$ThemeSource = "", + [string]$GodotExecutable = "", + [switch]$SkipPreviewSmoke +) + +$ErrorActionPreference = "Stop" +$projectRoot = (Resolve-Path $PSScriptRoot).Path +. (Join-Path $projectRoot "tools\Resolve-GodotExecutable.ps1") +$GodotExecutable = Resolve-ThemeGodotExecutable -GodotExecutable $GodotExecutable + +& (Join-Path $projectRoot "tools\Select-Theme.ps1") -ThemeId $ThemeId -ThemeSource $ThemeSource +$activeState = Get-Content -LiteralPath (Join-Path $projectRoot "build\active-theme.json") -Raw -Encoding UTF8 | ConvertFrom-Json +$packageRoot = [System.IO.Path]::GetFullPath([string]$activeState.Package) +$workspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $projectRoot ("build\theme-workspaces\" + $ThemeId + "-test"))) +$allowedWorkspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $projectRoot "build\theme-workspaces")) + +try { + & (Join-Path $projectRoot "tools\Prepare-ThemeWorkspace.ps1") -PackageRoot $packageRoot -WorkspaceRoot $workspaceRoot + + & $GodotExecutable --headless --path $workspaceRoot --import + if ($LASTEXITCODE -ne 0) { + throw "Godot could not import resources for theme '$ThemeId'." + } + + & $GodotExecutable --headless --path $workspaceRoot --script res://tools/validate_theme.gd -- --contract res://contracts/screen_bindings.v2.json + if ($LASTEXITCODE -ne 0) { + throw "Theme '$ThemeId' does not satisfy manifest v2 or the binding contract." + } + + & $GodotExecutable --headless --path $projectRoot --script res://tools/verify_interactive_pet.gd -- --theme $ThemeId --optional + if ($LASTEXITCODE -ne 0) { + throw "Interactive pet verification failed for theme '$ThemeId'." + } + + if (-not $SkipPreviewSmoke) { + if (-not $packageRoot.StartsWith($projectRoot + [System.IO.Path]::DirectorySeparatorChar, [System.StringComparison]::OrdinalIgnoreCase)) { + throw "Preview smoke requires a theme package inside the builder project." + } + & $GodotExecutable --headless --path $projectRoot --quit-after 3 + if ($LASTEXITCODE -ne 0) { + throw "Headless preview smoke for theme '$ThemeId' failed." + } + } +} finally { + if ( + (Test-Path -LiteralPath $workspaceRoot) -and + $workspaceRoot.StartsWith($allowedWorkspaceRoot + [System.IO.Path]::DirectorySeparatorChar, [System.StringComparison]::OrdinalIgnoreCase) + ) { + Remove-Item -LiteralPath $workspaceRoot -Recurse -Force + } + if ((Test-Path -LiteralPath $allowedWorkspaceRoot) -and @(Get-ChildItem -LiteralPath $allowedWorkspaceRoot -Force).Count -eq 0) { + Remove-Item -LiteralPath $allowedWorkspaceRoot -Force + } +} + +Write-Host "Theme '$ThemeId': validation and preview smoke passed." diff --git a/themes/example/README.md b/themes/example/README.md new file mode 100644 index 0000000..f4f8545 --- /dev/null +++ b/themes/example/README.md @@ -0,0 +1,27 @@ +# Шаблон темы + +Создавайте новую тему через `Редактор → Создать тему`: EditorPlugin скопирует этот каталог, +обновит `ThemeId`/`DisplayName` и активирует результат. Для автоматизации допустимо скопировать +`example` в `themes/` вручную и изменить те же поля manifest. Не переименовывайте файлы экранов, +корневые узлы и значения `exchanger_binding_id`: они являются контрактом приложения. + +Тема `example` сама является валидным минимальным пакетом manifest v2: в ней находятся все +девять production-сцен, 481 immutable и 17 supplemental обязательных биндингов, включая готовые +экранные клавиатуры SETTINGS. Её можно активировать, проверить и +собрать до начала оформления новой темы. + +Если теме нужен интерактивный питомец, добавьте его production-сцену в `package/components/`, +скрипты и ресурсы — внутрь `package/`, затем задайте `InteractivePetScene` в manifest. Базовый и +необязательный составной runtime-контракты описаны в +[`docs/SCRIPTING.md`](../../docs/SCRIPTING.md), а дизайнерский workflow — в +[`docs/COMPOSITE_PET_ANIMATIONS.md`](../../docs/COMPOSITE_PET_ANIMATIONS.md); памятка для автора лежит в +[`source/interactive_pet/README.md`](source/interactive_pet/README.md). + +Оригиналы, рабочие файлы графического редактора и локальные референсы храните в `source/`. +В PCK экспортируется только содержимое `package/`. Скрипт сборки временно копирует его в +изолированный проект под канонический runtime-путь `res://exchanger_theme_dlc/` и удаляет +workspace после export. + +Каталог темы всегда виден в Godot FileSystem. `.gdignore` не добавляйте: package использует +относительные ссылки, поэтому сцены можно открывать и редактировать непосредственно в +`res://themes//package/scenes/`. diff --git a/themes/example/package/assets/background/background.png b/themes/example/package/assets/background/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9893ea75af6fa338657dc9522d106ab9c8250 GIT binary patch literal 96063 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 KqC)>l)c*i>tv;0i literal 0 HcmV?d00001 diff --git a/themes/example/package/assets/background/background.png.import b/themes/example/package/assets/background/background.png.import new file mode 100644 index 0000000..2341830 --- /dev/null +++ b/themes/example/package/assets/background/background.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdfx6iprx4kbw" +path="res://.godot/imported/background.png-b340f250985a724d15828ecf8cb4c3ce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/example/package/assets/background/background.png" +dest_files=["res://.godot/imported/background.png-b340f250985a724d15828ecf8cb4c3ce.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/example/package/assets/ui/keyboard_hide.svg b/themes/example/package/assets/ui/keyboard_hide.svg new file mode 100644 index 0000000..425408e --- /dev/null +++ b/themes/example/package/assets/ui/keyboard_hide.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/example/package/assets/ui/keyboard_hide.svg.import b/themes/example/package/assets/ui/keyboard_hide.svg.import new file mode 100644 index 0000000..ed7f296 --- /dev/null +++ b/themes/example/package/assets/ui/keyboard_hide.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmuxbbgwk3j3h" +path="res://.godot/imported/keyboard_hide.svg-b284de8037d6cef1dded45b062e71f95.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/example/package/assets/ui/keyboard_hide.svg" +dest_files=["res://.godot/imported/keyboard_hide.svg-b284de8037d6cef1dded45b062e71f95.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/themes/example/package/background_decoration.tscn b/themes/example/package/background_decoration.tscn new file mode 100644 index 0000000..83dce1e --- /dev/null +++ b/themes/example/package/background_decoration.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="scripts/decoration_controller.gd" id="1_script"] + +[node name="BackgroundDecoration" type="Node2D"] +script = ExtResource("1_script") diff --git a/themes/example/package/components/footer.tscn b/themes/example/package/components/footer.tscn new file mode 100644 index 0000000..e97cfdc --- /dev/null +++ b/themes/example/package/components/footer.tscn @@ -0,0 +1,45 @@ +[gd_scene format=3] + +[node name="PreviewFooter" type="Control"] +layout_mode = 3 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -82.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 2 + +[node name="Background" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_type_variation = &"FooterPanel" + +[node name="Brand" type="Label" parent="."] +layout_mode = 0 +offset_left = 28.0 +offset_top = 8.0 +offset_right = 296.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 20 +text = "РАЗМЕН\nЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Support" type="Label" parent="."] +layout_mode = 0 +offset_left = 310.0 +offset_top = 8.0 +offset_right = 692.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 18 +text = "ТЕХПОДДЕРЖКА:\nТелефон поддержки уточняется" +horizontal_alignment = 2 +vertical_alignment = 1 diff --git a/themes/example/package/components/on_screen_keyboards.tscn b/themes/example/package/components/on_screen_keyboards.tscn new file mode 100644 index 0000000..fb08458 --- /dev/null +++ b/themes/example/package/components/on_screen_keyboards.tscn @@ -0,0 +1,550 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Texture2D" path="../assets/ui/keyboard_hide.svg" id="1_hide_icon"] + +[node name="KeyboardOverlay" type="Control"] +z_index = 30 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="TextKeyboard" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard" +visible = false +layout_mode = 1 +anchors_preset = 12 +anchor_right = 1.0 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -512.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 0 + +[node name="Content" type="VBoxContainer" parent="TextKeyboard"] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Header" type="HBoxContainer" parent="TextKeyboard/Content"] +custom_minimum_size = Vector2(0, 58) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Title" type="Label" parent="TextKeyboard/Content/Header"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 20 +text = "ЭКРАННАЯ КЛАВИАТУРА" +vertical_alignment = 1 + +[node name="HideButton" type="Button" parent="TextKeyboard/Content/Header"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.header.hide_button" +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +focus_mode = 0 +tooltip_text = "Скрыть клавиатуру" +icon = ExtResource("1_hide_icon") +icon_max_width = 40 +expand_icon = true + +[node name="LetterRows" type="VBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Row0" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key00" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_00" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "й" + +[node name="Key01" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_01" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ц" + +[node name="Key02" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_02" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "у" + +[node name="Key03" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_03" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "к" + +[node name="Key04" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_04" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "е" + +[node name="Key05" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_05" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "н" + +[node name="Key06" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_06" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "г" + +[node name="Key07" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_07" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ш" + +[node name="Key08" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_08" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "щ" + +[node name="Key09" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_09" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "з" + +[node name="Key10" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_10" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "х" + +[node name="Key11" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_11" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ъ" + +[node name="Row1" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key12" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_12" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ф" + +[node name="Key13" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_13" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ы" + +[node name="Key14" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_14" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "в" + +[node name="Key15" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_15" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "а" + +[node name="Key16" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_16" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "п" + +[node name="Key17" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_17" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "р" + +[node name="Key18" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_18" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "о" + +[node name="Key19" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_19" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "л" + +[node name="Key20" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_20" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "д" + +[node name="Key21" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_21" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ж" + +[node name="Key22" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_22" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "э" + +[node name="Row2" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key23" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_23" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "я" + +[node name="Key24" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_24" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ч" + +[node name="Key25" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_25" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "с" + +[node name="Key26" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_26" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "м" + +[node name="Key27" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_27" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "и" + +[node name="Key28" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_28" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "т" + +[node name="Key29" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_29" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ь" + +[node name="Key30" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_30" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "б" + +[node name="Key31" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_31" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ю" + +[node name="Key32" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_32" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ё" + +[node name="PrimaryActions" type="HBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="ShiftButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button" +custom_minimum_size = Vector2(128, 76) +layout_mode = 2 +focus_mode = 0 +text = "SHIFT" +theme_type_variation = &"KeyboardActionButton" + +[node name="LanguageButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button" +custom_minimum_size = Vector2(96, 76) +layout_mode = 2 +focus_mode = 0 +text = "RU" +theme_type_variation = &"KeyboardActionButton" + +[node name="SymbolsButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button" +custom_minimum_size = Vector2(116, 76) +layout_mode = 2 +focus_mode = 0 +text = "?123" +theme_type_variation = &"KeyboardActionButton" + +[node name="BackspaceButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button" +custom_minimum_size = Vector2(236, 76) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "СТЕРЕТЬ" +theme_type_variation = &"KeyboardActionButton" + +[node name="SecondaryActions" type="HBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="ClearButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button" +custom_minimum_size = Vector2(164, 76) +layout_mode = 2 +focus_mode = 0 +text = "ОЧИСТИТЬ" +theme_type_variation = &"KeyboardActionButton" + +[node name="CaretLeftButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button" +custom_minimum_size = Vector2(88, 76) +layout_mode = 2 +focus_mode = 0 +text = "<" +theme_type_variation = &"KeyboardActionButton" + +[node name="SpaceButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button" +custom_minimum_size = Vector2(220, 76) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ПРОБЕЛ" +theme_type_variation = &"KeyboardActionButton" + +[node name="CaretRightButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button" +custom_minimum_size = Vector2(88, 76) +layout_mode = 2 +focus_mode = 0 +text = ">" +theme_type_variation = &"KeyboardActionButton" + +[node name="NumericKeyboard" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard" +visible = false +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -280.0 +offset_top = -520.0 +offset_right = 280.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 0 + +[node name="Content" type="VBoxContainer" parent="NumericKeyboard"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="Header" type="HBoxContainer" parent="NumericKeyboard/Content"] +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Title" type="Label" parent="NumericKeyboard/Content/Header"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 20 +text = "ЦИФРОВАЯ КЛАВИАТУРА" +vertical_alignment = 1 + +[node name="HideButton" type="Button" parent="NumericKeyboard/Content/Header"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button" +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +focus_mode = 0 +tooltip_text = "Скрыть клавиатуру" +icon = ExtResource("1_hide_icon") +icon_max_width = 40 +expand_icon = true + +[node name="Grid" type="GridContainer" parent="NumericKeyboard/Content"] +layout_mode = 2 +theme_override_constants/h_separation = 10 +theme_override_constants/v_separation = 10 +columns = 3 + +[node name="Digit1" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit1" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "1" + +[node name="Digit2" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit2" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "2" + +[node name="Digit3" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit3" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "3" + +[node name="Digit4" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit4" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "4" + +[node name="Digit5" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit5" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "5" + +[node name="Digit6" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit6" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "6" + +[node name="Digit7" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit7" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "7" + +[node name="Digit8" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit8" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "8" + +[node name="Digit9" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit9" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "9" + +[node name="ClearButton" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ОЧИСТИТЬ" + +[node name="Digit0" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit0" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "0" + +[node name="BackspaceButton" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "СТЕРЕТЬ" diff --git a/themes/example/package/contracts/screen_bindings.v2.json b/themes/example/package/contracts/screen_bindings.v2.json new file mode 100644 index 0000000..657e795 --- /dev/null +++ b/themes/example/package/contracts/screen_bindings.v2.json @@ -0,0 +1,3929 @@ +{ + "Format": "ExchangerThemeBindingContract", + "Version": 2, + "ScreenMetadataKey": "exchanger_screen_binding_id", + "ElementMetadataKey": "exchanger_binding_id", + "Source": "Immutable Exchanger ThemeView contract: host binds existing theme-owned nodes only", + "Screens": [ + { + "BindingId": "screen.home", + "Key": "home", + "RootName": "ThemeScreen_Home", + "Path": "res://exchanger_theme_dlc/scenes/screen_home.tscn", + "Bindings": [ + { + "Id": "home.scroll.content.footer.margin.content.brand", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Brand" + }, + { + "Id": "home.scroll.content.speech_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SpeechText" + }, + { + "Id": "home.scroll.content.price_panel.margin.content.price", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.cash_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CashButton" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.card_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CardButton" + }, + { + "Id": "home.scroll.content.footer.margin.content.support", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Support" + }, + { + "Id": "home.scroll.content.stock_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus" + }, + { + "Id": "home.scroll.content.stock_status.state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus/Margin/Content/State" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status.label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin/Label" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.poster", + "Types": [ + "TextureRect" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/Poster" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.video_player", + "Types": [ + "VideoStreamPlayer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/VideoPlayer" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.fallback_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/FallbackLabel" + } + ] + }, + { + "BindingId": "screen.cash_payment", + "Key": "cash_payment", + "RootName": "ThemeScreen_CashPayment", + "Path": "res://exchanger_theme_dlc/scenes/screen_cash_payment.tscn", + "Bindings": [ + { + "Id": "cash_payment.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "cash_payment.content.summary.margin.values.balance", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Balance" + }, + { + "Id": "cash_payment.content.summary.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Tokens" + }, + { + "Id": "cash_payment.content.summary.margin.values.bonus", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Bonus" + }, + { + "Id": "cash_payment.content.dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DispenseButton" + }, + { + "Id": "cash_payment.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "cash_payment.content.debug_panel.add10_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add10Button" + }, + { + "Id": "cash_payment.content.debug_panel.add50_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add50Button" + }, + { + "Id": "cash_payment.content.debug_panel.add100_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add100Button" + } + ] + }, + { + "BindingId": "screen.card_amount", + "Key": "card_amount", + "RootName": "ThemeScreen_CardAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_amount.tscn", + "Bindings": [ + { + "Id": "card_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot13" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot12" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot11" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot10" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot09" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot08" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot07" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot06" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot05" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot04" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot03" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot02" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot01" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot00" + }, + { + "Id": "card_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_amount.content.reward_panel.content.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/RewardPanel/Content/Value" + }, + { + "Id": "card_amount.content.selection_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/SelectionLabel" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.other_amount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/OtherAmountButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid", + "Types": [ + "GridContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot14" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot15" + } + ] + }, + { + "BindingId": "screen.card_custom_amount", + "Key": "card_custom_amount", + "RootName": "ThemeScreen_CardCustomAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_custom_amount.tscn", + "Bindings": [ + { + "Id": "card_custom_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit7" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit6" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit5" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit4" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit3" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit2" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit1" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit0" + }, + { + "Id": "card_custom_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/BackspaceButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/ClearButton" + }, + { + "Id": "card_custom_amount.content.hint", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Hint" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.input_value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/InputValue" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Tokens" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Amount" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit8" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.card_terminal", + "Key": "card_terminal", + "RootName": "ThemeScreen_CardTerminal", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_terminal.tscn", + "Bindings": [ + { + "Id": "card_terminal.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_terminal.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "card_terminal.content.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Amount" + }, + { + "Id": "card_terminal.content.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Tokens" + }, + { + "Id": "card_terminal.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "card_terminal.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "card_terminal.content.debug_panel.approve_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ApproveButton" + }, + { + "Id": "card_terminal.content.debug_panel.decline_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DeclineButton" + }, + { + "Id": "card_terminal.content.debug_panel.dispense_failure_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DispenseFailureButton" + }, + { + "Id": "card_terminal.content.debug_panel.partial_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/PartialDispenseButton" + }, + { + "Id": "card_terminal.content.debug_panel.connection_loss_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ConnectionLossButton" + } + ] + }, + { + "BindingId": "screen.success", + "Key": "success", + "RootName": "ThemeScreen_Success", + "Path": "res://exchanger_theme_dlc/scenes/screen_success.tscn", + "Bindings": [ + { + "Id": "success.content.result_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Title" + }, + { + "Id": "success.content.result_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Body/Message" + }, + { + "Id": "success.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "success.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.error", + "Key": "error", + "RootName": "ThemeScreen_Error", + "Path": "res://exchanger_theme_dlc/scenes/screen_error.tscn", + "Bindings": [ + { + "Id": "error.content.error_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Title" + }, + { + "Id": "error.content.error_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Body/Message" + }, + { + "Id": "error.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "error.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.service_access", + "Key": "service_access", + "RootName": "ThemeScreen_ServiceAccess", + "Path": "res://exchanger_theme_dlc/scenes/screen_service_access.tscn", + "Bindings": [ + { + "Id": "service_access.content.header", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Header" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit7" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit6" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit5" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit4" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit3" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit2" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit1" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit8" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit0" + }, + { + "Id": "service_access.content.access_panel.fields.enter_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/EnterButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.erase", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Erase" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.clear", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Clear" + }, + { + "Id": "service_access.content.access_panel.fields.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Status" + }, + { + "Id": "service_access.content.access_panel.fields.pin_display", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinDisplay" + }, + { + "Id": "service_access.content.access_panel.fields.pin_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinLabel" + }, + { + "Id": "service_access.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Description" + }, + { + "Id": "service_access.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.settings", + "Key": "settings", + "RootName": "ThemeScreen_Settings", + "Path": "res://exchanger_theme_dlc/scenes/screen_settings.tscn", + "Bindings": [ + { + "Id": "settings.scroll.content.section_tabs.general_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/GeneralButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Threshold" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/EmptyState" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/LimitsError" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.custom_step", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/CustomStep" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.max_amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/MaxAmount" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.card_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CardEnabled" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.cash_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CashEnabled" + }, + { + "Id": "settings.scroll.content.preview_panel.margin.content.values", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel/Margin/Content/Values" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.add_rule_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/AddRuleButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.price", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.test_sound_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/TestSoundButton" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.mute", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/Mute" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.add_preset_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/AddPresetButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.presets_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetsError" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.idle", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Idle" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cash_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashPayment" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.poster_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/PosterPath" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackError" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackText" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.muted", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Muted" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.reset_pin_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/ResetPinButton" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.support_phone", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.short_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhoneError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortTextError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationNameError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.success", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Success" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cashless_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashlessPayment" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.application_name", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/ConfirmButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/CancelButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Amount" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel" + }, + { + "Id": "settings.scroll.content.test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel" + }, + { + "Id": "settings.scroll.content.advertisement_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel" + }, + { + "Id": "settings.scroll.content.master_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel" + }, + { + "Id": "settings.scroll.content.security_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel" + }, + { + "Id": "settings.scroll.content.branding_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel" + }, + { + "Id": "settings.scroll.content.section_tabs.diagnostics_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/DiagnosticsButton" + }, + { + "Id": "settings.scroll.content.section_tabs.equipment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/EquipmentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.service_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/ServiceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.payment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PaymentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.pricing_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PricingButton" + }, + { + "Id": "settings.scroll.content.section_tabs.appearance_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AppearanceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.advertisement_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AdvertisementButton" + }, + { + "Id": "settings.scroll.content.section_tabs.audio_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AudioButton" + }, + { + "Id": "settings.scroll.content.branding_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel" + }, + { + "Id": "settings.scroll.content.preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Description" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Title" + }, + { + "Id": "settings.service_dialog_overlay", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/RecountButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/RecountButton" + }, + { + "Id": "settings.scroll.content.bonus_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel" + }, + { + "Id": "settings.scroll.content.equipment_window_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel" + }, + { + "Id": "settings.scroll.content.timeouts_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel" + }, + { + "Id": "settings.scroll.content.card_options_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel" + }, + { + "Id": "settings.scroll.content.payment_methods_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.count", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Count" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/AddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Error" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_32", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_32" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_31", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_31" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_30", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_30" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_29", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_29" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_28", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_28" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_27", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_27" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_26", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_26" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_25", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_25" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/LanguageButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_24", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_24" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_22", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_22" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_21", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_21" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_20", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_20" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_19", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_19" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_18", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_18" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_17", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_17" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_16", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_16" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_15" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_14" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_23", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_23" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_13" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/ShiftButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/BackspaceButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/BackspaceButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit9" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit8" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit7" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/SymbolsButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit6" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit4" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit3" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit2" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit1" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit0" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/SpaceButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretRightButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretLeftButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit5" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_12" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_10" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.minimum_level", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MinimumLevel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.recent_errors", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RecentErrors" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.runtime_summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RuntimeSummary" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.target_fps", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/TargetFps" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.debug_window", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/DebugWindow" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.borderless", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Borderless" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.fullscreen", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Fullscreen" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.connection_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ConnectionError" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.reconnect_seconds", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ReconnectSeconds" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.max_file_size", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MaxFileSize" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.baud_rate", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/BaudRate" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortName" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.use_mock", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/UseMock" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel.margin.content.current_theme", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content/CurrentTheme" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel.margin.content.reduced_effects", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content/ReducedEffects" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.package_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PackageStatus" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.path_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PathError" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalPath" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalEnabled" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel.margin.content.summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content/Summary" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_11" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.retention_days", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/RetentionDays" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_09" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_08" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_07" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_06" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_05" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_04" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_03" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_02" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_01" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.logging_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/LoggingError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_00" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/RecountButton" + }, + { + "Id": "settings.scroll.content", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content" + }, + { + "Id": "settings.scroll.content.section_tabs", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs" + }, + { + "Id": "settings.scroll.content.header.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header/Margin/Content/Title" + }, + { + "Id": "settings.scroll.content.header", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard" + }, + { + "Id": "settings.scroll", + "Types": [ + "ScrollContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseStatus" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/ManualAddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Error" + } + ] + } + ] +} diff --git a/themes/example/package/manifest.json b/themes/example/package/manifest.json new file mode 100644 index 0000000..154a1c3 --- /dev/null +++ b/themes/example/package/manifest.json @@ -0,0 +1,23 @@ +{ + "Format": "ExchangerThemeDlc", + "FormatVersion": 2, + "ThemeId": "example", + "DisplayName": "Пример темы", + "UiThemePath": "res://exchanger_theme_dlc/ui_theme.tres", + "BackgroundTexturePath": "", + "BackgroundDecorationPath": "", + "BackgroundDecorationScale": 1.0, + "ScreenScenes": { + "screen.home": "res://exchanger_theme_dlc/scenes/screen_home.tscn", + "screen.cash_payment": "res://exchanger_theme_dlc/scenes/screen_cash_payment.tscn", + "screen.card_amount": "res://exchanger_theme_dlc/scenes/screen_card_amount.tscn", + "screen.card_custom_amount": "res://exchanger_theme_dlc/scenes/screen_card_custom_amount.tscn", + "screen.card_terminal": "res://exchanger_theme_dlc/scenes/screen_card_terminal.tscn", + "screen.success": "res://exchanger_theme_dlc/scenes/screen_success.tscn", + "screen.error": "res://exchanger_theme_dlc/scenes/screen_error.tscn", + "screen.service_access": "res://exchanger_theme_dlc/scenes/screen_service_access.tscn", + "screen.settings": "res://exchanger_theme_dlc/scenes/screen_settings.tscn" + }, + "FallbackColor": "#101722", + "UseNearestTextureFilter": false +} diff --git a/themes/example/package/scenes/screen_card_amount.tscn b/themes/example/package/scenes/screen_card_amount.tscn new file mode 100644 index 0000000..a4a4780 --- /dev/null +++ b/themes/example/package/scenes/screen_card_amount.tscn @@ -0,0 +1,350 @@ +[gd_scene load_steps=6 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="2_footer"] + +[node name="ThemeScreen_CardAmount" type="Control"] +metadata/exchanger_screen_binding_id = "screen.card_amount" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_amount.content.top_bar.back_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_amount.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 88.0 +offset_top = 16.0 +offset_right = 140.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 148.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 + +[node name="RewardPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 110.0 +offset_right = 686.0 +offset_bottom = 250.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="Control" parent="SafeMargin/Content/RewardPanel"] +layout_mode = 2 + +[node name="Header" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 0 +offset_right = 652.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="Value" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +metadata/exchanger_binding_id = "card_amount.content.reward_panel.content.value" +layout_mode = 0 +offset_left = 20.0 +offset_top = 52.0 +offset_right = 310.0 +offset_bottom = 116.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 26 +text = "ВЫБЕРИТЕ СУММУ" +vertical_alignment = 1 + +[node name="Bonus" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +metadata/exchanger_binding_id = "card_amount.content.reward_panel.content.bonus" +layout_mode = 0 +offset_left = 326.0 +offset_top = 52.0 +offset_right = 632.0 +offset_bottom = 116.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 24 +text = "БЕЗ БОНУСА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AmountPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 274.0 +offset_right = 686.0 +offset_bottom = 828.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/AmountPanel"] +layout_mode = 2 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/AmountPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОПЛАТА" +vertical_alignment = 1 + +[node name="PresetGrid" type="GridContainer" parent="SafeMargin/Content/AmountPanel/Margin/Content"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid" +custom_minimum_size = Vector2(0, 350) +layout_mode = 2 +theme_override_constants/h_separation = 20 +theme_override_constants/v_separation = 14 +columns = 2 + +[node name="PresetSlot00" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_00" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "10 РУБ." + +[node name="PresetSlot01" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_01" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "50 РУБ." + +[node name="PresetSlot02" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_02" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "100 РУБ." + +[node name="PresetSlot03" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_03" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "150 РУБ." + +[node name="PresetSlot04" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_04" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "200 РУБ." + +[node name="PresetSlot05" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_05" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "300 РУБ." + +[node name="PresetSlot06" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_06" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "400 РУБ." + +[node name="PresetSlot07" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_07" +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "500 РУБ." + +[node name="PresetSlot08" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_08" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot09" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_09" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot10" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_10" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot11" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_11" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot12" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_12" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot13" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_13" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot14" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_14" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot15" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_15" +visible = false +custom_minimum_size = Vector2(292, 68) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + + +[node name="OtherAmountButton" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.other_amount_button" +custom_minimum_size = Vector2(340, 68) +layout_mode = 2 +size_flags_horizontal = 4 +theme_type_variation = &"CompactButton" +text = "ДРУГАЯ СУММА" + +[node name="ConfirmButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_amount.content.confirm_button" +layout_mode = 0 +offset_left = 34.0 +offset_top = 858.0 +offset_right = 686.0 +offset_bottom = 952.0 +theme_type_variation = &"PrimaryButton" +text = "ПОДТВЕРДИТЬ" +disabled = true + +[node name="SelectionLabel" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_amount.content.selection_label" +layout_mode = 0 +offset_left = 60.0 +offset_top = 974.0 +offset_right = 660.0 +offset_bottom = 1038.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 18 +text = "ВЫБЕРИТЕ СУММУ ДЛЯ ПЕРЕХОДА К ТЕРМИНАЛУ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("2_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_card_custom_amount.tscn b/themes/example/package/scenes/screen_card_custom_amount.tscn new file mode 100644 index 0000000..6d73d03 --- /dev/null +++ b/themes/example/package/scenes/screen_card_custom_amount.tscn @@ -0,0 +1,286 @@ +[gd_scene load_steps=6 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="2_footer"] + +[node name="ThemeScreen_CardCustomAmount" type="Control"] +metadata/exchanger_screen_binding_id = "screen.card_custom_amount" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_custom_amount.content.top_bar.back_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_custom_amount.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 88.0 +offset_top = 16.0 +offset_right = 140.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 148.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ДРУГАЯ СУММА" +horizontal_alignment = 1 + +[node name="AmountPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 70.0 +offset_top = 112.0 +offset_right = 650.0 +offset_bottom = 288.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/AmountPanel"] +layout_mode = 2 + +[node name="Values" type="Control" parent="SafeMargin/Content/AmountPanel/Margin"] +layout_mode = 2 + +[node name="Header" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 0 +offset_right = 580.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +metadata/exchanger_binding_id = "card_custom_amount.content.amount_panel.margin.values.amount" +layout_mode = 0 +offset_left = 16.0 +offset_top = 52.0 +offset_right = 270.0 +offset_bottom = 124.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 26 +text = "0 ЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Tokens" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +metadata/exchanger_binding_id = "card_custom_amount.content.amount_panel.margin.values.tokens" +layout_mode = 0 +offset_left = 286.0 +offset_top = 52.0 +offset_right = 560.0 +offset_bottom = 124.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 24 +text = "+ 50 ЖЕТОНОВ\nВ ПОДАРОК" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="KeypadPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 306.0 +offset_right = 686.0 +offset_bottom = 1074.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/KeypadPanel"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="SafeMargin/Content/KeypadPanel/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВВЕДИТЕ СУММУ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="InputValue" type="Label" parent="SafeMargin/Content/KeypadPanel/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.input_value" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 32 +text = "0" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="KeypadCenter" type="CenterContainer" parent="SafeMargin/Content/KeypadPanel/Content"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Keypad" type="GridContainer" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter"] +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="Digit1" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit1" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "1" +[node name="Digit2" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit2" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "2" +[node name="Digit3" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit3" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "3" +[node name="Digit4" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit4" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "4" +[node name="Digit5" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit5" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "5" +[node name="Digit6" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit6" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "6" +[node name="Digit7" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit7" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "7" +[node name="Digit8" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit8" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "8" +[node name="Digit9" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit9" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "9" + +[node name="ClearButton" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.clear_button" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +theme_override_font_sizes/font_size = 17 +text = "СТЕРЕТЬ" + +[node name="Digit0" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit0" +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "0" + +[node name="BackspaceButton" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.backspace_button" +visible = false +custom_minimum_size = Vector2(152, 152) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "⌫" + +[node name="ConfirmButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.confirm_button" +layout_mode = 0 +offset_left = 70.0 +offset_top = 1092.0 +offset_right = 650.0 +offset_bottom = 1178.0 +theme_type_variation = &"PrimaryButton" +text = "ПОДТВЕРДИТЬ" + +[node name="Hint" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.hint" +visible = false + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("2_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_card_terminal.tscn b/themes/example/package/scenes/screen_card_terminal.tscn new file mode 100644 index 0000000..2afd3e7 --- /dev/null +++ b/themes/example/package/scenes/screen_card_terminal.tscn @@ -0,0 +1,201 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] + +[node name="ThemeScreen_CardTerminal" type="Control"] +metadata/exchanger_screen_binding_id = "screen.card_terminal" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_terminal.content.top_bar.back_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_terminal.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 88.0 +offset_top = 16.0 +offset_right = 140.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 148.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 + +[node name="PaymentPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 112.0 +offset_top = 204.0 +offset_right = 608.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/PaymentPanel"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="SafeMargin/Content/PaymentPanel/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОПЛАТА" +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/PaymentPanel/Content"] +custom_minimum_size = Vector2(0, 520) +layout_mode = 2 +mouse_filter = 2 + +[node name="Instruction" type="Label" parent="SafeMargin/Content/PaymentPanel/Content/Body"] +layout_mode = 0 +offset_left = 26.0 +offset_top = 404.0 +offset_right = 426.0 +offset_bottom = 494.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 21 +text = "ПРИЛОЖИТЕ КАРТУ\nК ТЕРМИНАЛУ ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.amount" +layout_mode = 0 +offset_left = 110.0 +offset_top = 856.0 +offset_right = 610.0 +offset_bottom = 924.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 24 +text = "К ОПЛАТЕ: 0 ₽ • 0 ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Tokens" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.tokens" +visible = false + +[node name="CancelButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.cancel_button" +layout_mode = 0 +offset_left = 210.0 +offset_top = 946.0 +offset_right = 510.0 +offset_bottom = 1018.0 +theme_type_variation = &"CompactButton" +text = "ОТМЕНА" + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.countdown" +layout_mode = 0 +offset_left = 110.0 +offset_top = 1032.0 +offset_right = 610.0 +offset_bottom = 1082.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="DebugPanel" type="VBoxContainer" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel" +visible = false + +[node name="ApproveButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.approve_button" +text = "Одобрить" +[node name="DeclineButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.decline_button" +text = "Отклонить" +[node name="DispenseFailureButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.dispense_failure_button" +text = "Ошибка выдачи" +[node name="PartialDispenseButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.partial_dispense_button" +text = "Частичная выдача" +[node name="ConnectionLossButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.connection_loss_button" +text = "Потеря связи" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_cash_payment.tscn b/themes/example/package/scenes/screen_cash_payment.tscn new file mode 100644 index 0000000..1021aa6 --- /dev/null +++ b/themes/example/package/scenes/screen_cash_payment.tscn @@ -0,0 +1,291 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] + +[node name="ThemeScreen_CashPayment" type="Control"] +metadata/exchanger_screen_binding_id = "screen.cash_payment" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "cash_payment.content.top_bar.back_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "cash_payment.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 88.0 +offset_top = 16.0 +offset_right = 140.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/TopBar/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 20.0 +offset_top = 66.0 +offset_right = 84.0 +offset_bottom = 92.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 13 +text = "НАЗАД" +horizontal_alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 148.0 +offset_top = 20.0 +offset_right = 696.0 +offset_bottom = 80.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НАЛИЧНЫМИ" +horizontal_alignment = 1 + +[node name="CurrentBalancePanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 264.0 +offset_right = 360.0 +offset_bottom = 374.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/CurrentBalancePanel"] +layout_mode = 2 + +[node name="Caption" type="Label" parent="SafeMargin/Content/CurrentBalancePanel/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ТЕКУЩИЙ БАЛАНС" +vertical_alignment = 1 + +[node name="Summary" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 108.0 +offset_right = 686.0 +offset_bottom = 244.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/Summary"] +layout_mode = 2 + +[node name="Values" type="Control" parent="SafeMargin/Content/Summary/Margin"] +layout_mode = 2 + +[node name="Caption" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +layout_mode = 0 +offset_right = 652.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="Balance" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.balance" +layout_mode = 0 +offset_left = 16.0 +offset_top = 206.0 +offset_right = 310.0 +offset_bottom = 254.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "0 РУБЛЕЙ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Tokens" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.tokens" +layout_mode = 0 +offset_left = 20.0 +offset_top = 52.0 +offset_right = 310.0 +offset_bottom = 116.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 26 +text = "0 ЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Bonus" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.bonus" +layout_mode = 0 +offset_left = 326.0 +offset_top = 52.0 +offset_right = 632.0 +offset_bottom = 116.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 24 +text = "БЕЗ БОНУСА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="InstructionPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 394.0 +offset_right = 686.0 +offset_bottom = 880.0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/InstructionPanel"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Header" type="Label" parent="SafeMargin/Content/InstructionPanel/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "КАК ВНЕСТИ" +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/InstructionPanel/Content"] +custom_minimum_size = Vector2(0, 380) +layout_mode = 2 +mouse_filter = 2 + +[node name="BillText" type="Label" parent="SafeMargin/Content/InstructionPanel/Content/Body"] +layout_mode = 0 +offset_left = 206.0 +offset_top = 58.0 +offset_right = 566.0 +offset_bottom = 154.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +text = "ВСТАВЬТЕ КУПЮРЫ\nВ КУПЮРОПРИЁМНИК" +vertical_alignment = 1 + +[node name="CoinText" type="Label" parent="SafeMargin/Content/InstructionPanel/Content/Body"] +layout_mode = 0 +offset_left = 206.0 +offset_top = 224.0 +offset_right = 566.0 +offset_bottom = 326.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +text = "ИЛИ МОНЕТЫ\nВ МОНЕТОПРИЁМНИК" +vertical_alignment = 1 + +[node name="DispenseButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.dispense_button" +layout_mode = 0 +offset_left = 34.0 +offset_top = 900.0 +offset_right = 686.0 +offset_bottom = 980.0 +theme_type_variation = &"PrimaryButton" +text = "ВЫДАТЬ" + +[node name="Tip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 34.0 +offset_top = 994.0 +offset_right = 676.0 +offset_bottom = 1100.0 +mouse_filter = 2 + +[node name="TipText" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 270.0 +offset_top = 1010.0 +offset_right = 570.0 +offset_bottom = 1084.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 14 +text = "АВТОМАТ НЕ ВЫДАЁТ СДАЧУ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="BannerText" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.banner_text" +layout_mode = 0 +offset_left = 225.0 +offset_top = 1022.0 +offset_right = 660.0 +offset_bottom = 1092.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 18 +text = "АВТОМАТ НЕ ВЫДАЁТ СДАЧУ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="DebugPanel" type="HBoxContainer" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel" +visible = false + +[node name="Add10Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add10_button" +text = "+10 ₽" + +[node name="Add50Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add50_button" +text = "+50 ₽" + +[node name="Add100Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add100_button" +text = "+100 ₽" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_error.tscn b/themes/example/package/scenes/screen_error.tscn new file mode 100644 index 0000000..2e50452 --- /dev/null +++ b/themes/example/package/scenes/screen_error.tscn @@ -0,0 +1,137 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] + +[node name="ThemeScreen_Error" type="Control"] +metadata/exchanger_screen_binding_id = "screen.error" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.home_navigation_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="ScreenTitle" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НЕ ПРОШЛА" +horizontal_alignment = 1 + +[node name="ErrorPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/ErrorPanel"] +layout_mode = 2 + +[node name="Values" type="VBoxContainer" parent="SafeMargin/Content/ErrorPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="SafeMargin/Content/ErrorPanel/Margin/Values"] +metadata/exchanger_binding_id = "error.content.error_panel.margin.values.title" +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОШИБКА ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/ErrorPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 +mouse_filter = 2 + +[node name="Message" type="Label" parent="SafeMargin/Content/ErrorPanel/Margin/Values/Body"] +metadata/exchanger_binding_id = "error.content.error_panel.margin.values.body.message" +layout_mode = 0 +offset_left = 30.0 +offset_top = 410.0 +offset_right = 454.0 +offset_bottom = 506.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 22 +text = "ПОПРОБУЙТЕ ЕЩЁ РАЗ\nИЛИ ВЫБЕРИТЕ ДРУГОЙ СПОСОБ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.countdown" +visible = false +theme_type_variation = &"ErrorText" + +[node name="HomeButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.home_button" +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_home.tscn b/themes/example/package/scenes/screen_home.tscn new file mode 100644 index 0000000..f217dae --- /dev/null +++ b/themes/example/package/scenes/screen_home.tscn @@ -0,0 +1,415 @@ +[gd_scene load_steps=9 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] + +[node name="ThemeScreen_Home" type="Control"] +metadata/exchanger_screen_binding_id = "screen.home" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Scroll" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ThemeTop" type="Control" parent="SafeMargin/Scroll/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 200.0 +mouse_filter = 2 + +[node name="PricePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +layout_mode = 0 +offset_left = 148.0 +offset_top = 24.0 +offset_right = 398.0 +offset_bottom = 184.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PricePanel"] +layout_mode = 2 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PricePanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Caption" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content"] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ЦЕНА ЖЕТОНА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Price" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content"] +metadata/exchanger_binding_id = "home.scroll.content.price_panel.margin.content.price" +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 32 +text = "10 ₽" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SpeechText" type="Label" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "home.scroll.content.speech_text" +layout_mode = 0 +offset_left = 380.0 +offset_top = 42.0 +offset_right = 580.0 +offset_bottom = 110.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 12 +text = "ТЕКСТ КЛИЕНТА" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 +clip_text = true +max_lines_visible = 3 + +[node name="StockStatus" parent="SafeMargin/Scroll/Content" type="Control"] +metadata/exchanger_binding_id = "home.scroll.content.stock_status" +layout_mode = 0 +offset_left = 30.0 +offset_top = 206.0 +offset_right = 690.0 +offset_bottom = 340.0 + +[node name="StockPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content/StockStatus"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"StatusPanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel"] +layout_mode = 2 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ДОСТУПНО К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="StatusRow" type="CenterContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow"] +layout_mode = 2 +theme_override_constants/separation = 18 + +[node name="State" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row"] +metadata/exchanger_binding_id = "home.scroll.content.stock_status.state" +custom_minimum_size = Vector2(160, 48) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 25 +text = "МНОГО" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Meter" type="Control" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row"] +custom_minimum_size = Vector2(200, 32) +layout_mode = 2 +mouse_filter = 2 + +[node name="Background" type="ColorRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.13, 0.17, 0.24, 1) + +[node name="Empty" type="ColorRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 0.08 +anchor_bottom = 1.0 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.78, 0.18, 0.2, 1) +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.empty" + +[node name="Low" type="ColorRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 0.35 +anchor_bottom = 1.0 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.95, 0.62, 0.15, 1) +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.low" + +[node name="Enough" type="ColorRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 0.68 +anchor_bottom = 1.0 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.42, 0.86, 0.31, 1) +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.enough" + +[node name="Much" type="ColorRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.2, 0.78, 0.3, 1) +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.much" + +[node name="ApproximateCount" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row"] +metadata/exchanger_binding_id = "home.scroll.content.stock_status.approximate_count" +custom_minimum_size = Vector2(120, 48) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 25 +text = "<100" +horizontal_alignment = 0 +vertical_alignment = 1 + + +[node name="PaymentPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +layout_mode = 0 +offset_left = 30.0 +offset_top = 360.0 +offset_right = 690.0 +offset_bottom = 548.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PaymentPanel"] +layout_mode = 2 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВЫБЕРИТЕ СПОСОБ ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Buttons" type="HBoxContainer" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content"] +layout_mode = 2 +theme_override_constants/separation = 20 +alignment = 1 + +[node name="CashButton" type="Button" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "home.scroll.content.payment_panel.margin.content.buttons.cash_button" +custom_minimum_size = Vector2(280, 70) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "НАЛИЧНЫЕ" + +[node name="CardButton" type="Button" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "home.scroll.content.payment_panel.margin.content.buttons.card_button" +custom_minimum_size = Vector2(280, 70) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "БЕЗНАЛИЧНЫЕ" + +[node name="AdvertisementPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel" +layout_mode = 0 +offset_left = 62.0 +offset_top = 590.0 +offset_right = 658.0 +offset_bottom = 1120.0 +mouse_filter = 2 +theme_type_variation = &"AdvertisementPanel" + +[node name="Layer" type="Control" parent="SafeMargin/Scroll/Content/AdvertisementPanel"] +layout_mode = 2 +mouse_filter = 2 + +[node name="ThemeFrame" type="Control" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Content" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer" type="Control"] +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content" +layout_mode = 0 +offset_left = 112.0 +offset_top = 185.0 +offset_right = 484.0 +offset_bottom = 345.0 + +[node name="Poster" type="TextureRect" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content"] +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.poster" +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 6 + +[node name="VideoPlayer" type="VideoStreamPlayer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content"] +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.video_player" +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand = true +bus = &"Advertisement" + +[node name="FallbackLabel" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content"] +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.fallback_label" +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 20 +text = "ПРОМО-БЛОК" +horizontal_alignment = 1 +vertical_alignment = 1 + + +[node name="Footer" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +layout_mode = 0 +offset_top = 1198.0 +offset_right = 720.0 +offset_bottom = 1280.0 +theme_type_variation = &"FooterPanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/Footer"] +layout_mode = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/Footer/Margin"] +layout_mode = 2 + +[node name="Brand" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content"] +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.brand" +layout_mode = 0 +offset_left = 28.0 +offset_top = 8.0 +offset_right = 296.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 20 +text = "РАЗМЕН\nЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Support" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content"] +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.support" +layout_mode = 0 +offset_left = 310.0 +offset_top = 8.0 +offset_right = 692.0 +offset_bottom = 74.0 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 18 +text = "ТЕХПОДДЕРЖКА:\nТелефон поддержки уточняется" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="ConnectionStatus" parent="SafeMargin/Scroll/Content/Footer/Margin/Content" type="Control"] +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.connection_status" +layout_mode = 0 +offset_left = 110.0 +offset_top = -68.0 +offset_right = 610.0 +offset_bottom = -8.0 +visible = false + +[node name="Panel" type="PanelContainer" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"StatusPanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel"] +layout_mode = 2 +theme_override_constants/margin_left = 18 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 18 +theme_override_constants/margin_bottom = 10 + +[node name="Label" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin"] +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.connection_status.label" +layout_mode = 2 +theme_type_variation = &"StatusText" +theme_override_font_sizes/font_size = 18 +text = "СЕРВИС: НЕТ СВЯЗИ С КОНТРОЛЛЕРОМ" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/themes/example/package/scenes/screen_service_access.tscn b/themes/example/package/scenes/screen_service_access.tscn new file mode 100644 index 0000000..5c5ad24 --- /dev/null +++ b/themes/example/package/scenes/screen_service_access.tscn @@ -0,0 +1,252 @@ +[gd_scene load_steps=6 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="2_footer"] + +[node name="ThemeScreen_ServiceAccess" type="Control"] +metadata/exchanger_screen_binding_id = "screen.service_access" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.home_navigation_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="Header" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.header" +layout_mode = 0 +offset_left = 40.0 +offset_top = 18.0 +offset_right = 680.0 +offset_bottom = 72.0 +theme_type_variation = &"ScreenTitle" +theme_override_font_sizes/font_size = 34 +text = "ВХОД В НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.description" +layout_mode = 0 +offset_left = 52.0 +offset_top = 78.0 +offset_right = 668.0 +offset_bottom = 140.0 +theme_type_variation = &"ScreenDescription" +theme_override_font_sizes/font_size = 16 +text = "ВВЕДИТЕ PIN-КОД, ЧТОБЫ ОТКРЫТЬ НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="AccessPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 60.0 +offset_top = 152.0 +offset_right = 660.0 +offset_bottom = 916.0 +theme_type_variation = &"WhitePanel" + +[node name="Fields" type="VBoxContainer" parent="SafeMargin/Content/AccessPanel"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="PinLabel" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.pin_label" +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "PIN-КОД" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PinDisplay" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.pin_display" +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"StatusText" +theme_override_font_sizes/font_size = 34 +text = "—" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Status" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.status" +custom_minimum_size = Vector2(0, 38) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 17 +text = "ВВЕДИТЕ PIN-КОД" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="KeypadCenter" type="CenterContainer" parent="SafeMargin/Content/AccessPanel/Fields"] +custom_minimum_size = Vector2(0, 484) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Keypad" type="GridContainer" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter"] +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="Digit1" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit1" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "1" + +[node name="Digit2" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit2" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "2" + +[node name="Digit3" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit3" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "3" + +[node name="Digit4" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit4" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "4" + +[node name="Digit5" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit5" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "5" + +[node name="Digit6" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit6" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "6" + +[node name="Digit7" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit7" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "7" + +[node name="Digit8" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit8" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "8" + +[node name="Digit9" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit9" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "9" + +[node name="Clear" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.clear" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +theme_override_font_sizes/font_size = 16 +text = "СБРОС" + +[node name="Digit0" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit0" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "0" + +[node name="Erase" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.erase" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "⌫" + +[node name="EnterButton" type="Button" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.enter_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 30 +text = "ВОЙТИ" + +[node name="CancelButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.cancel_button" +layout_mode = 0 +offset_left = 110.0 +offset_top = 940.0 +offset_right = 610.0 +offset_bottom = 1026.0 +theme_type_variation = &"SecondaryButton" +text = "ОТМЕНА" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("2_footer")] +layout_mode = 1 diff --git a/themes/example/package/scenes/screen_settings.tscn b/themes/example/package/scenes/screen_settings.tscn new file mode 100644 index 0000000..f21e223 --- /dev/null +++ b/themes/example/package/scenes/screen_settings.tscn @@ -0,0 +1,3987 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/on_screen_keyboards.tscn" id="4_keyboards"] + +[node name="ThemeScreen_Settings" type="Control" unique_id=1004620256] +metadata/exchanger_screen_binding_id = "screen.settings" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="MarginContainer" parent="." unique_id=1771276379] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 28.0 +offset_top = 28.0 +offset_right = -28.0 +offset_bottom = -28.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Scroll" type="ScrollContainer" parent="SafeMargin" unique_id=1730433592] +metadata/exchanger_binding_id = "settings.scroll" +custom_minimum_size = Vector2(0, 1100) +layout_mode = 2 +size_flags_vertical = 0 +horizontal_scroll_mode = 0 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll" unique_id=1670934776] +metadata/exchanger_binding_id = "settings.scroll.content" +custom_minimum_size = Vector2(0, 1173) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 19 + +[node name="Header" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=154820359] +metadata/exchanger_binding_id = "settings.scroll.content.header" +custom_minimum_size = Vector2(0, 107) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/Header" unique_id=2033082988] +layout_mode = 2 +theme_override_constants/margin_left = 24 +theme_override_constants/margin_top = 19 +theme_override_constants/margin_right = 24 +theme_override_constants/margin_bottom = 19 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/Header/Margin" unique_id=1892810197] +layout_mode = 2 +theme_override_constants/separation = 8 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/Header/Margin/Content" unique_id=1212756635] +metadata/exchanger_binding_id = "settings.scroll.content.header.margin.content.title" +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 31 +text = "НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SectionTabs" type="GridContainer" parent="SafeMargin/Scroll/Content" unique_id=1099846765] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs" +custom_minimum_size = Vector2(0, 157) +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="GeneralButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=390094413] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.general_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОБЩИЕ" + +[node name="AudioButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1209434198] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.audio_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ЗВУК" + +[node name="AdvertisementButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=931340907] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.advertisement_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ПРОМО" + +[node name="AppearanceButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1803958748] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.appearance_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ТЕМА" + +[node name="PricingButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=2043412965] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.pricing_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ТАРИФЫ" + +[node name="PaymentButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=750238068] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.payment_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОПЛАТА" + +[node name="ServiceButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs"] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.service_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "СЕРВИС" + +[node name="EquipmentButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=436932014] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.equipment_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОБОРУД." + +[node name="DiagnosticsButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1314343470] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.diagnostics_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ДИАГНОСТ." + +[node name="BrandingPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2078006035] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel" +custom_minimum_size = Vector2(0, 439) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BrandingPanel" unique_id=1084754695] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin" unique_id=288780598] +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1441920640] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕКСТ НА ГЛАВНОМ ЭКРАНЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=314471939] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Здесь можно изменить свой текст для покупателей и контакты техподдержки." +autowrap_mode = 2 + +[node name="ApplicationNameLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1972340592] +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "НАЗВАНИЕ • ДО 48 ЗНАКОВ" + +[node name="ApplicationName" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=923442286] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.application_name" +visible = false +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "РАЗМЕН ЖЕТОНОВ" +max_length = 48 + +[node name="ApplicationNameError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=172647480] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.application_name_error" +visible = false +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="ShortTextLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ" + +[node name="ShortText" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.short_text" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "ТЕКСТ КЛИЕНТА" +max_length = 48 + +[node name="ShortTextError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.short_text_error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="SupportPhoneLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1058802895] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ТЕЛЕФОН ПОДДЕРЖКИ • ДО 80 ЗНАКОВ" + +[node name="SupportPhone" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1224448315] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.support_phone" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "+7 (000) 000-00-00" +max_length = 80 + +[node name="SupportPhoneError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=939950598] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.support_phone_error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AnimatedBannerTextsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.animated_banner_texts_panel" +custom_minimum_size = Vector2(0, 560) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕКСТЫ НА БАННЕРАХ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Тексты отображаются на нижних анимированных плашках с НЛО. В шаблоне таймера используйте {seconds} для числа секунд." +autowrap_mode = 2 + +[node name="CashPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "НАЛИЧНЫЕ • ТЕКСТ НА БАННЕРЕ" + +[node name="CashPayment" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardAmountLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ВЫБОР СУММЫ" + +[node name="CardAmount" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardCustomAmountLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ВВОД СУММЫ" + +[node name="CardCustomAmount" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardTerminalCountdownLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ТАЙМЕР • {seconds} = СЕКУНДЫ" + +[node name="CardTerminalCountdown" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="BrandingPreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=378115165] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel" +visible = false +custom_minimum_size = Vector2(0, 273) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel" unique_id=253672003] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin" unique_id=1113826782] +layout_mode = 2 +theme_override_constants/separation = 12 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=160381550] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "КАК ЭТО УВИДИТ ПОКУПАТЕЛЬ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ApplicationName" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=808413130] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.application_name" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "РАЗМЕН ЖЕТОНОВ" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="ShortText" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.short_text" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ТЕКСТ КЛИЕНТА" +horizontal_alignment = 1 +autowrap_mode = 2 +clip_text = true +max_lines_visible = 3 + +[node name="SupportPhone" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=85872323] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.support_phone" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ТЕХПОДДЕРЖКА • Телефон поддержки уточняется" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="SecurityPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1879849850] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel" +custom_minimum_size = Vector2(0, 313) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/SecurityPanel" unique_id=962456073] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin" unique_id=607567481] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=830468842] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЗАЩИТА НАСТРОЕК" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=1393678109] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Включите защиту, если хотите открывать настройки только по PIN-коду. Приложение предложит придумать его при следующем входе." +autowrap_mode = 2 + +[node name="Enabled" type="CheckButton" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=558474112] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.enabled" +custom_minimum_size = Vector2(0, 55) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ЗАЩИТИТЬ НАСТРОЙКИ PIN-КОДОМ" + +[node name="ResetPinButton" type="Button" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=1063988680] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.reset_pin_button" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ПРИДУМАТЬ НОВЫЙ PIN" + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=419034981] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.status" +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Защита выключена." +autowrap_mode = 2 + +[node name="MasterPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1198367056] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel" +custom_minimum_size = Vector2(0, 273) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/MasterPanel" unique_id=1657463854] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/MasterPanel/Margin" unique_id=1222038005] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=2077123349] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ОБЩАЯ ГРОМКОСТЬ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=1560394233] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Громкость всех звуков автомата." +autowrap_mode = 2 + +[node name="VolumeRow" type="HBoxContainer" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=150712937] +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Slider" type="HSlider" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow" unique_id=2060895330] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.volume_row.slider" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +size_flags_horizontal = 3 +value = 100.0 + +[node name="Value" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow" unique_id=2057703712] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.volume_row.value" +custom_minimum_size = Vector2(87, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Mute" type="CheckButton" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=1848500350] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.mute" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ОТКЛЮЧИТЬ ВСЕ ЗВУКИ" + +[node name="AdvertisementPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1140295799] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel" +custom_minimum_size = Vector2(0, 220) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel" unique_id=746826493] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin" unique_id=652964597] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=912048069] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ГРОМКОСТЬ ПРОМО-РОЛИКА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=1736411184] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Громкость звука в промо-роликах." +autowrap_mode = 2 + +[node name="VolumeRow" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=405566535] +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Slider" type="HSlider" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow" unique_id=530125674] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel.margin.content.volume_row.slider" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +size_flags_horizontal = 3 +value = 100.0 + +[node name="Value" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow" unique_id=2101989997] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel.margin.content.volume_row.value" +custom_minimum_size = Vector2(87, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="TestPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1383634412] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel" +custom_minimum_size = Vector2(0, 207) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/TestPanel" unique_id=130409172] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/TestPanel/Margin" unique_id=1257657298] +layout_mode = 2 +theme_override_constants/separation = 15 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=1433324321] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОВЕРКА" +vertical_alignment = 1 + +[node name="TestSoundButton" type="Button" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=1609783017] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel.margin.content.test_sound_button" +custom_minimum_size = Vector2(0, 75) +layout_mode = 2 +text = "ПРОВЕРИТЬ ЗВУК" + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=2061523529] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel.margin.content.status" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Настройки сохраняются автоматически." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="AdvertisementSettingsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=21455015] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel" +custom_minimum_size = Vector2(0, 440) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel" unique_id=1405250504] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin" unique_id=1013830763] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1786577231] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОМО НА ГЛАВНОМ ЭКРАНЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=336744550] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Во время оплаты и выдачи жетонов промо скрывается." +autowrap_mode = 2 + +[node name="Enabled" type="CheckButton" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1616831303] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПОКАЗЫВАТЬ ПРОМО" + +[node name="Muted" type="CheckButton" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=672717699] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.muted" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПРОМО-РОЛИК БЕЗ ЗВУКА" + +[node name="FallbackLabel" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1641720039] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ТЕКСТ ВМЕСТО ПРОМО • ДО 120 ЗНАКОВ" + +[node name="FallbackText" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=228850090] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_text" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "ПРОМО-БЛОК" +max_length = 120 + +[node name="FallbackError" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1143025908] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPosterPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=455807788] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel" +custom_minimum_size = Vector2(0, 370) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel" unique_id=1508974411] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin" unique_id=245064043] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=816209396] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "КАРТИНКА ВМЕСТО ПРОМО-РОЛИКА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=1218265445] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Укажите путь к картинке на этом компьютере. Подойдут PNG, JPG и WEBP." +autowrap_mode = 2 + +[node name="PosterPath" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=732541286] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.poster_path" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +placeholder_text = "Например: D:/Промо/постер.png" +max_length = 512 + +[node name="SelectButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.select_button" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ВЫБРАТЬ КАРТИНКУ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=2129938351] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.error" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPlaylistPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1828835854] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel" +custom_minimum_size = Vector2(0, 287) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel" unique_id=1696350498] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin" unique_id=50006063] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=483709700] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОМО-РОЛИКИ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1727337488] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Добавьте до 12 промо-роликов в нужном порядке. Поддерживаются файлы OGV." +autowrap_mode = 2 + +[node name="Rows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1297952818] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +text = "Промо-ролики пока не добавлены. Будет показана картинка или текст вместо промо." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1496917419] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.add_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +text = "ВЫБРАТЬ И ДОБАВИТЬ ПРОМО-РОЛИК" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1649782226] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=193189850] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_preview_panel" +visible = false +custom_minimum_size = Vector2(0, 167) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel" unique_id=923292165] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 20 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin" unique_id=617595689] +layout_mode = 2 +theme_override_constants/separation = 11 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content" unique_id=572843131] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ПРЕДВАРИТЕЛЬНЫЙ ИТОГ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Summary" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content" unique_id=1780700717] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_preview_panel.margin.content.summary" +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Промо включено • картинка не выбрана • промо-роликов: 0 +Текст вместо промо: ПРОМО-БЛОК" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="AppearanceThemePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1626819618] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel" +visible = false +custom_minimum_size = Vector2(0, 460) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceThemePanel" unique_id=1429095905] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin" unique_id=1782922611] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1789600456] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ВНЕШНЯЯ ТЕМА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1804153132] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Приложение всегда имеет одну встроенную тему. Единственный внешний DLC полностью заменит её после перезапуска, если пакет пройдёт проверку." +autowrap_mode = 2 + +[node name="ExternalEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1434776624] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.external_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ИСПОЛЬЗОВАТЬ ВНЕШНИЙ DLC" + +[node name="PathLabel" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1039205902] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ПУТЬ К ПАКЕТУ .PCK" + +[node name="ExternalPath" type="LineEdit" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=435170720] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.external_path" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +placeholder_text = "user://theme_dlc/active_theme.pck" +max_length = 512 + +[node name="PathError" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=538466093] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.path_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="PackageStatus" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1243517659] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.package_status" +custom_minimum_size = Vector2(0, 52) +layout_mode = 2 +theme_override_font_sizes/font_size = 14 +text = "Пакет будет проверен при запуске." +autowrap_mode = 2 + +[node name="AppearanceEffectsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2118148985] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_effects_panel" +visible = false +custom_minimum_size = Vector2(0, 260) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel" unique_id=1463853577] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin" unique_id=460821403] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=1219490666] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЭФФЕКТЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=1195218204] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Облегчённый режим отключает необязательные анимированные спрайты, но сохраняет статический фон и весь интерфейс." +autowrap_mode = 2 + +[node name="ReducedEffects" type="CheckButton" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=336415120] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_effects_panel.margin.content.reduced_effects" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ОБЛЕГЧЁННЫЙ РЕЖИМ" + +[node name="AppearanceNoticePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=391044970] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_notice_panel" +visible = false +custom_minimum_size = Vector2(0, 220) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel" unique_id=716854481] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 20 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin" unique_id=400003096] +layout_mode = 2 +theme_override_constants/separation = 12 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=1138899540] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПРИМЕНЕНИЕ ИЗМЕНЕНИЙ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Immediate" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=263463990] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Облегчённый режим применяется сразу." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="Restart" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=1044968640] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.78, 0.25, 1) +theme_override_font_sizes/font_size = 15 +text = "Включение DLC и путь к нему применятся только после перезапуска приложения." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="CurrentTheme" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=869113996] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_notice_panel.margin.content.current_theme" +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Сейчас активна встроенная тема." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="PricePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1175190762] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel" +visible = false +custom_minimum_size = Vector2(0, 247) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PricePanel" unique_id=1252255186] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PricePanel/Margin" unique_id=37103992] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=1223521084] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СТОИМОСТЬ ОДНОГО ЖЕТОНА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=442890264] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "По этой цене автомат рассчитывает, сколько жетонов получит покупатель." +autowrap_mode = 2 + +[node name="Price" type="SpinBox" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=906569844] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel.margin.content.price" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +max_value = 100000.0 +value = 10.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=1786171896] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="BonusPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1271515153] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel" +visible = false +custom_minimum_size = Vector2(0, 347) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BonusPanel" unique_id=1639657177] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin" unique_id=452757233] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=176636309] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ДОПОЛНИТЕЛЬНЫЕ ЖЕТОНЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=2054989766] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Например: при оплате от 500 ₽ подарить 5 жетонов. Если подходят несколько правил, сработает самое выгодное." +autowrap_mode = 2 + +[node name="ColumnHeaders" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1779316545] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +theme_override_constants/separation = 11 + +[node name="Threshold" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=1516500981] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 13 +text = "СУММА ОПЛАТЫ ОТ" + +[node name="Bonus" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=730440012] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +theme_override_font_sizes/font_size = 13 +text = "ЖЕТОНОВ В ПОДАРОК" + +[node name="Spacer" type="Control" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=293311810] +custom_minimum_size = Vector2(103, 0) +layout_mode = 2 + +[node name="Rows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1591524546] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows" +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.empty_state" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +text = "Бонусы пока не настроены." +vertical_alignment = 1 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot12" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot13" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot14" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot15" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddRuleButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1425772859] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.add_rule_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +text = "+ ДОБАВИТЬ БОНУС" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=397393203] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="PreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1550161471] +metadata/exchanger_binding_id = "settings.scroll.content.preview_panel" +visible = false +custom_minimum_size = Vector2(0, 247) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PreviewPanel" unique_id=1017412349] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin" unique_id=1259875287] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1565228186] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРИМЕР РАСЧЁТА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1558111681] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Столько жетонов получит покупатель при разных суммах оплаты." +autowrap_mode = 2 + +[node name="Values" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1890400642] +metadata/exchanger_binding_id = "settings.scroll.content.preview_panel.margin.content.values" +custom_minimum_size = Vector2(0, 140) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "10 ₽ → 1 + 0 = 1 жет." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="PaymentMethodsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1014677861] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel" +visible = false +custom_minimum_size = Vector2(0, 260) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel" unique_id=1681526059] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin" unique_id=1821598693] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=1268252060] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СПОСОБЫ ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=71570643] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Оставьте хотя бы один доступный способ оплаты." +autowrap_mode = 2 + +[node name="CashEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=1651424955] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.cash_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "НАЛИЧНАЯ ОПЛАТА" + +[node name="CardEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=60921604] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.card_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "ОПЛАТА КАРТОЙ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=614267083] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="CardOptionsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1947991433] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel" +visible = false +custom_minimum_size = Vector2(0, 393) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel" unique_id=1880854225] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin" unique_id=1861346620] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1252395405] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СУММЫ ДЛЯ ОПЛАТЫ КАРТОЙ" +vertical_alignment = 1 + +[node name="Limits" type="GridContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=796782793] +layout_mode = 2 +theme_override_constants/h_separation = 13 +theme_override_constants/v_separation = 9 +columns = 2 + +[node name="MaxLabel" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=1157864144] +custom_minimum_size = Vector2(240, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "МАКСИМАЛЬНАЯ СУММА" +vertical_alignment = 1 + +[node name="MaxAmount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=945870327] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits.max_amount" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +value = 5000.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="StepLabel" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=117453909] +custom_minimum_size = Vector2(240, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ШАГ ВЫБОРА СУММЫ" +vertical_alignment = 1 + +[node name="CustomStep" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=2056772758] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits.custom_step" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +value = 10.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="LimitsError" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1784116878] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="PresetsTitle" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=3400869] +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "ГОТОВЫЕ СУММЫ" + +[node name="PresetRows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=783857380] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows" +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state" +visible = false +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +text = "Готовые суммы пока не добавлены. Покупатель сможет ввести сумму сам." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 10.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 50.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 100.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 150.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 200.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 300.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 400.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 500.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot12" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot13" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot14" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot15" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddPresetButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1011694991] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.add_preset_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +text = "+ ДОБАВИТЬ СУММУ" + +[node name="PresetsError" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1336764151] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.presets_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="TimeoutsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=225381422] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel" +visible = false +custom_minimum_size = Vector2(0, 380) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel" unique_id=1678816813] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin" unique_id=2108046571] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=423508686] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ВРЕМЯ ОЖИДАНИЯ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=844982832] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Настройте, сколько времени автомат ждёт действий покупателя." +autowrap_mode = 2 + +[node name="Grid" type="GridContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=987524088] +layout_mode = 2 +theme_override_constants/h_separation = 13 +theme_override_constants/v_separation = 9 +columns = 2 + +[node name="IdleLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1311503414] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ВОЗВРАТ НА ГЛАВНЫЙ (15–600 С)" +vertical_alignment = 1 + +[node name="Idle" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=396087782] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.idle" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 45.0 +update_on_text_changed = true +suffix = " с" + +[node name="CashPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=254111291] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ОПЛАТА НАЛИЧНЫМИ (15–600 С)" +vertical_alignment = 1 + +[node name="CashPayment" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=800168430] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.cash_payment" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 45.0 +update_on_text_changed = true +suffix = " с" + +[node name="CashlessPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid"] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "БЕЗНАЛИЧНАЯ ОПЛАТА (30–600 С)" +vertical_alignment = 1 + +[node name="CashlessPayment" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid"] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.cashless_payment" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 120.0 +update_on_text_changed = true +suffix = " с" + +[node name="SuccessLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1606719904] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ПОКАЗЫВАТЬ РЕЗУЛЬТАТ (3–60 С)" +vertical_alignment = 1 + +[node name="Success" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1946483701] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.success" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 60.0 +value = 10.0 +update_on_text_changed = true +suffix = " с" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=53635746] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.error" +custom_minimum_size = Vector2(0, 53) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="EquipmentConnectionPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=12227059] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel" +visible = false +custom_minimum_size = Vector2(0, 607) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel" unique_id=1058768579] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin" unique_id=1950970524] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=608936661] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПОДКЛЮЧЕНИЕ К КОНТРОЛЛЕРУ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=735739671] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Только для инженера. Изменения применяются после перезапуска и никогда не выполняют reconnect во время открытой операции." +autowrap_mode = 2 + +[node name="UseMock" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1144904040] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.use_mock" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +text = "ИСПОЛЬЗОВАТЬ ИМИТАЦИЮ ОБОРУДОВАНИЯ" + +[node name="PortLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1595492564] +layout_mode = 2 +text = "COM-ПОРТ" + +[node name="PortName" type="LineEdit" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1760832797] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.port_name" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +placeholder_text = "COM3" +max_length = 16 + +[node name="PortError" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=993828178] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.port_error" +custom_minimum_size = Vector2(0, 37) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="BaudLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1392931961] +layout_mode = 2 +text = "СКОРОСТЬ ПОРТА" + +[node name="BaudRate" type="OptionButton" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=810177550] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.baud_rate" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="ReconnectLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1591920916] +layout_mode = 2 +text = "ПОВТОР ПОДКЛЮЧЕНИЯ (1–60 С)" + +[node name="ReconnectSeconds" type="SpinBox" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=175154894] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.reconnect_seconds" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +max_value = 60.0 +value = 5.0 +update_on_text_changed = true +suffix = " с" + +[node name="ConnectionError" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=242906874] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.connection_error" +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="EquipmentWindowPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1569238897] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel" +visible = false +custom_minimum_size = Vector2(0, 433) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel" unique_id=1468236776] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin" unique_id=660658614] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1729915087] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ОКНО И ПРОИЗВОДИТЕЛЬНОСТЬ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1381667443] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Инженерные restart-only параметры. Размер debug-окна и низкоуровневые параметры протокола намеренно не редактируются здесь." +autowrap_mode = 2 + +[node name="Fullscreen" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=859230815] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.fullscreen" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "ПОЛНОЭКРАННЫЙ РЕЖИМ" + +[node name="Borderless" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=445076357] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.borderless" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "ОКНО БЕЗ РАМКИ" + +[node name="DebugWindow" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1119698600] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.debug_window" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "DEBUG-СБОРКА ЗАПУСКАЕТСЯ В ОКНЕ" + +[node name="FpsLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=67242259] +layout_mode = 2 +text = "ЦЕЛЕВОЙ FPS" + +[node name="TargetFps" type="OptionButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=48472713] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.target_fps" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="EquipmentNotice" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1717442777] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.72, 0.2, 1) +theme_override_font_sizes/font_size = 15 +text = "AES-ключ, режим шифрования, команды выдачи, framing и параметры датчика не показываются и не сохраняются через этот экран." +autowrap_mode = 2 + +[node name="DiagnosticsStatusPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=63855322] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel" +visible = false +custom_minimum_size = Vector2(0, 400) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel" unique_id=363101112] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin" unique_id=1447109247] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1149194245] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СОСТОЯНИЕ ПРИЛОЖЕНИЯ" +vertical_alignment = 1 + +[node name="RuntimeSummary" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1086182449] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel.margin.content.runtime_summary" +custom_minimum_size = Vector2(0, 120) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Версия и состояние загружаются при открытии." +autowrap_mode = 2 + +[node name="RecentErrorsTitle" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1121096725] +layout_mode = 2 +text = "ПОСЛЕДНИЕ БЕЗОПАСНЫЕ ПРЕДУПРЕЖДЕНИЯ" + +[node name="RecentErrors" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=601475052] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel.margin.content.recent_errors" +custom_minimum_size = Vector2(0, 147) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Нет предупреждений." +autowrap_mode = 2 + +[node name="DiagnosticsLoggingPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=246114907] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel" +visible = false +custom_minimum_size = Vector2(0, 467) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel" unique_id=618088528] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin" unique_id=1603972519] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=728718139] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЖУРНАЛИРОВАНИЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1279998568] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Изменения применяются сразу. Общий объём архивов автоматически ограничен десятью максимальными файлами. Сырые кадры протокола недоступны." +autowrap_mode = 2 + +[node name="LevelLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1684427359] +layout_mode = 2 +text = "МИНИМАЛЬНЫЙ УРОВЕНЬ" + +[node name="MinimumLevel" type="OptionButton" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1516855564] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.minimum_level" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="SizeLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1036811316] +layout_mode = 2 +text = "МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛА (1–100 МБ)" + +[node name="MaxFileSize" type="SpinBox" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=379652985] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.max_file_size" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +value = 5.0 +update_on_text_changed = true +suffix = " МБ" + +[node name="RetentionLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1113473421] +layout_mode = 2 +text = "СРОК ХРАНЕНИЯ (1–365 ДНЕЙ)" + +[node name="RetentionDays" type="SpinBox" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1996036056] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.retention_days" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +max_value = 365.0 +value = 14.0 +update_on_text_changed = true +suffix = " дн." + +[node name="LoggingError" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=722071223] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.logging_error" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="ServiceInventoryPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel" +visible = false +custom_minimum_size = Vector2(0, 772) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "УЧЁТ ЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.description" +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Здесь можно пересчитать жетоны в хоппере или добавить уже пересчитанные вручную." +autowrap_mode = 2 + +[node name="InventoryAccountingEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ" + +[node name="PurchaseLimitEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА" + +[node name="Count" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.count" +custom_minimum_size = Vector2(0, 68) +layout_mode = 2 +theme_override_font_sizes/font_size = 25 +text = "УЧТЁННЫЙ ОСТАТОК: 0 ЖЕТОНОВ" +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Hopper1Label" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label" +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "ХОППЕР 1 — ОСТАТОК: 0 ЖЕТОНОВ" + +[node name="Hopper1" type="HBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +layout_mode = 2 +theme_override_constants/separation = 14 + +[node name="RecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1.recount_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ПЕРЕСЧИТАТЬ" + +[node name="ManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1.manual_add_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ДОБАВИТЬ" + +[node name="Hopper2Label" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label" +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "ХОППЕР 2 — ОСТАТОК: 0 ЖЕТОНОВ" + +[node name="Hopper2" type="HBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +layout_mode = 2 +theme_override_constants/separation = 14 + +[node name="RecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2.recount_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ПЕРЕСЧИТАТЬ" + +[node name="ManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2.manual_add_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ДОБАВИТЬ" + +[node name="LegacyRecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +visible = false +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.recount_button" +layout_mode = 2 + +[node name="LegacyManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +visible = false +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button" +layout_mode = 2 + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.status" +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Остаток ещё не заполнен." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="MenuVisibilityPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel" +visible = false +custom_minimum_size = Vector2(0, 360) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СКРЫТИЕ ЭЛЕМЕНТОВ МЕНЮ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Выберите, какие необязательные элементы показывать на главном экране." +autowrap_mode = 2 + +[node name="ShowStockStatus" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ОСТАТОК ЖЕТОНОВ" + +[node name="ShowRightCharacter" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ ТЕКСТ" + +[node name="ShowPromotionBlock" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ПРОМО-БЛОК" + +[node name="ShowInteractivePet" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ИНТЕРАКТИВНЫЙ ПИТОМЕЦ" + +[node name="DiagnosticsTestPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2121165678] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel" +visible = false +custom_minimum_size = Vector2(0, 287) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel" unique_id=1592965841] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin" unique_id=1036673328] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=1717665009] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕСТОВАЯ ВЫДАЧА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=537707851] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Выдаёт один жетон без оплаты. Требует готового контроллера и повторного подтверждения кнопкой." +autowrap_mode = 2 + +[node name="TestDispenseButton" type="Button" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=263785982] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +text = "ТЕСТ: ВЫДАТЬ 1 ЖЕТОН" + +[node name="TestDispenseStatus" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=2115719528] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_status" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Тест не запущен." +autowrap_mode = 2 + +[node name="FooterClearance" type="Control" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.footer_clearance" +custom_minimum_size = Vector2(0, 124) +layout_mode = 2 +mouse_filter = 2 + +[node name="ServiceDialogOverlay" type="ColorRect" parent="SafeMargin"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay" +visible = false +z_index = 20 +layout_mode = 2 +mouse_filter = 0 +color = Color(0, 0, 0, 0.72) + +[node name="Dialog" type="PanelContainer" parent="SafeMargin/ServiceDialogOverlay"] +custom_minimum_size = Vector2(600, 460) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -300.0 +offset_top = -230.0 +offset_right = 300.0 +offset_bottom = 230.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog"] +layout_mode = 2 +theme_override_constants/margin_left = 28 +theme_override_constants/margin_top = 28 +theme_override_constants/margin_right = 28 +theme_override_constants/margin_bottom = 28 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="Title" type="Label" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.title" +custom_minimum_size = Vector2(0, 58) +layout_mode = 2 +theme_override_font_sizes/font_size = 27 +text = "ДОБАВИТЬ ЖЕТОНЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.description" +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Введите количество жетонов. Перед добавлением приложение попросит подтвердить число." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Amount" type="SpinBox" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.amount" +custom_minimum_size = Vector2(0, 72) +layout_mode = 2 +max_value = 999999.0 +update_on_text_changed = true + +[node name="Buttons" type="HBoxContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="CancelButton" type="Button" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 17 +text = "ОТМЕНА" + +[node name="ConfirmButton" type="Button" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 17 +text = "ПОДТВЕРДИТЬ" + +[node name="Footer" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.footer" +z_index = 5 +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 28.0 +offset_top = -132.0 +offset_right = -28.0 +offset_bottom = -28.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_type_variation = &"FooterPanel" + +[node name="SaveAndExitButton" type="Button" parent="Footer"] +metadata/exchanger_binding_id = "settings.footer.save_and_exit_button" +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 14.0 +offset_top = 10.0 +offset_right = -14.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 25 +text = "СОХРАНИТЬ И ВЫЙТИ" + +[node name="OnScreenKeyboardOverlay" parent="." instance=ExtResource("4_keyboards")] diff --git a/themes/example/package/scenes/screen_success.tscn b/themes/example/package/scenes/screen_success.tscn new file mode 100644 index 0000000..e8a0d43 --- /dev/null +++ b/themes/example/package/scenes/screen_success.tscn @@ -0,0 +1,135 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_ui_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="1_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="1_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] + +[node name="ThemeScreen_Success" type="Control"] +metadata/exchanger_screen_binding_id = "screen.success" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ui_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("1_decoration")] + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.home_navigation_button" +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 76.0 +offset_bottom = 68.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" + +[node name="House" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(8, 27, 26, 27, 17, 13) +color = Color(1, 1, 1, 1) + +[node name="HouseBody" type="Polygon2D" parent="SafeMargin/Content/HomeNavigationButton"] +polygon = PackedVector2Array(11, 26, 23, 26, 23, 40, 18, 40, 18, 32, 16, 32, 16, 40, 11, 40) +color = Color(1, 1, 1, 1) + +[node name="ScreenTitle" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА ПРОШЛА" +horizontal_alignment = 1 + +[node name="ResultPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/ResultPanel"] +layout_mode = 2 + +[node name="Values" type="VBoxContainer" parent="SafeMargin/Content/ResultPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="SafeMargin/Content/ResultPanel/Margin/Values"] +metadata/exchanger_binding_id = "success.content.result_panel.margin.values.title" +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВЫДАЧА ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/ResultPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 +mouse_filter = 2 + +[node name="Message" type="Label" parent="SafeMargin/Content/ResultPanel/Margin/Values/Body"] +metadata/exchanger_binding_id = "success.content.result_panel.margin.values.body.message" +layout_mode = 0 +offset_left = 28.0 +offset_top = 418.0 +offset_right = 456.0 +offset_bottom = 504.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 23 +text = "ЗАБЕРИТЕ ЖЕТОНЫ\nСПАСИБО ЗА ПОКУПКУ!" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.countdown" +visible = false + +[node name="HomeButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.home_button" +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/example/package/scripts/decoration_controller.gd b/themes/example/package/scripts/decoration_controller.gd new file mode 100644 index 0000000..d79be42 --- /dev/null +++ b/themes/example/package/scripts/decoration_controller.gd @@ -0,0 +1,20 @@ +extends Node2D + +## Пример runtime-скрипта доверенной темы. Он прикреплён к общей decoration-сцене, +## но выключен по умолчанию, чтобы шаблон оставался визуально нейтральным. +@export var animation_enabled := false +@export_range(0.0, 200.0, 0.5) var vertical_amplitude := 12.0 +@export_range(0.01, 10.0, 0.01) var cycles_per_second := 0.25 + +var _origin := Vector2.ZERO +var _phase := 0.0 + + +func _ready() -> void: + _origin = position + set_process(animation_enabled) + + +func _process(delta: float) -> void: + _phase = fmod(_phase + delta * cycles_per_second, 1.0) + position = _origin + Vector2(0.0, sin(_phase * TAU) * vertical_amplitude) diff --git a/themes/example/package/scripts/decoration_controller.gd.uid b/themes/example/package/scripts/decoration_controller.gd.uid new file mode 100644 index 0000000..b992b70 --- /dev/null +++ b/themes/example/package/scripts/decoration_controller.gd.uid @@ -0,0 +1 @@ +uid://c3351q5vojmpt diff --git a/themes/example/package/ui_theme.tres b/themes/example/package/ui_theme.tres new file mode 100644 index 0000000..81aa911 --- /dev/null +++ b/themes/example/package/ui_theme.tres @@ -0,0 +1,59 @@ +[gd_resource type="Theme" load_steps=3 format=3] + +[sub_resource type="StyleBoxFlat" id="Panel"] +content_margin_left = 24.0 +content_margin_top = 24.0 +content_margin_right = 24.0 +content_margin_bottom = 24.0 +bg_color = Color(0.96, 0.97, 0.99, 1) +corner_radius_top_left = 18 +corner_radius_top_right = 18 +corner_radius_bottom_right = 18 +corner_radius_bottom_left = 18 + +[sub_resource type="StyleBoxFlat" id="Button"] +content_margin_left = 20.0 +content_margin_top = 16.0 +content_margin_right = 20.0 +content_margin_bottom = 16.0 +bg_color = Color(0.2, 0.64, 0.36, 1) +corner_radius_top_left = 14 +corner_radius_top_right = 14 +corner_radius_bottom_right = 14 +corner_radius_bottom_left = 14 + +[resource] +default_font_size = 24 +AdvertisementPanel/base_type = &"PanelContainer" +BackButton/base_type = &"Button" +Label/colors/font_color = Color(0.06, 0.1, 0.16, 1) +Button/colors/font_color = Color(1, 1, 1, 1) +Button/styles/normal = SubResource("Button") +Button/styles/hover = SubResource("Button") +Button/styles/pressed = SubResource("Button") +PanelContainer/styles/panel = SubResource("Panel") +CompactButton/base_type = &"Button" +KeyboardActionButton/base_type = &"Button" +KeyboardActionButton/font_sizes/font_size = 22 +KeypadButton/base_type = &"Button" +DangerButton/base_type = &"Button" +ErrorText/base_type = &"Label" +ErrorText/colors/font_color = Color(0.75, 0.12, 0.16, 1) +FieldLabel/base_type = &"Label" +FooterPanel/base_type = &"PanelContainer" +PanelText/base_type = &"Label" +PanelTitle/base_type = &"Label" +PrimaryButton/base_type = &"Button" +ScreenDescription/base_type = &"Label" +ScreenDescription/colors/font_color = Color(1, 1, 1, 1) +ScreenTitle/base_type = &"Label" +ScreenTitle/colors/font_color = Color(1, 1, 1, 1) +SecondaryButton/base_type = &"Button" +SectionTabButton/base_type = &"Button" +StatusPanel/base_type = &"PanelContainer" +StatusText/base_type = &"Label" +SupportText/base_type = &"Label" +SupportText/colors/font_color = Color(1, 1, 1, 1) +WarningText/base_type = &"Label" +WarningText/colors/font_color = Color(0.82, 0.5, 0.08, 1) +WhitePanel/base_type = &"PanelContainer" diff --git a/themes/example/source/README.md b/themes/example/source/README.md new file mode 100644 index 0000000..714250a --- /dev/null +++ b/themes/example/source/README.md @@ -0,0 +1,4 @@ +# Исходные материалы + +Храните здесь изображения в исходном качестве, исходники анимаций, шрифты и их лицензии. +Локальные фото и видео для визуального сравнения помещайте в `references/`. diff --git a/themes/example/source/interactive_pet/README.md b/themes/example/source/interactive_pet/README.md new file mode 100644 index 0000000..11325ae --- /dev/null +++ b/themes/example/source/interactive_pet/README.md @@ -0,0 +1,24 @@ +# Шаблон логики интерактивного питомца + +Production-компонент питомца создаётся в `package/components/interactive_pet.tscn`, а его +GDScript и ресурсы остаются внутри `package/`. Поле `InteractivePetScene` в manifest должно +ссылаться на эту сцену через канонический namespace `res://exchanger_theme_dlc/`. + +Пошаговая раскадровка, структура `VisualRoot`, политики движения и checklist дизайнера описаны в +[`docs/COMPOSITE_PET_ANIMATIONS.md`](../../../../docs/COMPOSITE_PET_ANIMATIONS.md). + +Сначала реализуйте обязательный animation API из `docs/SCRIPTING.md`. Если уникальное действие +состоит из нескольких анимаций и перемещений, реализуйте весь optional composite API целиком: +`has_pet_composite_action`, `start_pet_composite_action`, `cancel_pet_composite_action` и два +сигнала `pet_composite_action_started` / `pet_composite_action_finished`. Частичная реализация +считается ошибкой валидатора. + +Сценарий работает как корутина темы. Host передаёт scoped runtime: через него тема временно +приостанавливает обычную навигацию, разрешает выход за границы, игнорирует опоры, перемещает +экранную опорную точку и затем явно возвращает её на объявленную поверхность. Перед каждым +`await` проверяйте `runtime.IsActive()` и run id. При отмене немедленно прекращайте корутину, +возвращайте локальный scale/визуальные состояния и не управляйте старым runtime. + +После реализации активируйте тему и откройте `PET` в preview. Обычные кнопки проверяют каждый +клип отдельно, а «СОСТАВНОЕ ДЕЙСТВИЕ: INTERACT» — полный сценарий с проходом через границу и +посадкой на верхнюю тестовую опору. diff --git a/themes/space-pixel/package/assets/animations/alien_pet/action.png b/themes/space-pixel/package/assets/animations/alien_pet/action.png new file mode 100644 index 0000000000000000000000000000000000000000..2c25f30fd83a9014b60080c132ffa755f2f70225 GIT binary patch literal 19112 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∾e7Z(!oA$Ii&0_z@OBtg5qdUPLP3cOs! z$9bn6pJ*P}-LTpHas?j2K0?PpT2*$sl;IMUt77xFr9bV-ZrHM>Z`UNoWKh=j!79OH z2vgc`QgmQx!gvFgq9$N!g7*n**v2|4adaxlbR67YaBt))i)}aEzcSVz*pi#UM#psU z%f(prpEupM-HMi)TH@yjQKgF#Uh?LaUQ}NsvfzM>Dj*6;V*9)PdJ_YvJyxtk^y@VU8tY5 z25pz|QPZk9m$q|a3>|lEC`rcGzYM1zuLL;3mkxMpyLFi=uu~og#c2SxAFdh#A${D7 zy8XwJEyo)cIKUiUKh+X~e|ia>&=CW+uR!1!dslJj{O)YI*;-Ila%}LH6x)tnpk24i zK!5WX4L#hHIPUK^r~HZM8VHwcTYY#Erx*uzU<*2Vfs|O~L5fagZPM`!)zcq;yqMUD zE9Eiz%s^#D7jAr-1(UFmJ_YL;^}*|@BwFlRNgp>zShbtLb!5EVz4vkOige(dV{GO* z>&M{Tzw?Tl-#_jHrY>x~YEucQQKQ3pq<7_PZT9R*Mn^al__9QZH=B~abBtK7e}WPF zbX|`kPaNa=dE+K3>(8c9#R%{wJPZz@e9;+)eX2+3(9>pT$HaYM1JU=wqN!9?Aka?YCIZp+7DS*&!by?j*ga3-a@%1ghe{LdOUir zQKskyhPUs=``LY1!gKsgI_rf2=-9U|EQQOewHUV|lNCyO!I`>GYEnfiOG1_G389yN zmxNL^;+TL8ZN}=CKL}PY?F9YWi%C|Ru#QYH)dF@AyT1USJdzYvGClvhDs)Yk#0WUt zPn>F`(TNHhn=#Dfm+_oz1Kq9bywX9R6N_t!j3~F-+yh+_zY`=^bLh3>>q#S)?2B3} z;v=Ql<}Jb(P>J(F=HA)M(Bin&le&xpWy7gyDs_;YQU=ytzjIB4-eRm8!a0UNIG{F& z2HRHjvZ0NZ(CLkrQkteAGZ?R;@P(4KK*U;CY}8r)YNcO^ozO?y+rk=N;K3X2b(J97wol7SblnBeKF=!@**1s~&o^li zdX6a!$zz19H+aOUqEQQ9QH+QGnK|>CqrgV&OVG+Id=)=Lu-j;)mcKe6fFsy72K|~Q z;B8JC0|4C$eaT>5F+8L`uVTbc=FmX6U)zA}ASFAiq4S$GhR|qJ`hyq$i#w3EaffiQ zA+X3H9Q1@Y^EJ)?kBurgFl^s-??4XbgwZ>ZogxS6doENz#&lElT-5($5n1)(92mYE z(v#sE(zEMQwF}6PR>wLgf=6$L=}8nGWpyrs83KvhRqCCPc#mi;htpr9a z7=mB3lqj#6JVBsze^(P_!~dZe$kU7gQk1;b3*^j$52q%rjf$Urv|;7=B}{0Fw>S_} zSm1`?C%B@u>@#j)QA5KgFG~hGjOfMLy>O(eocLwkz?W5Ri&YjMBpS?Er>LNszK zh1?Hc9qj#G%tdSVO!5O6oWR@E0Vlh*ARJ;UnnR=Ncc-lE+ZA*REsgak11^CZiwipd z;EqF`I03k$Ux+dCP9#D&K#$+2v_A$km==q|4$&rlN4-QXder;>`6{uYfI=711~fmT R?O&h*pj!Hu5EpD8{y(s3_7wmC literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/action.png.import b/themes/space-pixel/package/assets/animations/alien_pet/action.png.import new file mode 100644 index 0000000..6aa6bec --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/action.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://evysfqsy6g8w" +path="res://.godot/imported/action.png-04241c8360c1fc8dad2f0e02a075a6ae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/action.png" +dest_files=["res://.godot/imported/action.png-04241c8360c1fc8dad2f0e02a075a6ae.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/climbing_action.png b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action.png new file mode 100644 index 0000000000000000000000000000000000000000..41a3425f86c7d31138358ef8dc9140431797e3ec GIT binary patch literal 18604 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 Cz%7>m literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png.import b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png.import new file mode 100644 index 0000000..8e4b3fb --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d337pf8yibt1l" +path="res://.godot/imported/climbing_action_start.png-7621e08628cbf0bc7c4abfac23565650.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png" +dest_files=["res://.godot/imported/climbing_action_start.png-7621e08628cbf0bc7c4abfac23565650.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..da6d719f12e53470d202b178e44ba31249b11199 GIT binary patch literal 24552 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png.import b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png.import new file mode 100644 index 0000000..8525d0f --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6rcpc0l736sq" +path="res://.godot/imported/climbing_action_stop.png-72a1e16849c110fc74b0628394a70392.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png" +dest_files=["res://.godot/imported/climbing_action_stop.png-72a1e16849c110fc74b0628394a70392.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/climbing_down.png b/themes/space-pixel/package/assets/animations/alien_pet/climbing_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e409091fecff540d8159017446e61525726094 GIT binary patch literal 30360 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�GB6=v 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/come_closer.png.import b/themes/space-pixel/package/assets/animations/alien_pet/come_closer.png.import new file mode 100644 index 0000000..5e07493 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/come_closer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsmel1k8ohsub" +path="res://.godot/imported/come_closer.png-d28ccffd8455d606c3a161a9fd1e2e32.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/come_closer.png" +dest_files=["res://.godot/imported/come_closer.png-d28ccffd8455d606c3a161a9fd1e2e32.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/dancing.png b/themes/space-pixel/package/assets/animations/alien_pet/dancing.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2238a3d1e6a95bf61e1935f2fcb0604d041797 GIT binary patch literal 260710 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

hQkkZx3Ga0+Yn1W25F~fgYQrW5_oJ4LZQh&R4ad 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

OTx0&e=PA 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

&M2fQczI@mi`2G3Fww@;R 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

2-_We6ys6BBk&g@DLr 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Ξdrly+A22SvJTBD%c@woiuW_jQvZ#Pb=&lE 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 KsO+3e)c*l9FrZBU literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/landing.png.import b/themes/space-pixel/package/assets/animations/alien_pet/landing.png.import new file mode 100644 index 0000000..2a0b7b4 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/landing.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfx08kqh1l2dk" +path="res://.godot/imported/landing.png-0edb35c9f8848c057af69e57c243a937.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/landing.png" +dest_files=["res://.godot/imported/landing.png-0edb35c9f8848c057af69e57c243a937.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/sitting.png b/themes/space-pixel/package/assets/animations/alien_pet/sitting.png new file mode 100644 index 0000000000000000000000000000000000000000..4198e55c15c91bca512320806526fbb1a040c297 GIT binary patch literal 96255 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

4{pGqXSg6 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/sitting.png.import b/themes/space-pixel/package/assets/animations/alien_pet/sitting.png.import new file mode 100644 index 0000000..99b6101 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/sitting.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p2k1nr7u0n8l" +path="res://.godot/imported/sitting.png-07c31166245c2b8086e533eca84c95a1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/sitting.png" +dest_files=["res://.godot/imported/sitting.png-07c31166245c2b8086e533eca84c95a1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/turn_left.png b/themes/space-pixel/package/assets/animations/alien_pet/turn_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f0fc32aebe1bf9a0caa01e61deacb480c5ee5740 GIT binary patch literal 31428 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ⅈo^5?z;YVM_Q1Xj7BfvQ(F6j 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%0A;$-h;oniBkrt!IP4G+OFnh1 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 HI6V7*u1gLi literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/turn_left.png.import b/themes/space-pixel/package/assets/animations/alien_pet/turn_left.png.import new file mode 100644 index 0000000..0435043 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/turn_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cge3gefu8fxqs" +path="res://.godot/imported/turn_left.png-1adf482ebce739c67b3e3edd4ea2e476.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/turn_left.png" +dest_files=["res://.godot/imported/turn_left.png-1adf482ebce739c67b3e3edd4ea2e476.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/turn_right.png b/themes/space-pixel/package/assets/animations/alien_pet/turn_right.png new file mode 100644 index 0000000000000000000000000000000000000000..69903a4f952262b4cc5db917d3f7926f1d1f0d4b GIT binary patch literal 32120 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/turn_right.png.import b/themes/space-pixel/package/assets/animations/alien_pet/turn_right.png.import new file mode 100644 index 0000000..fce7a8e --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/turn_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kvdyxfre1n8c" +path="res://.godot/imported/turn_right.png-30823cbb62aabbf645cc0ae3492c64c2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/turn_right.png" +dest_files=["res://.godot/imported/turn_right.png-30823cbb62aabbf645cc0ae3492c64c2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_left.png b/themes/space-pixel/package/assets/animations/alien_pet/walking_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e0783861c5b64f594ab768ec949861ffb4fa8b GIT binary patch literal 76871 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ΠFb2x6_d4 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_left.png.import b/themes/space-pixel/package/assets/animations/alien_pet/walking_left.png.import new file mode 100644 index 0000000..55187b7 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/walking_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rxjilm82m058" +path="res://.godot/imported/walking_left.png-0ebadbaa93abca199a085deb2c39d0a0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/walking_left.png" +dest_files=["res://.godot/imported/walking_left.png-0ebadbaa93abca199a085deb2c39d0a0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png b/themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf299ac096b8f979163708489a8572560147712 GIT binary patch literal 21102 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 RcP2{$XYgjmZwwtH{|8)jNIw7o literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png.import b/themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png.import new file mode 100644 index 0000000..d033bff --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp6txiyte76en" +path="res://.godot/imported/walking_left_start.png-d8c331bb451cea8d08980ad35bcb95ec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png" +dest_files=["res://.godot/imported/walking_left_start.png-d8c331bb451cea8d08980ad35bcb95ec.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_left_stop.png b/themes/space-pixel/package/assets/animations/alien_pet/walking_left_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e54ac9506b0ca9a9711499c00e68864916459ffe GIT binary patch literal 16114 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ƀo-x?Q&w!LoR-aTcezcky;yuL(z7%l7OKph z{;=~BxBi{@11>T0GGLz+Ni>%FUt20g$lF{Z-$Dxb|G8B4#Q*b(`X5)Se=k#{UPBio z|MSjIuG`{14na6Z7yUiVKyK~4t)~!KqjT(H$m!6Pd_b73VD(N{;ToYxmUZh z4#?sK`T0pG1w)Nv>jmN{jOZU*_CGxrz-C8`{C#^)*!cXm{J-{yvbQ64BYUCIziM99 z)p^#pPkx&8_}S6?Up~e`(Pn-t=SN3qh^Ex}pF3qoB-0OhPa@PXlIJQsCpSy)4EmG* zPZy^r+-L8ix?%aQwJeYv3H|f$8wHeWL~ETzZa@ra4Pk!yLi2qfp>p2mtOPSC@6q_< z4@C*-T15NZdCY@=3K`bqPcaEc2ne$DI8p^!d?E7M51TGXx#jY91tY8lh$~mD8oE}JtuAsWlJWr zKsYnU7ktfOiBjM1Gd?OV9YS!*(&_>az(B55;1b-R{-^b8U2Or$ll#B6YVIBfN?n7A zO$LY63?7yYk`{nJQj!@*D=6pRA7iSm$7c&wNa&dS;ot{68xU@k%rw#13o$I8{GW8E~Xt)C(8x3rwSj_VPuo#DOC9D~Q%Z6s>bP z9-KeZ#57)ww{#{)9=#s1C6xbOsjO9X?Ql4QJIQHs%I#tj5jTJ!P!r(uQG=F($~qKe zQp_ToqWHmsg#87t0I-PZ5TF;K)v920^9=HLLIVBk=u@Fn-H2IbqhB(-Qsu5+wAUu?VpXalH+IOp~}yIWk$nu<8X1(3ax8+HYNJBnQZ-}|A$@l)im zDNZVWL5DE1!T$Q5Ta<6>U#q3^ofnRW?R{3q4x3xrhlm#&@hTeS<~03mKKFicNr5L? zu1SF&DI#N@=0~mFB{e))&Cg;C$6-2 z9T}Klzq=<*;%Au-%H5PJJ}z#fp-#*L@9!%BzJ*Kj-!rYb`T%amD6JZVg5D|DD>F5i zs||q-5`4V1P}GM?w6tDcxB!=y4pElZhai^Xcf@GQ*l$5fTn(&@mV7cB5m};0iyN@} zI%WJBz_H$$BUd7LpVX59&-U}qjY|U>;HEwdNt_;}z;wBb-d8cSoozH|ki_P&Pp%T$N>0IbJE~%ggefEC7I%rCERY|iv?SL)N2;BeQoh0*qr0RTgk5jb{Q%< z{LVs&|KHXi1^vnyGRMYE@*$y--{lOeBtxdIGX}R>+h9I(S8{t1+&$B26 zEU--zZ9Z%pozBSrl9QcKrqBDGIVrO`L4hc$Zzrmu^OpDTkon#ue3R~_BW_PK1uU_z z^-GCzLT852-fd$h#kboDVk>nW{(WrIIQ3{rcCJWeX0;!!K^FuA_6?Lg(f!vX^s3nJ9B$lLEt0yM(mWQFv1Bf=B&u7IdJEv-8lDsCe_LKqy-sN~F!x<~W5X;h6#Ov@_x*-{)ZG@Fkzp)A4$WyKETG!FJo18=`97 z+nA@f6zCdDW<$FvaODBJRS65I{6L%e+v{))Y|-*by=k>|yk->A!}-!!jjW9gyf;@a zg4IYkf1q}PtT_>Vx&;hp?hx;FZs4v#I2yakOUaT@ZE7hEXaHPBgcM>wB&Yz!-v{&u zU^mTQ37U7k$|x9_uGnz2eyd4HeiE%IDpGGPOW*6voup^{bje9TD{#vJu496Hz+zdp za-=!!;l{6g-nq5_(ZfYwAXNz8H{JwCwP$)Ygg z8f-}`_X09ltD)ZaKSU&d+?W~mEjdq_@rjN(9oBz_sYF zbY!XN?ddTC_=>+F%@dz%Z`c!5Pq#_@$dI7WB_U*bUT88pi<;OBQ$dge>G>6JkxbNf zw2ZlxUB{^dDbc5*f0?uRQ^WFFpQ(5sO(no9)=NAOi@a185AvJAFc9g?3FX!v9%z)y zayW#%dcyGgKhhuL)+?Tk5XyBxlKbC6v6qbv;(cSH(KEh#{Y z{GDoz5)BdS|3Y%c1M@CoxwZ0N#5SHaBSu~6vPN20LD%mxJ_Fw}LZfGo7p8i2`oY%t zTKS}FtwlYGGkgHiATN*x#6Xp^8UslBi4xQinz{ar8=gN%ZetduS}+*{4bo8D-IFh7 zghWNfo_w&TZ)*Dx&cJ$#ylEAb)cQQ$nDTD{toirBFm)bDP#yhS{X|7r8p(cSdxCJ=X z0~b+mx50@JQu^cQ)+a>qwbI=4f@114=WiJ_+U9G&V||O3KH65o3q`Mn_T#l~h=Pvd z%{O>zOyH^R7JP8VNwzX z;eQnYdT*$GH&@@$m)n%447R5Ma*QcSRyaGLKJ)lju-y624}OHFiG!%B8Ybk#0hK@g z_0@bMhF1%UN)yZGYGNlj1)ST}9{*M4l#(Qbu}b1YbMOehC9r%=RS7WAFM#a3g<7I_5M$n{y)0qF9p3-%ak=V=#fE7kTt zmBHQ;v$7K854b+C%>Pn(QuXN1UpPZzJ|YS<5&eHQ?tlvekhwf;HEkj)mt&$Zst-(M zI^59b^>ux~CxhX?#UGp2$z=pFg+w~0N4>?To!tNWYU2j4Cpfb&A#a&Kw#|O zy*Cac9$cUVcK|1P zGRxWTR4Q)oAvU?w`0WWxw#$$%U4nWy80SZtSQv~BiyffWc1d-cbKB7D8q)UxT> zWdFrC%jCnT>|Df}fqcZf!(R40#P{3X?LJppRjK&fXiRzBxo}X~Pfb*Nv!WO2@^Dyn zct#g|=sEBZ>OBsN+*~lVJOqtp@xNMHg&23fbK~fk*>4d-2fcoa&C;@m0wT2V`abI+u|cbUwRT($%P&9v_w2$U%kOjn*@3Nna!EH!x6UF zjE{pM=&_PakVA?^Q%fs=DJwATbYI~**U6XX@d!&ekW6@>n4}+5cd97klZ!7mDAW|I zj;=EJIpT7QaDO~D*f{g_N-piT4^h793^k{GuCmCKa&A8q3#N{D-Vj}lLfbT0{mT+u zQw7kgC@aU)9AHkItbpnvb;WRn(={}E8DHO`)3GJ+IM?+tsVNT&!Jd%}Pxq#|UrbBp z2$^_7LVIN$#lME47eUhD}n*+A4jeNW!a<{swI0-0{*S+ z1oI8k$ZwN8E!|R)0xJ~JRz#<>oxj&G3-n4g{Sfwz0OHy>)Cq23d$E?s%(K!C#$6 zcXAHX7;@1M4n~e3_T#Wq5*#uz?Muv?ib`NJ65&{5zi`OkVrx187rb~^@u(^lhYbg; zZ~lw@df3240DWXb;Mk@Z5as`1uj#Zx+*uf}+D-=hG9v!lb9d~4$DLtPM>P&nnxB!a%xD^*fm1s=PAz1s0Jy$jMxTVawY*tof_{DYU zHEEuP1)>oep`6vuHk=G?G%ht#y069!3}$jhiMity-YoEa2TJaMBUqEyQLi*lD`rZypuV&y6yDh6qtSvdJVx$E}upG>DWkAQJ*-P!9*Ntgg68A`(C2zs9KMGoEzf ztOB>co&c?o10`N`!pS%wUHXK9;_+b9AO@9Q-j8W@+G$qpHZ-Wmv^ediGxHt@|%?EcJmG5{|$kLO4VCEYvpNLm)74`kB9wj2|Whi4{8{i ze)Wx~SJfS;OA@57?rLZ8m6k0>p^1`G$2DKuB%}vb9}D{4IjkQux?%H&QbA=nKeQ!B z&PR?D+S73zXJN`UI#Na^!{I>iOsw`J3P({YxJ6-q4qfoxKKtjE_D=gd(Jf8qf^)T6 zy`KgB;6)_Df}U`8uf|mr%qzC&gD+HR&;PYnom2s>k;GGu-gn?r+;zI;;6?b=Yq$5d z%+dV^%3<{)StYWpf54+C1!zTuS0)yc^FmvnuW$5L>Ly-Aa|d6_k4QE;vv|#;ZrJ2` zb2yY*PfVWD-8Saj?z<>{LFql=fm(C@@MMyMd=h9PfY-&5Bg^@g&ba@0ncERu@e+!K z_}LeqLN$6b1RPk2vaqeY}|hB{(7m(rK4WC?MFP|l>@DbkuuBvd`%TPW#d- ze|f(#I9|kk%WCf330v*H`odL9KhYT2rw1m(_++Gv3ARar!8puMu$O+tiTP5^cQ&I^ zG&7O3rR2%+LGS007RisHoYd>^(WzsXLdNya{5`#{KMsd;_7Mxrq4VERQB(UwL*@nB z8T5|pC&=^I559&-L>^BD?_NkT56d54&O>SQGBw|fK2UH@x&c2q4*?91r3;udyG8BV zWek69hL+@Y-Dmk83q#ztG0$>;;Q%S2R*MHGh8zZ?&m>Y-QCDLv#)L3L_hP*7V}&0` zCmVMOPRIuKmCABWa~_Ofb%xRt?-WtEA(Ztf?@x9oZY%~h&d?Q-EwQ`T`xpGak2*S4 z`%23bwct9-_jp7k2VrIsj=wJx;VKRxSBiQNC;>AT~p`v3UPb?q%=yGC}I z*>dfbO=zKzm5-TGxL3C9ND5bWsT3mfUR#t|$;j3vd*91-&+qj8J$}Fc@8faLdz{yK zjpv{+S_3nz0`Y#Qnu+>V+^C0d2ifH5L8gfIiE0Y3b&sw;y3{0q01|sj-IX^CCE)dI@(ym zwYQfY1GW*T3rB}CwvCIAL}vzVde&-J9$t-2)#-_{i^Lx-5E8j#%h_G+$u3V9U%H$~ z^QKX=rmT79`>8;Y*LWT~NOxHr92EJtH-I82SJ{bd-FT*bChz>>F^A3`C6}Si`$4DB zlO-YR(l|-<>56lP!1lA30_8APNh-w=Xxo|M51O*WXKY9x3{{W-`zgv9&`9zMtb@By+tcwJ!En z+Qr$5=X>YM=2x*AMhC*yT&xcWU+(T-8E20sAF&sM9-i2KCXfQK(8ap@ey` zmIFK*b}^=fI{v~H;@~3i0?N8ci$PydX99rysGwN%uO^<=BJc-!G;j}FYNRJ8TFg}+ z==|(1$c0VF&CMO!ztng0y&U}u&<_t|VNf6|B%!X6PSh#xT9eCHCk6)0Ji!z>DkZjm z^MnHd6_cZ2McO`y+CANHFUB9W`7%&K2aD&}6!9(#+AazHYUvhuU|0^gTBa1+s$2xW zZ_6YsU?o#Jm=^}%@bCwZYrrL>sA)*F)NaieK-muPO{+6`zwt({G#!k)LqyO8Ro71n zRy7mCQkie-U#Z-v3G7A1W)Tpf8xBMWEVT^9ZzJdv^wkFSBPWkko8qE?lNpCM)fXwg z%M@ldjGHCd^pvUM2XhzJhJt2yE|&?4Pc;@h{w}9R$Lh)! zus2trg^5YC3EigXcbG&Zpi;>Hp19zAfS!gH^vl3LE`P(i$&H8@KD6k3pg0^Y3ch7b zPr5_QV-fuVHf&B`IBT4vN`F;6s(srcmf>yC$##FEKoK~gCQk{bQHLE2fd>5|ki**k zBKY&{ERWV87kp#GlR=@GU?8vz9*q)QRERb2;KjCpdF37VdPWYJ$7j~bVqOTcp^g8R?=Et-Q+5OM{I)H$Cn~=atGei|Ek#=~Cl_$TGd47b#4z_txwa zaN+`?m#h88HNnj*{QCdqCUsS{irD?KCj-I?ydcy{8CEt#kYSe{Uj~wIlZ|OK$@D>h z0z&Bz#I5Ev4nUA)@)3~9V)SKa=fNO(Ut-2>!6i^x>c3N@%hosSAh>Ex4pt;^>@Q>N zhDT$;L0i(PBiKX4i2oG^l@yMFz)uwU_9of`Gxtvw2aIQfo7yz}!+aQoLqv@pSnPb&MuT7hT# z6cdhZeh=I9D#cNL6!pC0Ggk!;Z1g|7C&A!KOP1-u6hKB&W`b65vp;<(8;-(@=x7pF zqXRp4^6l^Ocl))Qyc`Gb)lazo45IR>9dKRqKeeplDx!myN`S zo)FqDcYqQwJ*E@gt+7N46X$B1r-+IE>!gfy?|u}eEO?bdFraZPI=V*b57KF=hRgXW zQ2$M`HxkW7k<4pQ2x-I}?yltSA>XuJ-Tmxh~>*6k_UYNTTw8^Zi2e-@Qyf9U)|dgOx(r>$W1dNS)bRTTE9e{fs zSn1-ol+*xfO8f0qqyqu#mKoNm!143-_6n!&Lv<&5MgI0|M@DoqVZx*TMs}e=N7-e+ zN7ALFV-^kdhYNuE+5G|k!Tt-zF%clrV|)o^F@@9MEW238J{|Tg=IFR*%I#FMRgCco z{4VL^IL6}x7bt(dwDr+BGFHxSUjBzLZ#R;!dIS&`Q(fS;Tzj|Lz$Q_r!ECPDMn1C8c%O5^;&O81nB}u*^&Vo- zKH#8xtRM7{YX2M-@xSnAkb)I+j|()YV)ZDX0b2!NY6~fzzO&wqGK%WBR^e{~T&=fo5;&%a;fqwzp=UjmLcnTm~?LzsS>+4CR*=9JYbAGE{N@tEb(@eL(Q^?nvC2Y^kT?A82PYmi1;wHI)f7M;PsQU1`vC*}0*Q|B0FnQ> zx%s8WLT+w*8J%Cjx>47@ozIrDb9W*VZ*f11_&MDAqhYVSHH0Gd8}=tKs{O}miG**` z!jazwMcn4ZP3cG2Ck{K;xp@0z-D>~6<5DkLyR?To*gf{%&u0ZuW9p8TC=RNCgQ$#6 z{(yW8zj_*xm8{MO$-7K#-xG+?`b%)@Tf&q!Jv3?fc25&AL&U(KE-Lrk9A(X-afa<`h1LSo&P&j}M5_}V@qzJfV z_P46RdKaM(dg)Zg2$ng%=a9fkk=`^H)x6~xXr^wYFC@WQcIAVc93)E<1ynMis>i8~ zRILP1n^gQ304Zd+lPS424v z(APH8f#}#2?VNxhe>pAf51KiRM$UXg&3eZUf!qN^jFithAQ>1dd@NoH^lAk=p4*i| zgAh36fW}khb|pg@P!Moy8eSF*u%G-#EMlEXo0n9YtB)EH1>BYr`fp+G0w6yXGzAcT znFLZU>N=NFSUWn1T6w=P=^KR)f#DDafbwBt z#Z6P)EHm52173Di{{gA-dr?un?qQp0^~v1_gX@d5J_FyFuMv^ZB{_{$dPADaf}MIC zV|d7;&SzqNDpRDs|LPvl%ek?aEQ8e9r?(V!_qPWWhzF#Ph4%{y zjbW+K%a*Hyw0gLP1SCFO}^rFzbg7II_p)q+S)4xAVjcA1bo?{iYt|5X3u*}PCcZhOnpx#MV z*h_D^#||=GZ76dNpoLt=hjxRSpda-8Ss;YqIhi4akDl$E7*;} zW6w=rb^yg=qYdK^Zgr3DW<(2&qf}qg)2u30E}ZA!M<)-g)pt~vUAq5D+ZENv`r7%;lgLkXGHXTbT+YrR2}%RcwL6SbRNCnR0zl$-my~>=ja46 z4A5L|dsS^@=%@M#VM`_8>)F=0F!D{ z7_U6wG)nb^RqwP+01y<{b4qf=FaPBqRvd#rJx>~}t)ZHiygtN$D{TC9TO;{3wW(DS zVC^F&%wgwqKt*a_7A=Lc6Tl*l0RikjX6*hfTK1%aEI3) z+$iQbx}f@4>%12-fEzcu2eOoNR*qs(n|vnjQk5yT;l@AP=c?Bp*($2or$w}>ffvEI zEE=HOs|~oItY%K4oeA@U>+g-abxRXE>^%6@UYx*+uSBRq={8Rl0*q?%f5T#+p#z&| z^1gPYJJ@t@?XX zn*n4A!_Aesqq9{x@ON|XqO~s#@SLQSR*VszF6gIqXGF(cfd_o#*GxzLwOwqsNFei$}s)t2HYwE4z@_Ox%tfp7|T-2fVM? zwijmrYOKoO3Z%rpwReWV)qh#8BonTVsqv-(%qeeJoo9Khq9=Q%|nqq%I>MkZibW#HcEO;|`OG(1T>*Z7w)GP57$Lx@?xOl-AV54ALA5tqh% zc84f%+Z4Yn(~Y*=)TWoOcVnZEMa%ES?<3iyW6+7&3g>|WFM?+j+BdO234F5L>Xs_o zH}a^>{3I`d2X((;v@Vs@2x!scB$h*mz+b<-_O_YPHUdBd7^9sC@*$9n{2u}V?t%ng0Sb@oC^~dfz5iWk}7L6t-52mSIqNL zi)V23X<1=|Z3zuXh0Yrcs}x_%frZCLnkI3eg2@t(|94~OX%zswhoD53LT`H0<0{7Q z2=_(CR<6P@eq*$I^)D+n^fg<^kdy;ycAfbH7a`yJn1_gi((0bLw0nEKz?kFNQbo>bw`%{7EFib`iVExG z?`OKoU&JmJgoMfpBybE^!53X)gf;luKlxCFJwy0__RH>4=k5{~4uCGL&Oo zUXcyb`W{bF8Z$EwKA@tKISQXcGTpyS45Pu(G6PPcA58UlQYkWdJTkG5EAh8{qMIzJ zV)6%fZM`G&ZFF?g^f-0eYK)?WwA|ugbdA_YwU7 z;Wl8L;#zryLua}|iz>k9-_@(ysTr5E7uL*G^JY{1iegKqhT--P8CJDqy5#as{a;B! zPIX={TXNoyYcJRU+Ttw*VDd;V)re3Na@3s4l(8~?A@ufp%?kx&!NThBQaENCHngT_)IjDT_KxYDSU$me=p7k}qn4c6~-!|7N4B09u*iW!Xlh z2;nu)he=k~_@cBfb6R(Oo#997Jm=p4=a<>WsC(1qBWe$6arUF-q!t>_nKKPh%-ufOkZ!`c0Bf67_H)dJu6E!Zn=@ifQ*U&4g8 z6n(g;eqZJ6dsp$9e;-AQn|rdDH)@;pA7IJpfk2z+Rv9REp6gS?$Dj5qzq>HB6uTLMJ{yo2rz7gDqCD`%}@l;vObTNvAM=0Q6mHjeGz5(p-eo z5o&;lp*k-M=6h?p4PZ5a-Uk5Mw!@JrxspD@!gfbZSB|QI~Ym)rqYs|@}=#6GQ+{(>@)K* z*zKdr6j@_=u4P;8uCum|70G-;9~3|pL7rmD``}58SaUD>Zu%Zb0n{k%fjncE z5_3Qebs$@K=rz?qUWATw^SQT=TO74(*dl&%o15@3eh;iq?HtxaNS?8aHy6``|20$p zX#87<3$bqRqre?jR6(;sywPjl9i}R!d15Ku1J)ONgYn46Qd<3n9+yvAo*Z$07xZl< z{|`bA%QSyC{opxlL)7xuovzo#D&P2)3Hsd%Io6n+`%C;j$xD6rUPS)%K%K8TfK80H z{w{F$SN&3V^h4?sUFbna87!9IDdE!PWmaIiqxaX&n(6iD4J$;h%8u02ALT*eZWkEJ zgvjh&NKaVIR^?KxQND|Dl#VcFSS4yeFz@Vo$rCU&1lVl!hkBSl;ol>wNuJ%9229)( zQ`Oe@_3~epf}UjEA31FN>?S#{7Y6uJMyF6m3#9sscUdG~ zF@HR~uclTQJMjQ7BC=j3O)Dp2m7(&YEhN3@IDf^5@@jnSUi*Z3_a!d4P$s&@kT7w6 zxG?%|D)pxPjX%GXByZc}8Gaia$KG0Zp8vm)g+V$>r5(IThIHMfAda`}p!_IeecrUc ze=sd3JShiKhj=e0Rwiba9Oc~i-P#*IVN9=1#Y1B+&XQG%c1-PGt7yId+~RC_m7F&i zWaS%VUWyHv#7GRNur5dWB8TiwL+OkY4UUwu{W8BkUdCjoeo=UC^XOsjcb13k0X3VF zT$5l?gi+sjoA&A0#ruZt4}Z!MH4WSVD?Sg;D--8Nj>a$CmJ^NIyS7N_Nbw;%DA9H;82Lj>Ap`R6s(Pp}~R7Av!+)3#ysHVW` zr9`pg{GV`r79!6v%xm#V-p~evpFyu;j-RV$`Qy5v%G$4k`aK+IZm=P#cmP|GiPhnV zi2~kJ2b?bl?p=eAK%hP8GhFE^;J8lxjqXo7jE&rM7LX#*7_Sc%IY(8m=jf!+Lua?F z7ZCRRmz7U+gimyI-C|0Lkwumz%(K_Jz!z%Vli`qyMj<)acz9)j{slelBq|7!7PfS; z_A9=0fVE`*eRU%E2t7!?_0gJ$br_183Ey+6lmf2e0rWLMKf^&c zVBTzAYhiD@$~_kSGf}n*IWGlNj-%%k(}kZ!kV)#}vJ@W7EA|;U50vog0IkN;pYX;( z;PF&~QJmV?u%8FwcHek!ecSVXCR+hxT=zKL&_ zP5K+V0bKlg8S$J0a@(5$@f8-UM^A%h`bhC^lm9Sec0mA+KAN?|KT|%oL8In4=5o?B zg^&+N{c3Ym7Io>d=EXJPS+=hNw+q`VVuMq#ddG#b1%cgiX(0#vY>Q@d4XaMoKG2u~ zcMDn%^sI}@i)_g|tHseGyTf}m6C0%vR&4S7*)|*QhL8_%+4RoR27=pI$P);>DP{ih z!x~0=rPLwG2#ye+7Pr{_z=KRONPa>K3RSWcoHh&l&=%=x2o65FyX*|V(kjBbKg@%C zzy0H!4RNBJ!uKDl@p%ax_$WCdYC0*CnuwL}g)P?&aScgs#*ubav8Rv!JhR z*A9!~-$|kG!xAqdN~JeWQx}{v6~AoG+wDzG<2oVS;wm52Ju=$@Qdk0QaV#T3s)nzQ z3&P&Am(UlVPqe+~wCmR3G`Zxb>xZs9!L78XC-KI_*T?FRWZZ5^=#95Wq|&HIzb}m% zit-!%!6FaxGyRE1RLl*VW31J{LA1v|j-2@<4DB3?9HyZxhkbP2KWS@H=Q4s(Mzvcu zIFsBKxL1j3hL0v$>n%R&I=iF`a$e?M{w^HO=cESpu%noC1ec%o1H|7XO|6B=yjR_dn>mgHLoxs#O71 zTQZV+4649-deNp%Wm308yemxy?;!)GLIKBwF4u#gccO7ie96XCnhExZ&)Pwv_$Vnh zJ;@!DpykcYJBQsAx{P>~l+7OIr!g5KW{T3FMSN)Wp3yFtSpTOLv%+NVS$vi1wpE|j zp5xV!atfKt=bmRKI_5p};q?TJqv%ga-gp$xzhm_V9y_F2=i^Ia_=ywmEDwbs$hI7n z8JzVVlfPyzL)M18_AvBB2HpTE=i=$nmDikm6~e@@**soOvSZw^sQV14xyBA@f^M|u z?PDV)i6GCy@#&L1=sdsvg3gm(h~>o7=ufP@pmhUAdM0kP!hbs-EVaARIsq4 z@+(*PLCq2L_0pN{C^cAU@z%+q$)b(vjBqiFW2M*P#qHWlhyw(gWZLTo*5vtCIe`I% zdG+3WtaJh{#r+|vjS{9;hJ~K!yclT3H5B|}kH(w9cQ1kp$MvSUXuo|1LWzD?BRPt_ zR5b~}@8@uyeAzlRZxQ(Z1vbLHSWq694RPZJR-(gsYSt62sd?T5vP{x5h_a^n0r0Sw zn-oFhXCu?MGF@bX?wQz6fOG*(W8-t2_mCU?>^eTm+eRAQH<Q$5=MF3{#aF+TR zpBPvignbs&C=Nk1H6DB*qjGC{J4ow=6^ka8Ws>gjP7N zN2@4wtx7TmUvZG|W)&jQ}r zX|n*~1@(y_$2$HYaMMuk7ybMMto7S8P7#8bPQYd?3N&9F1}D@fZx7g`E6jIg++X0f zzV)0X6jA{H(GF))XC@c>LPZc}qh6Owz6+WSvX zrl~;V3(D-?8IDU|OXIt@T{UBrAfSi#XrSuGip^&Gs z&p|8i9nielYcr#oORwPtWJ!Z*1N=MsW3c<>O{n5U6q0FP6KEfu-JFp_{==+D&*(3M znE_{#(tGs+I0-LVSMhzrxz?r$Y6@V-HlORI4pwTND36P52sk|JVDCYYN$rEv)Cp`S@&-~m^ z>?~^)2WagfmxM+d*y=~*|5j)=TO?yP8)^z~Puw{z9ixfl!ZpG+a-wxVa^h+(ZR`rL7cY~;#9p*q%Zd6C z)X?9Kp$I@tl0TQF2#TdY&b6cp*oHr2$bE|_Tsl3cNIBub@5Bj*q{{JIdtsN+OTf(d zDcZx}3rNpHo??cCF$ySjHB`J_;jgX1qphbpgU_GX@w-8dVP)}tF84b`_vz@7sq07+Nf>~GJ@Y&A@c5t51tW4B_vV7Sb~0GZ^`StkSUk|vI~YJbZH z0|=>jP*7Yd=J@w9{OKEnb(WQ3}U>kdS{x;V8sE` zEynkmZc=E3;_-v;ykb_oXDoZ_rCv1+u$Ay@(azqE&x6 z@?}5xGl}G%g*E=<-#AK~vt~wTzs(yIiY_bL^UI4t8B!B5Pw%oKY3BRNY^xs9kNeP% zEJmlf+1vj?{k9`FJh2UvQ=r|x%2te^4tQHezAPoSqx$uX|7uJXX>NQ4rBuB9m!+TJ zYjXKHgYFs*D>4mL_@X^F1b7LcW=^mBg=ObTU- z-4c#rS7TB(e34{|1?RkIb1$CHIU;cowTpIumlzvQ;_pj>!f|T&SrmXz{#eNz^EkCF zfdm=B=`r!j1mRKn)(tV^Ut|1?$hjcr0QIl)SzrQ3>dgEvd1iFV-W*4e%LTnwy+39vLBu$;f7&U;ERZexr1G?O5!j@~t0NjO^Fenn$eoyp%gtYc8*rC<89ilM!I!pY zHxHV0dtVvRxU`L6{%})>fq739`jkSI7M)f|x0eZDRtn-odZx}dWGZ#optOn(TIb+9 zigX9dkWp+_6WO9pR;yqAyO1%?46F(H&gh@%C%n{=-?{Fv=n^4t0jz%M#)})%1oUVP zJ+=}Z4x<&&6GmE5+Z^$(h7F*8&Xq%QRR=+T49)+^Sd5~W4Z%E0 zfmJy#ih9V-|Nhn{@X5f6=vmV~2qqXB9z7Telg$DLO{Km^U{J#O+CJQ~7`ba?;05cjfw<*i+%wrC4=C>Q7!ycia1HWO5*9yrEWm0_x2dlDGB2 zwtQe~+EJ`+3}4oE;CE&*RZWYJjWwAYTo;C=L8hRCvR+yP<)nGi1fLkv`_o*ne*AU; z1%Q$okBZQ6lHbEzn;tXzgL*9ha8k_&y;$FES!{D$d}-ig6s#NK*Pqi0@s}H z?)}OP9?n0t3Qm3eBsB*0+TH)`LZG*3+jc3SBTK?BbM!CIB$Q=o`Xtw~gbP^gN91#$ z+L7vUm&dAm=UYq>_GI`PO8t`*9{W>r8pkJkXbctdEw7yeZ=BmxwjsY4TCrk6>*w&kVOn~9SF$yak-A^mhg-Wba+ax$zq|HT zCsr}oL?kLNWksP8YF8=HURi{e@0Okre{Un%L(c zGk3vA1^Vb0Z*(NaRB})cSg9se`b|t;yLeIj`t2++MXcfaC-MLUi0mF;Tw`G#sLzNa zfB)EMnJzR!HV>a@>Rby*34zu2U!00%Z3NUKYMsfB3Aen8E}_}?&4Tz zpfw)r3<)!Y3s8kRU$g@zB&)Ah26~-kJPX|0sm0L`f_2a=TO`hUJ|nL3*=pqQQ!;{s zv_!_TEzAvI|0cHpq#q#=5JlVKwL-W0Cw;NQtN5*|UDPY?N7V=GK`)L!%AVTpk~qpJ zrR55w8%lo@{S%ah^Qdl<*u=?-p;yGYnBa;put6jB&NrsJ_YeGHe2y^d}6^D z#M9cEq3ITPGe@I*BtP9(sT*&v>-vh{cpI!c5h)n{ZWr=`%f%w{{O<9SV+yq615d86 zxD=ujza9t~`&l2s)Yt9W)DtsQiXn|Q}Ywo4(u8LPRj7jwdpCjOtU2NBxYd!NzE zM8n!`8quJy`z`E?dDB#=pG(y_*B7fKW=*KEi_R6GBiU~3@HyzbhxIw=W=blDKE)af z-I5WYu;Gk@}Tjg z{l^h2bgVJP(D{SPhKTz37Sv!M&i&nUk$^Nnx@5)PH?TJ{W&5va3)i6Tp2X|;bqs)h zS=(V3&sUyv((w(z9a*XAHX1Oeg5#nXLGse z!d#EpKSu4rFV0hlf*hdkFy6OG;dmS>$ub=aJMkp-O~#i)$BBd8i}qBx>YSF&VJ+?X;0weX;!&+gU-14Y?wF z(EC8|moDVJkp56a)Kk`kCTW+Y3#B`wG<*?6JbQSTk7IBR_+V4W((kEE?f7-qsGGq( zzRV>w+XxfC~9Ltlo0w4SSL=;NFcbJdZO3 z4$10i43_{b@))ze8gFMYAY1hY`S4(OpnN5wr=Bj9`|sxu%*Fy8MyPv)#8J+l7B5HI zJI>Smc{KCOn`?_yEqtF-Gk1a;%wIsjmyxBxDw5CsRzBd2>X$rmQ6J?FEM8?vwRNRQ zj?0NJ;B^|*d~8^{-iEg=fBCU5{6Ukb>;F0-UvEu3J_9Sb0&0B=H?f)8%2AAk@gjO`P!kufk3C^iWTJXlAqXOuKYA@W|M5;_{lH z(AJ%)uf{N~hq~C&QACr%tTL^ulBO#?DroLMV&f#7&uKAl03z+IIEpox#v&!#V(r>* z8nMmC%w_x8#q%xO*y_*MQjzW%)A-B3jzko@(a}Z77e3PKM40oT^AS1YXX-!d*C25g z2lB+~ueZy{Kw=HNxdf|A{m3wuFvtX2Eaul(nTKR3G4S@{B;C!PyM0vqcCbMIa<4FR zVVDi&%U%Cf;rW_Q@oE-d%powm&vb8YD`_cjnC`n3Wf1M;-GHxPvnTrdd6gjl()QP* zr>?b~KNIIcPyE46{!&qehta91=L#`3YkkNWn6+G)K`rCV${znEh@Wj@ZqWycbsFM3 z!k^royLwIdHk}je=j`7arUr8uJM--uqnRP!#s^2hx>M+u@v_IKY>#n?nD1?Avdc zJ&Sv9ajeY-UpGp=wNBS*BqE{=bkq;@kovTemKLYhWL`lbm7!`#XtX;K0#zUGU?@HshrIcJ-l2u3sYF}=~R{tuU^X#g64 z)EF84?N)Sc>_`vDTaK4{kpMne%+`d{Ha0IKj6rrYC~2Tr9|A?7wz}0VvM>A^>1N># zL^<4q=HRB+>qb_agF6*rJr(E+WhSf2bGe%l`)6O$Rhoa2Ex&T(=x3V)NgNlzzn8s6 z0u247FrYAtJwnr@Gfb^ z8dJ_ZrNO*l7}GqG+l@5=#Y}xRQ4pQsb~#|P!f`Ns#|D@%AmF`q#-=2XP2b(8W%NING%CvD}tMn%tx`#QX%VAp8!{gd6FPe9k4 zaFsv0!Eu{^0bXc6t>4(+uAgJH!TE|S*6<5zYY*#X{|vP68%m3kg-F9&`c8M8vbMF~ z^@VBN%V4lD8h*6)t1k)vvVW)1uFYJ<(U4*BuB&QRhigSn(}o-?7cb4XNA4i3YfbPC zTTeRZO32`WwS3V5EL1f;)3M{Dh>v&E5LxdAc7(|4BB`_>0v14r_6y?6JAD|Vq;a_K z>rwuJ<+t%_Px$q>a}uvd^=VB*=6ncMy~gj&NS@){#c z+QoLZbi+HWV2jC}rSC3~`P@yk0x&7Ob5EMFaf>7e0rX$;aSb@EjBB8^jYu2HL5y`; zu10-odN}-s@DNYpa)=`}KI5qcb|?x5yFtMLF?rAR-2w*oh7VnW>S`hJ8UoEeILX{; zS^8Epv8Y9>HDT$U;OFA%P<{H?J%wm8u)s9jyAu4^LSQMpS@fdP};k-+@eHG6H zMR%i;G=5+CFNMfMxM!#?A#sPGku}#=FV~BjH71W%{yLz>*{T83qlm-V&6EOy!tVFl zK(Pa#0e>}4a!*`3i!~Oo{cxn-}*-kQ4XS+#JQ_71`vU2l|waOPR8Bb3AQu- z=TzVjt#RM(Z`U#GbIuS?H#Qe#I66wFBC`D{49Jl?%di;8NF(cLpw<^A4c+m*OXDfw zVV85=<(Mw>UW&fNlbjs>e3|Fb*|$IM?larZE+E)h##vWm(b%MKfAyb7sO#edoaCO4bNDbr)73}wvRG+7fyPCU;&5rUsUT|4K`5Qo0dgYgPu8{UH z(LlijHBWJfWwrewa@4=1#NrL^EOf>Bl@>}9UAGJce~tJ*0d>N6o{)8TA4fB1TZZV6 zQOdvj96lZL^MeKs~Gh9cJ~3&>oIV2f0CSvX5nJ7hms+Al=r1B#?t3Qm)u z)_DL7J^rml)`S^0ujRQl!_5n6o3wb>|n?f{zNDaGd0(OCGYvbvlz= zt!XC#$|sh}1y=-c#Ko%9>i|ZyeZqRA{~Smn(KKxvuRIdGc>Ev5FOlQXkE;=dH`TWH^`TbdP49~? zPaj%Lj1Vw3Mu?N0;p?4LlS~NM4qwP@sQS^^(EC6&s8sq^*1!XJB!Y?J8r4!f{@HE{ z{+ULAQwP>mE4pByCw}fm329Sd03idVhHlwGLNL{O^}^&bHR`_z$OqX?HOO|uLcP|)y^0UJM)hB>(?)J(Oxmcz$8PBK=k z0<9Z(-cbN<^VN+ml__4Ala#195YK9UlEt{a{9CV08! zW<~bFagYAn(Kr^ql@5i=X0j3a71VS)ybs!kF9+)=Qyl~v{d&-1+)!z4+&&#n1!p># zs1LhV^3`I|g=qk!4p41!o(7DW1@udQ?qOO;!|>5&7HP2M!e2+$;Z%5b1FG_eIV5%? z1ehA=+Bdi}^Hc7W(_&lFU@XA}YHzhN(l}P%P->w@JWzM-Phg=N()dSSpj1NN@sp0{ z)-KqL<*5OzUdB!0m2nQPYw^3q2dY!Xzwgp#s*4-hFIdG-wEc;a@f^S&2_S`|bW%|& z6z^YY(?B>4tTblA1fr9JPi`G~raVbPrR@m9<_#B@CmL`|MnJ%0^GVI=e$5O7)h^cV zB=0=cgZuNv#m(~m8}4YeKj_NmZ%2f*_@(;PZ|;2Pe294=GHvm`iwv=1Xrx3rIS>olfD>p7|GmVNhQV`^>^GLpG?^Zx^ z)c??qsa&Gc_?ZcOt6V*)OBF>ICVfSj9Z!l|x)%ihlGrbpGkvCeT}HCYWVwf>WxesVKwonQZz?Iuq*yX2Lt zX`w6Nr9vV`4BRfK9eGn06O}$?a4&9p56l`;x)!dLF=Y*neh)qmDL`@;s+R_|(H^O% zv6!68TCAw;zqec(U|Xu80D%pdTkSx`^7}Pmih5j+NIAh%!ksP-`N@vP|S2#iXz?ftqWcB|R&i5C149r|?SV>J_4 z9Bjpz~Ow*bEWctoVLL%^4clm}ROG`r{3ByJlGbgyPON`6Fv{HI=#f&z6 z0H}{<*<b9xU<(!ljz<@=j|c(S5f_MWm%WNOaHbUBErHl_tR;- zuPr;4k4(Ulo1g5?^;|1nS4sw=ud0zh)KlG7I=SI(m-QO4fD6+hAI0Q8g{TkF*D~#XY3%D#bweWNQg2BzAQCo@zfeb;y<1mUfU-~^ zBPE%OkB4@`hG2&WF1Nh2G%uoMO8Q-7oZF*E>X|R`)>7dz9#j$^yqaTuKU#YJ+nHHv zM^KQm$O<=G@&aOc*8R6COkSh8?LR%7rbvRUKZZ3op&bXYV1B+ z5%e@WdzN7$>0+(uTJ2D_r5JrOvv&wl7|`||B3?xIF<>ucqgX*MmQe|HqeKfL^9BFc z$t1=5!oT$1bYX`J8e>JU8^7?U7nUy%eVPA$ba(sz&~(*tQGC&UcF7;5C?!ZJASD7y zNG_f(E0@5IYH0&Y*(j}pEi$RBiuqY*ieD^Y))zW@nZ&ckVs+ z#P^)6>c!?`<2mV7xC4gd_4(@u$O2mTxt?94 z%LPA>N}7kL)8Sw_;m=tHF~U37G^G#DNzq=eyDOP!N-IP-dp!L5C-T0NGczc8=?UW* z57RxCC}fYj-K{%z578cI>nt+pJIOuFMOPtKlCo&@Q(@7iSo{q8lv&{~#Y%dde~+{{ z6Hn1nPSQS785OKmkIeSwoK5IX9C4r#mxpQ^X_rUorC04y`!pYcjTe_*P`9>8_?;u5 znP`L8$Vze*kVoOZt0d0zm_o#fg|xX6DTWtgL1idaL^Pvxgj+ zVjdc~8VapA;kQh+>c=uI+`awr7Er|W9iCly)K!kT&g-@Ox0k6C%GW~Q3`-*omDJDi zcRfpnmmh=~YtPy%b&!gFC6a}&64_@X@RA2!qN~dq=0;>*aYI-v@n{MCvHgBLSc3HJ z8>E5S(eW>nYKR9dtYJ~_BK%b^Q)eK%Bw}lu?$j!385*eHeC=b1%N~1v&&pc*OqkfB z`N&JT@TZ+xmpv=zpc?~+{fJ0G_kv2_Wnm@3fE%`}qU)5(1o(>q$aLdhl@=sfX5w4q zpWD2+xAOckq2%Z-QAd;E@}o)a^?v)+h?A!080Yil?*>clF>J&B&Kloon_t_yE@K4C26@BIp5$Xi$+SWKa z!l&3P1Db&nXuQP+>Uof?qULWYPUq9sR50`hsNxgyND}P(%o$9hJul;d}simu!aQI&$a}TTa|4dDUIdn3P zo}(O=+w}Y`YZz&htD3U-as|J8V)R<-eYYcmqC-k0YvENqTDkRBxag#Vb`G=vV|F%X z=AT(s|@qZp3hOPOt??qY+9`^7#C$DtkYT0h9J{e~w z)-4sh%z~O^oae61zZK={&Qm7oV|Nytl$zJ1e-^_i-93I#UcJhsG04-@cOy9bQpK;m zfzy@KJ!Qad|el*V9cK1&FS24Z?-Lm-7z7@sjZ<>6iH@ZQ7 zN6+f#w}rcmrg@y+%sP}s+%BWv){Te(&fRSHJ%y-$x_MSVLs1Ew16D{Ox_^(nvKtMX8EzQdHB^7wBqt|K4d^7#%Oo7j0DP8R}4)q7yl&$+6JcQXQYoXH4kF4h%%?Up4OLg-Ui>Z%XlULi5fQqwj2Wg6~3 z)ZSaE;6+X^$)1HO9kuV{vKZms?{OAIp%l|arNZ;tZfB?w6GhQlOa*$Quc79dw;ApVi~ala8MnHOQohLf z=}9D0xV_6af3@n@ zAYdBJJ5Afer(qG^)d^Eg*E*4&Uy$*; z=*Ti4^vO?xo8sy2Yn?KC0pn$NMUk_Pw#`>XT{T)HdwxSS&%vn}Ng1y@hsB&zxN+z+ zV&zcgyxhu7NEajy&FMwdGLji*F)N{0-tX3Q?CuKF?F)lu{*{}-_P-gH>kbtw`Dym4 zQ}I*sfatPDV!{g}){P$}$!ZYgZ#<~nnm5kc{@=je_U^FqRSt6Cndb0m)y2QpKpf33 zv|3NASf7qjKTk7EHi%qJ^4H@&RurZFE}b_xn4mokh=IWmmNV+UTcn;LUOlvlk!_yA zTrTc2cNv+qxFhu`%f-$dNrfd4x~?4W6ysX?dh+}H(TCu{``j%xL5hOS7W8;4G8Mbb zaZdTgt81m3cW+Wg$xK9eUlu8=h#p~R@BwU1C7L94=D~Cl=Owz-IhjA7<+SYIQ#|cf z#=xE?flh062R8J-)X8deyg6XA-3IQ>soC01Yq>-W+6SR{e`S_Ql(LM;P85)jrEp$^ zVq1|Z*rTq_*1iz;SPh;E0I|iw*E2JSn>8B()uKXF=BLWM8G3FS&EKP{v7cFt6$Pb^ZW({e(3`fhu?2=EMBFO`n!bCI~~geDFhy z5;-w-Iatf=@Q^%J{Da`*EaGIP5|Gnu7@iZJt$OjjBX#@8_X=(?z%!Zj)booNl8Z%+ zq17l7%#hz9dbuB_B7c*gk>zgqB`>f$%=)PVyDq0&blC2WGzTu{|Gwbi0g=XMrahSC zezd|yLhNwQ(;x$0n>>G>BYMBC|9YM;yr_Tk(JJa|^yAEJKAF{XeH_n5Xp$&)ff@&W zid}UV8s&`u21@q0S;~paOsJQC16_oWR{jfR=kF}sLBqcLz(&u{==J1+2?lU^=(LTwzdR6PkX{hyCDj*vBW3m% z)EN9S!epwu%{2qn6uzR`>l9ITkmE{+P~m95rMPOEql$F6sqU;C=tZH6lCkJr5nkB6 zx9~WwyRD?JwN-tRO)rHzG*-h?`udg=Ti4e3L*bav3oi~W)|LXG(vUGS(P8COR{P?_ z#6MOGfi>y0se{eh&^N-g`L5vRj2FXUI`Z>1(tX2!PBw$6#=NC(`7Sz|?oR8=jId^N z>M$3m0{{6xT!lwy(N~aqo^k(lrB+}$qVrOz}^i9kTD#2e1tN-C|~eJbx1Idz|UzNs1QKje4*PUySAs29MS&b9~WWc20s zruX|F%V4e%fq|#-M|OQu7eqAxu~&`f3lv~bT0j7h*q-S)wXtRp2dgqe(M$ViLjx%| z9yZ~UK@Q0ifvDFGY1}So2U)KsLqq=$0G%d6=S=@y=ANB#qK$SJUv|B;yHQRA^u*xM zoV`x;rxV|NZ+nV?DOr(`w{q_id- zz^W~NLTN$%ddGL}(f|xVYQ^3ib76-hr$~>_hxlT(zf$ahk554v=4iDAJ(Q!G{2Y4} zA&dwW)x199tfXmo$5HR@9BX>f96=wB0TV-@quz;2vCFfJjKlX+nE+VenHJA!- z3J-#Cm4#0V5b>tI+CjU#0P!i|?78UAv}I!2FPZNS7b|$w#*t|kRXfgE#WOzxca#%QKJBtZo#}F%d zeIEGsYXy0i?{J=1Lq0&vF^1Ua{z7G)N_l7dy+k6PC;nbQ^a9vWi#r9ZomtTLKEx_! zP>i2%3UC30ov?^35U%1uXu{&9SaUa>1Z7!ONj-b{SvMflo z+IV!G>8GppB^1W+5Yb5dxIe9%fqy4^UW|cL;p~ToGY!`e%-}+C2`-jaTJzP*z4Jo3 z@AowL0*8xu!OQ;{kgMK=Vm4UVyvdp8?EAq@;PJIVWG1+xVMmSZN0h&+<)6Rw+`5Cc zt@PfNBW2^j>ANW;4lwd(tHwDB^*CVOcXHdKfGqsJk^Vk9-yq+%VeU;Cs{1nRtBYdd zR6+a?9$;7P<{CXeJ_EexV4bTWr%}``YmnVn57QJkcy9AER_|A6JaT3DDW%QbW1A^W zv*oR7Aq;W#Hx<`&I#ogOHKnV&#&_LyUgk0H$qkV40ezU8MX6J_L_rJod8h=_hn&fH zu^;qt2)vXDmfm}Vd_ce5g|6f#x;@{z%E_&~?IU8qx!yLC*SqRDvN>kaoD6}vMF2h7;YfFuK>wD2_s}eXS`^Du=;K&o2z(9cd_LbjKwv6J z@jYwv^4#-$j<->VG`KPmK*^fL_#EnV)xtZbKEgk7oM}Uv%63Ts;EPmydHy5i2fSwM z-EWVzu39ghGmMa*|Iro?=?g*de3vH&ncfxBP7fjAwomcpk@SuOhn8VsSO(GxamGF3 zH}7Hl*1(Wf9Hh(UE}H)MTmE1B;i=-((n8|LyFChlFR;nIZZS2% z&uRNz)uDZU|FYJzFFl(kQNLn-(Q@$pHyN zIeqJSa_qW&IxD;{>foLol{y_zH=V8yoO6`3PUR-1lk&pCbVJjf{f@it5^Gm!DBK9YEN>iTdBa z3KHS}`wrlN*;XX+JT)EtrO@P zw!3b0K;C_?r&SlX8S@X4OVSgXa7U|@&{shFwt4D?vPQ@9>2vMUl7pqR(rA`c&o_s` z9jiONt2|+UaIZ0bjU|HGq1wFhG)ICYOe-lT&e@J$)qd;$eqw;h;~m85K!viq^CD6Z zY@nIKM3#s}W3Zzb6=IHl17;!#W8CRfCBU6Al5*JHdJ0{Bf^NOuU2-Cuyof9=8Si-z zYy|{abP~QB0-RdS@;ryfN6c4(PvzMMqki1NZ!FD#O$s-y0{H36ikv2SC_7A zpK2tz7^(;X1W6e#=?%s*sR8$nktBLfjSwZF zu(obb?8?1r*`uY)1b31%U@8lD;9I}D$DtAKUXekR>q2NZ;S8AzWY3n|r?EyvMP@=a z2Tc02#lunQ3+{aD!5ZkDK$unyH^bJS`gec0G~}2Gz1JOJyY6vFQ2=`%b{>%A`6pgL z2Z9xNmx_dN7u!56K-lCQIzE5AXu+&I2K^d4Jc2q`nFKGmGT{CQXzt_;U7}MJA&)2S zU`J07@^q@T*7-7GF{Up%J10 zqH+~oAyrKumG6@rdL*c<81(7vIRC!3ozUi$J9R?l#R#syP|I8}XEp&Gm}DDnE3rQg z#;DkEvOcdYi94S6x$#bHYn265IyG~@xZXIvv$(38=gvraL-b$#=oF(mrNYvCwR@_X z+)owe)DdRwz#s0{yX&K(K6LkLn+pPGdGpZ}OIg1k2>p-+OwxuR#7#l$Uqq}w`Q$^& zsfrD?YV=?-mZ0`uoIsxLAoT#?T7wf6AabKn?q?9`npCA$wb6~li%6a056<(mtawEK zh0H`5y4y!dGVUBE*@tJ1s-J;+*J-y)t)`g1)E^^U_qT*@IX}YN)p^)fH73O8u~c+W1_NPhI=bY_Pd#Dd7e5MVhF=v7Bz+o~uCbpqFZOs#`HbFdA`EQ~ zt9I6gNj^BzQAbOkRp~-cy!!TWBfzJ)(Bx#?sZpAHLhrU#dIhan%skN4!|is89ifhP zSLl)kKhE9&l;yLb=CJUAnlIZGd#zqb{d{J=>`T`)a<7xq1WsDM*oXNTt3~QTKsX_{o?HTFCW&m-Q_(1(0cKd3(CI48@r-?fE4y4i5N9IfD zsoAKFJK3`2md~|w=z1H8X>ypEDeV?B7$eP!8d}Tyk508k_8a-hbonru{Ocs}!4T3d z>o}dgzIw2T6*wqDD(oP7j{QMPVMrxgd{F#u?`NuFb2cTew>x^MylKxBn<*6#wI3)Eb1~Z?tZNmgSih2j2}R{Tf!oufqxx& zuLCLG7~vSa_^yOP8fdCd{S3Pq12u(w;+1mvz^^MQEabRSoLVHCT9sIS%kw+hJ1M3X)qY`pQDDckPkm_6W0$w6>T z;p@Nr8gGx1Ixh0AzP8?xa@*D?5cc%(7HN<4V8^T41uD-HUo@F;v&mG(RSA-822T(w zPslBelE$3e1HW&ai_+-$p)+SN_hB_eFJVJFI4L^6&Mko;s9lwIXf;TGQWmiL&gv2* zc`0DL^<-Z{k;d2k9Y*IeO``d%zrf1>V*wU=sxH*tgE{NQnF5DCow3}Tq1+egPymXm zx*Xcumd@~tQO1nM;Jo zv5U{rO7c?=UwBWmFG^KJpG2gR0}kbO))3xWz3j=iZnyVM8hvn08x&sO=M>}!HW+VWqB9}nuT^8WuqgJBa_LtO>?KQRwDDltIhi~*A0s6RG(Zs1crr9lq#JBnOs5{E0Pi(f)q1P&C>tXy=j(ZO! zA)=o>9^UvK(&U=g^eH&M$k|Ok@{X{fQDP0ry9h2}W4Gtc$NFncU~5B&^GVDF9f0MAAgmS*XI zXs5J8AqC$mIUyZ$z_OYOh7P@56^M>$zt|VL>_fk%%z#b-f|8PFzJH znNu5KpFs5a#GLnr5xFiv|DVGQRmTWpz{Wpit#E9aPQZ;hn(r6ww~OkbP+@9`(v! zAk^Uvv5qm`Y#N8b&^=#D#8f3rAi=Y$i%CGLU}!~k-5XXG9kCN*Q;uf&Fcp)b%&ygz z>#=ZL^(uSgY)C*TW$)Acy*y8j;(m|5S<^jzv!xiZs{6*kH-W`~@E7m^ShZJAlyB)d ziN%s1xCc_K1-zMIBnqy*!5X+ND;1Ck*|0_|+w$D?Wx#y5>9!5G(4^dVMcQ{i{-SzY?gItTmkydb$iRhin2|N*V&J%J%q;>b#fg7x0cSH243UKwevEu7; zPZYW@Ufo&Mpuk8-m_FrK>^_oQ+2b{X?uM4M#vSBy{IC=GgzJKu`QncDq>sBpH{TO* zW~=K)!<`@DTSFdX~v+@=)oqlc@-6wn3}S%QuwR3>FQa7{ckWJzao^mfyMSH*xw zD=A;VvJ&3-=xH$UF7ui#0~Swpxy3I`Yw!4Fl2AsYjiP`xr+Q>!!jQ;z$UuM8h8!!9&PpD_xTP{#!Xy)D6|T%hpHKjt2EarSFyIjI z92uDNDxWQGzg3abR;34Vv}JPfTCnABMPC*1D@Ph-Sg&|$x(;-cqdRO3f)0jh5XtJ= zXz_KgB4DH;uT_t2{F|oB)Cqd5Q6lMUkzK%TIppZTO8}){plEYwCaZ&KvGDHWY`tV9nKG2P z<`eTRLk_h!!%I;9^QCEJ*rXf{2N(X1wpf(bDfOplS_#5>O8Q0iQqJ zI|*b3NKO)Tvm99cI08aelpF)y@J$xrsW9-9iw@0_fU5kxeQcfeIf^;aZCBrd_RBS{ ztGBD?<}HiV0=OAbfsiI)_3lWsXRh&|9?*4+Ebyi(*zN=^+^#cSKaSuK4RLS9M^9id zlE-LHxezB7%S1=2f|26!-x{II)9s)3(ARX&kGXR}q;64m*jp8XyJi#5w$&K$$QMLx zJ}bdev_02dV*kyW`p!fkUw(G}+=~1~7F1;e!4YBBczZ2jPo6AJ2Vb}AM2cFn0cidU zgm1t}GY9N=`4jMH!fbNjT9z5ipaut44H~^x1`7V8LT$4FVNw^`LK6KqM&CMwq06>T zF;@0fSHvh8o>ba?Vt8P08|J!alW?U#*OX!ZN^Y7vMO`=eZVR6$Lx+%bWw<~%z0^%M zVJ3(P%(BtnFf}I{?Kh1+c~aL2ofK#de7mw!Oe%>$1NGsp=l5WXZAPwC?Z%Y*P?2(73dN~ln13;F0y_=`+W!gz?oM>= zY3^;{^O^NlB}UHH*k>MvANwW@*`BLVCrCJeQSLdyyy4jOew>!d5 z@)kkOJ=xAMPgj1_hb$jUizH-2M=x4;4{x{dvGGQGb__{rluorZi~7(jbuYRv4WcsHCR^j zeL38+&0e!g{kM9%RrXpe?u{K0*?9x~ZYn4dR?QXZ`p>XDqC#18 zU_Wl3md;+=KILwE7E)Ck6*jt?MO3koI*~Vrr)mh4EUXKJPs`3wD;NS6waa2MZRH-W z7%_6~3Hum-==Zg-3*p77tmkBUHeC!O45?C)fDRGkdbvnk-n=e)y zMgGzi{zfol$-2B&{yhoe0ElXLcctR9S+2+y^d1&KHpoppCFa{VohHv8HfR1h`D%dg ze0}75e^=T0c_$DK$(cG zE(-tywnsN04`2JZEj|{)_mA-*Ct6y&XvfuUb-$(W^el z44O`WCkvt0gE3|Bn)6$Y3`=NtZ9hwTRPCSt{#n3m{WQZ(7=H0W&PPY+cLgc9t9ue| zW}aLPJUidEUkj|ixus``-fUd^lj~Pgpfe<|w?;#&}yTGDj?^pX@5w98y|iu>$o+BPTZX~~MZCN53z zd05!Y)gv0r(?j;qqG~^=h1*Uq+C0T#Vs!6bKmw}$^=KgZahA+ktcc!_lkeeI{jjoy z#5*P?qY#mf80E~ESHK^RE~w4QR*#pNf1tKbRlf_;uVSysz16jpv2N^DLOsFXceQ*U zJ|Il45H=8_yx$RAY&|yU1d@%;Vyg(8>xtoq#{skn?dw)7FvVm+@^Cjg^$;Zt%=$U_ z)@_4ExP!`{L9ECI{?KdIo6}Cg+OISnYp|X$Eel@Qo0+_>kTJMHX%OaMGL^{)csH6s zrTY6kI4oDeIiteS`giy4{oQvDs8lCo{>G%vDRene0=Cf&Xkfk-Y}-eM{r5$@M1$P! z*`EfM7#AvfDb`9|nYcb!P3ZH~%q{wa9Zx7M%*vAh-jcywkwxBK^tIPuP)fl-FCOv2 zp4m3_1pTR)pBF4?p4|z83F|XR<&I1sZ8IG7FCsq+fq5q%uaG-JtzBRfXgf7#LVv*f%kgwuo$bI(_G@;NvuRniL{7kdR`rZ^P2H+oMku=xh5U$J=!=b5P|K8`0eb!pB|AX<3lZB zv2jGw*~0gRQ<6OS)shLz3Y&hrX;gwBy3G$uE>&mC_Wp!Nyp<+HYwTwbv+dA{&FmmI zGB`UUBcod-Tx0%CNEhzg?k#O1*L|p9p4k?nmq=y0?Eh@(;uK=+L+()Z#=+JjNe`G- z@v;rHs2(!g*4EW~xhZ~?)v5zdB0yeS9#IH7NlqLd4~>pV1wYa! zTS3?ApXL~I#aHxlk<$fH!#4(Q8GH4fTf~1Tyi%}s<;%e_f5+F32C6otz4!RtTYrPC z^UnV_&qv75yeQz9P?iKnZ9mBFL9Vwy^dVMIJt&n0_#Kr65 z`w|nApwmKk-;13dWli}{3r{#rSpmBjtIko}sOvs4#qjoF<~QToSHM@IoRqmwNMuH3 zrUwU!&|F7?9f(nEbct6mo!jnF9k_a<3z|)#Po?Q>>rTpBVr%8eC85JD6PzTs3|eDT zmWhRv@y5FU7SSQLZ%;7aqeN`mnBqSP1$?x37eCFf1WMj;=ve?k=9=K)I1;g8emuVN zSTfy$80^QC)d)P=B<0rv0n;haeRl3i98Kznyo2)r1xNqHRZnMfNB~7Q8J%zbZ5!GV zj(sw5es_9kx?H}f!w`5-c{DCNnw2kg$!nS0sYy=IaVZa59jVU+#<0B$cF_ch=kl+S z58k8_AEx?$Sow%bx)n_V|4b*1Xu{kJrO3CAjpvrE+9tAqkUncgH!Q;sxsYhHND? zXYPQe#M`QUMFpeG?1sYw6Jnk9TJ3eYZ#NqYy?Te=&F&=BSiJ^wn|NKU&r7y$$?QE| zMA%pZ_v6~rC*LH0<{Uei0DD@aaS;CH5R-r6>q8V0;j=5w+uo$vc0wHEG+=9oz4WRy z=Pq-Q?!cY}51sl|(W6x8Z0Y~)^l=5VRDjLN=GfM75XG~&G`G;2{NI)d6edU1cXW6@ zxRQKMOp1m&AT?f&IP)*|fB)gAKSt&du%jzw4c&L)ZQ%yH+5f0`9uiGX2Nt4wp1`fd z;3s{!i0jPXo*raQdJ?0H0oiZQLXzMkWqUpD590}w#=wKTN54M<-xeab2`1d6QG!<~ za9ckRW^juID9%KaYlpj$Gc3%6Fp~<9)Qd3yD1qy*{MdoYq>D~He_>3uQEECr53J|k z2s;RYzxU*^7uj z-xh6jEE;H-u2-79@LgWYzpU~}IQ9sBURiZI?Ko6h;WG9hh0k)^>>w6QA)hd-7GBp~ zMCfyi9SgTGI5+fD6_kC1J5Uu6$e9v0NE$lTgA{h4A)2cF-{C#pHVPVwp)}smHKX>I>?j?N=V3qoWfQ*HtNx3B zd)2o9)lYgeFrY+(_aiIj*1bIUB$vw!<0-Y&pzU3KHD$HrBG?yKp#!&U{jKtxu&M6C z^^UictfeTI!|wZ3yD|U~%)xVneX|h*TofTM4YLqP`Vuvpbz)D4Yxsh%lew}FZZ{m) z^&mJ8JpZ2X#$o1TR1Z}utH@q-+L~LyJ!1KI-J^2K>MXv(sTg>&bQ|FNLNlM-kLGGC z703-abD<1v2|8|d$@f>Z0*>JYNvdfjA9ZKeW#nY)y&w(wIVYBDK!l-|@{`(jglJDPQ2<*E!YePG_;=;+BYB2@UGWUbdXXkd${0CIw(tsp(bnlk zlFjK+2k{6hRiIsEkPKH%VFb}v+$PHHzK59?xNSdFtEeGQuH`C|>N%)yx4p>t3%k~F zWqF-WADzo{Tj49-bllh^y^ZLG?z4W)3{3mo?W|4{hp)vTc|dIaDqb+uoh6ttI$RHO z+y5T;3ySvym*HPWGX{mSsuvPe=EdaN=J_^deq=ztwdv;+oEzeVoL?6GIGcO)Y?DA1 zaf)BOX+#{}l<0ALN}t3?O~I=KJ>n|9o{?o=QD|2!@5JU661Hr#M_JVFF zf$>Jgee98+u9K^3R*7z%HK}@E!HR5IxDj!s7s;A{mU9@saHnc~JQKNXRs}95APj-2 z#(9zX)Ee84EQdRojY|AI(n@1*o_PzT=4%H>3 zAMejfQl37^MHD!dE=Vj%I%+ZjL|JXpZLdNV+wx?Xw|@2@i8#vPae zOE>^*4{gBP2iV=oHWm<&(0QgDJNyH+UaRJ^^GqUYi?E$3!3StgR`D++Yf~QKqqZc=Eh@enMWh4vgY17qp5*ujG z2Fkd-!q>g*cl|V+5)^|##QqK~mU~8ehh18-DeDILti42nIOwNA`zD-U3sZ~*vtB~qzFeJ|m zMws&H>>09w{Y!+_rA8KiiN%0dLmvM3U~4OWNIRTN^5KVo&zR#)Ow~rhy~gl$Mm#Bc zI>%c3Z0tnkb?0NY{>0f#jrhkr_}Qj543d1z-|$BsJ!JWr_C!CG{F7(d&EQ*YS_T7e zrOeHlFzU+`Pi1EC60xAag)<4Rd)U&*SOR)ZG3sh#>hJvOEuQ%2pe)=CkvU1xDUCf^ zMxO5pM`j!n8e1W-#|n4oP9uhaUblmCpj_lA2CR?T(Yx~Y{oz8&5U+Jg$qP@MGF@c6G91nk(S=e`6B(0wEvfCuRIjmg3PUpRs$SM*R z&E=pfI7CYb<~nv|{b&=7^EuN|uEE4!RSlYP$vx`)EUbY|t4{^v?CG?1q;-NZBezKQ zdpRNE@Km(Nr5yq`PcWQY+i40{x}8=FqJ=i~cK9VdI3 zvjOkfZ&}G!JJ=etUruHTJy#I&0B&%Gg>v+&>K8bYa=!q+EhU?^_OXj3>q}l)>?k^} z+&e_4o8xd>p+u7TAY>>fG9Vx9RVDnDAIc09`2#zZ5@ZGFKVt`s0RafuLkDa^Xs`D! zEUM$2ubeFORqceF9kqj+#UHTV=49;1uj{#nxLEbp8gDDRRo!St0|mXLE7KQYT4i>KQL51!dtgmy8Vxz zRC}gVRBaA2_xSkOFvm zP;W<{pQnkY4|YMVQPS*O~tk)0T)YL3}<7X}=IxDVUwkDF1*eGOwhk zTaZDU+~{$aXw=fmrLD?&$zXDi@6v?5nYg)<=z94OmxI@u_Oir;R^nl^ZlhJH{m+9s z{FZKz5|lpp&_ynkT`W%atrT2#ybJpory5EiePuhS64q4bl>k^};cMlBp)pX{CX40YbMFr^iCU)D@vg<^_>OZkn3yh*rt;N3@yEk$$K8q`c- zG7)dm(e`-iPL1y5>s%r~d)xrHYz9DyFy2Qtof#gse)jYzmwZG^A@IoYAB-r& z`xklrkb08q>@dNmo*AWW1ltXq)T*5mK4o8p&1vi&eGV)tEqugO$S@9qtKNU6ls3GSfI0Iz~lKO(Sb-Dga<_x3Ioo{Zu zS}*iEEZbdix7$95HwmdDn>5w1PB=aaOGO7x4O|Rq=OmJZfppXJA8KC})IX}4I-oXP zPT@Y+cRfbfT1)h-R5y)jgG$w#0UDwIY#sT-hQhGDe<-va(Myk_A!OeF^#v%; zCp7Y+`GRlZCXv0AR0VCU@yMIj#q2%h*^|_NOJ(WWSBd`D$(F2un4(0y7|{0w?a&hy zajfvq&%9LtNZP|x1MPS1%=JAKdh;`7i0OineNkRQ+`7wjir>pM+T#RTNAkvF?n$&- zS6Kt|od_GQ)b>P~pTqdNx@r12yVwSyL}j=0*GSjjKB`?Fyx8-j(#YEU>Mjo_S+S4} z)O>0d`u>Rm>fGS5n9TBcs(xY@{-z=u%W?CpJBh}|pq@Qb@Qol`SsS;+A*s)mNSIqv ztY%iNkTfvgB3`J~HLSO+4MlTJe|J@CvaiB*@kjtKwjUR29S4~LkGWZa3F^iwHqfi# z)wlYS%rPFV-}E-$%4dH5;9MoLHPr7F7+$-h00RI<$kF;)l{X#Kk+!b$ zm^bXV-cW^ISe)RxOCfp$h3Cl;$ejocQtjdNwf?B39VYQN0NtPW@hpb-z$A`Dxc>Fv z1pCfPEa-Qezxb){o~U~m`csyHMNvKvp}0o5^vCxH8MI{%yUL9D>^@RNq-knp(@X0q zO$5ZVRyN4pv-N18A>g$1M~I!21kdM5d&lV%{MoE~l6F!sZx1T)V;8yA+^{_UHiLV< z_-772-Kh}8-3E#b_uolFc{UF8zfb87Tok_ydg|hQZcVo zk(o%6kv7n9G*06{0 zXMC2A_ti~(bt1dN1vz4W+?(g9rr4>qHqC#2>vaGN8*VfTo-8rbb7}o_TE6Sb4XSdp2+B)QZQn0Um3-%xPZ7}ibqD5Xj;Df zS&g&0MFi(qTf<52^%`fSYQ}yuSlwwT&wD!#Q_$&>gHy?$>;&i%KyJfn9M-F6xvveI zoUpU|vXUJ|Z3=v-g&Q<)qqwo5VF6QYo*9Sb<` zKMCNtrxQ6j#v&rvdcBe_Weyj;bRyyAB?)H$ssT1nM$}^u&w{NDKt)1{lg65R~i#B-+J^dcx)FFM~&dh4ES{Q^g!(4H>c1p z{~E@v_X{tdrElZgBp;t)@*!eIi8yb^CcJyF2>%{#dJoI~AL)`df_*i@zgq`PXH61@ z?|fNkL*D7!W|qx`(7XB2zS(z7s65*5A3KsyW{q&{0o0jQQ*ZnpW3#Z|K>)VjWIw~I zcc}mw8Csq^E4Ds%a+=H*CJ{>*3)uaNYMM9*fqnm>cY^zjKk**IS~X0FaYp3P`qgGx z+jiwyXK<8l7w40Rc4F|79{i`hleU2CR0UQh5Ll=N>t9E@Ef_`7a^E?fH7H~|Ni+`a z4(j(r_;=zprw+2nb#77Kh`~kci7?#VR!oyvi}QW>d-t$_szPAxfH3@FFX?xxCIp&$ zdUpX_XnbaG4TKmpR_gkv!3%iV_u;lSLz=bylmyOuoxDKxe{_J)4d8u++ODKqC+i11 zSwxre8_ZzRK6HT(s=0ZrUyNpy6`*us(TZ*88L3(bDHDv3xIUKtTSN~Xyue2yuX;ne zFz@{~UVRI1H5yDF!uy*4q?tS(Xs}naOF;4-hsJfym9u;IqLqgOzUgaQPvHm|EO~E_ z&IczUF@G3KABgXcuUW$0SMwkzY55E(XC5R_wd}lWlp6a}Bp;A;iOTq}=q< z*p|{jp*R3ca8jYTg(0yG->)%ekV>uB@#wjSdlA~|6zEE@11I>`>86xx zPBF!J@+r}7G@2B*ZHsZ|pxSp9J2o~aevCR{mwo(&H!kF_wrV;nEH(?2NTdjM?ATLb zq`?bFXg67%_xVmz8tA1%MRqmES0LJOtDCeFERr?cTOYdN1vb4McsvU(dSY*mzCAL5 z45iF0>qyqJt_4NVn$Nlni75)9GAL`K3eR0U3Y?$&DOOk5UfX@wm1T+!o3lIZGz>S0 zZNQ%}qy1t7^f;qIK98QfM-@!IqPB15U=&%&%Jn??SI-k^M9zj|Np;?tt^RbS;ms3$kx@O zG>wvFBBE@Ov7{`6dK0qD3|+*CVF=fyP_|0KShI~?yNoMFWEmAM>sV%nSze!)_wD=J z_g{F=A26?(b6)41=kxKrKb~jluYQ>KzdR$%tI=jCYr~65sscf#A`we6oxO0tSU?Og za|3LY#0AJ2bivlD;PlpO>TV5Qe=b(dm=nV))6+RU1`JzN@!&#U$blOLr*Wdq zHz6LKhWsZvNnvEMK!F=qm5J>cy8D@c6yAs*e{QlO)vy3u9!9Lcr5j3$4^|MJ8$U~6 zcBCwe5uFTB3juEhF#rWILU2{e#LuYX z63ZWzAM#CQz@%d*59XYZxZ3kYL2|PY+(bxjHHs9`_FbnYVLP|11-$bh;vu<{=w`7RiW+d2%Jgjpr!FRe$&y8N zh@tL(2+v<^?m>YL5};?g&~&x7YT>l74O{-YqwKeuIZ&SBm*|`6XXd8ZKqo4|oIa_^ zQ|1u7b93W3Y!p+(4h(EJ5XVc^&488`GpEpNr)Eq6AYWP-|HD&o`WdO?y&m`6TvHAF zSwr*ksA=u00>q~1mYmNs9Iwap+|MgHyg51s!zC~K+}+Lh?~*z+S{pgmOJpylKh_^e zn~R4ugB5-119Et{kGNTA^3Sjt32VIMVQ5mBE|7QQ$6k2don%RhT6!-;AjYD0qEN)N zpGJ}!XEE<*7$tMzBs2zkq7R7=&hOX-Sk(lAO+#MQU>?*xZ&d5BL|`12Lgd>z+09eF(edwxRif@D*@psg=^ z_q)B97AqOQ^xM=(n_Z@Gl~Ln~BEPO~CAi?5M~$7ew7F5taoSzR2D)z>nTD(t1wPpp zSOGs5(MD}ED6r%1e^?*Q;{%`k988&{gpoE4vb3JayzgYx-ZDQ&+@JQ#WT?gr1wn+& zwWSnZ&{6v4g4;np5_4{i_y+luX7uL!o?<~q_Gv?3ehBGHdNbHs3O?$co_?WnX-NU? zDC=yHfli5!d;djz!1@!#ohoRR7hU=4)mn8sN8h;ey1<&Z>^AkWI`uK!zGfV*zOXn7 zO#p!Bg`({Rz8a1F`q2`(JgFy>c#M>IKy$%te=7Z%jfl&kgt$>SsG9%1W+v)FsrfXYQF?}H^k$Ki#yB&@#!D1jM0bm*;_7d4f!aUO-%SU6A%B9CN9uBLl+ zmDwm_p9Y$zVWK6Xn@dHl)|*r;@dMUNQZ_N+XP+rpc87VQMe)$+Ul+I{y_)?TVCO4t zM?EiX>NoK@fvvV0)P;a_9tNEbC_*K6n@ukn$##gE;l450iHbWeW~=|8)TevE_Drw? zD2o}e)hq|4P3$e&L1SNBVqg0Ki;G0!5rCyECo#X*>uf{PlzoN>-w7j{XZbuTG%miR zv^sUbps(?c4OPm&I;n5t3QCH=<9glQXL^o~yGEV!V^DtC@H6@ck3K|kPuS{Lyrgny*>NKRfo)X5-?B)0mWhzhl^u)Ff?YBE5=rUXT zG15b~Bjcl&Le;59-x8W$p@-Me)~mNj|v zuB(bd$3^NNT0eA2NeAdmYYYP(Q1+c(1Rp%09q+95V9vJ1IGK+e&e*PGXil|O;9!kD zil9+ienmsP(+tbYaRPajdb(C|o=4V{7T#6po5I8ZQfWm$bp6)mMlBtus|2+K&aQ&t zjP2QFH{h?8r}DJgBZwf}ZdFctBj;zC@bo@6pBLmLjn&6;k8# zZQF6?Z2ihZBd+uJnEfwr-{}*xTDbpo=!G_?zX2Ve$&(goOK*iQnMxT(Xn;}&Z--CxH~}*mAAA|^r!pTBfjp?ASqbBj*UEM zGgdq8HZjuR>!@4)=ba_=S)+6sORL?DI@rJbO-Q)&AEoOVj)J?vpMyc1fOmAFeY@F9 zY1ZSRcedi3G9Ug+jkQ>Yv!!Of{l?=H`!Y~59}0Pa`CsoS+bo*485?fr#oQIMWs8u! z)Jo2IskMU$W%<7ef}(B`cV^nU>Cl-xoKozszr)M@kq41OhXiuTi+v^Ek~#AhAzH-O zKn|e|r&xRALwVfx->U-yEZvozqJ)Fr#PGHwWR%Gpox?yR=BCYmi(cS$HViMDhpBun z&FXfe9WfAcy>4-CYwZo>Uy|Ir?AC*9AGte{d9k%!&o|eXho-aYlN4Meu74!)A28zI zTS;vm3T%tW1NYfgxd<(Jd>X7xZXe{R+O)V(7nd5bxoic}m+@?*Xk84sZ<4qz*edfW z$WBl%C zseBDHhQdfC`eu8)Am_szu42wGj4?^O+As+wXafV|DNGA&esFnMmf@k&Oc_8alZ&>p|ex6;F!@(J;&Rg0v?gyTxnO$NV3 zmzt-Cg}!8O<{~(C#?PQA55Ah9ItT%)n;Ky7NXGnFch?dKEsX%&BVhg}Wvb#CaK&9F zKjyx;zDPvf++pQQ1ZK?NeG9rJbEDZ{LSF=wNn4&=KZGdHMkp+g4l+moP%7V&b$@Nk z;o*PeiV5B*2Mivq)m=n&Kg#ukl*0|cP|Fr_IE+KQV)<=b3$ z?tmQ7de>hA0GNOA9DysjKOc|GR~{W(9QX4l-XITfCc3)jYmdV`UT4dNcIePg*YtZS z@f`gbMr3w{W~P*~HAl`}ptzoQIz3#8#^TbxeiSqRLDOLlD8A&adZukV*zTC5MPWS$ z#m%42FJI=w#Y`UC=o}A?_F}@ku@i5|iL1LIuL$AwehFwJBO}ECXJ+06sp?-3cc)V| z7r)M>$&cBd3*+t%I9omQjo$0>95767%_q=Ux&+^Ei41%H+FjanUvrYv2 zmzM6bUvTg_`YOvlBRoaRhQyMXB|~4;cdY zTVc>F_~M>SI#s8mKU9;)&D;ekpJK#gnBhA_w*RyFy`fEK`D)~TG}0Cphm8v2R*eNe zb~*Z-L2+xtyQZg7$QK*}Ik=XvOiAql-?a`Tz3s~ zc@S&ib8z=*;FHO=+NK~$wtX%{QKuqLtX~S2&{G1Mz5|hDG>b{!T%6C zXq{Bt?(_gm8sUt7cG+@`?6u{@jEcd|{cNJSTEF8NOu5EJ+8wToKW79ukHrhd8d%|v z?jzz(TL{#=Yy4{;1TZW)a4Lv@Y{Ae53%XkEW}%cb5Lu=myl&-{bpk*fjNX8A5&09! zzWZthz(ZqxZ^%agM6m4do&>~0{>0|Ig)xsh841I8u`q1Q@*gB(K6PHcL6? zPf>U20Nj!Wr-=1EQmftcjdyyC)~&E8iw8&W2*d-Xt7`Y4KhsaC+b`$b?x6QC&e%p`pfA3oel)}0U?oQR-*x}L&&yTc% z;bS~k_aR*);C^+D5f=*G+Kffq&89_A#1G}0>1qG1sv|z}4+EvW=d?q%Vde|Wx)53u zdAmq3_#(V(r{o!8rz+ z>{j_q{paw7i?C+n&<0xpJu&kI#kIEA`J>l>OHHi0w@^DQ1&hD57ja5xau&Ky7I2N) zUWL5X3cHgq9MmC*8tuEY7J)wVvPhZ2s!Q(qJobUoH{Sup$K?X`ZiSl_Z2iUr53Q$< zwQ=pqUWLkarO+z!wXtXm`xKK{U3bL%ar#>3@**6>YGq$e6M5bqCoq~;1>}63U7iz% z#P(aUXXPyjtdCWf@0dd1c3=FkJaBqe5MVw_G6ZBTYq5XZBU%GBnu}6I&mJ)wtLUHl zye;mJtPolcA$6dsKSYPn| zS-kuOxnblEDOVeTq!(F5cxG;~w}Yl_-Pa+Z9XU2j*_(a;LFtA;BjoONKKbu$Pk|So z2wee9vONXleF>$znx8rOt1y6~%8k)OR8dBcH(@BqH5k44YwHHe?q9?dHRoGTSIB)-{}>?rUO_{ne`nH?S!vmR8H6Sz1rURfWa&R|bvE`u+< zqpwN;=Ue!UrB)Zr{ckjTmc|c{%r@sj{70`Bkw3G z#{Fzfo;K@4%!4-R;^t-IGOKmgq;jZ|UFYb%Hi&P(XBoL|1Qrs3Asq(GOD&9juOxqM zm=QsrJm+tbu=p8Z%)HR_C!NfYsABL^HD(3Hy`*HHGRaVzr{LeNVCQ*@X=_ zFVEVs1p#=QCgH*aex)s(tQRvL&_jtFvlJ(st4xhr2CvL|C`cg z^%(*=?%k(qjH22~t^0HEO&4eREdeTR+Da*5Y2#N9P3InltE4*$L5}~_KaFqb@96nR zeX~kne^ZfJor!JLj=_#qfAHhoZG1X@AMYW$=MA-rK&x=PWCp%c4wrSWUjH`gbMpULy^p8*v32_i$cXs3B5WCDLVL^)`lVJb@MSdnb4M38^Y^Xmk|x!Jix;C7R(nR)pSAj*ly`ZoDevC8lnyyl#wQzvcVd52TP@d2pkO$gBJtzVg;(+r=X7Hso!qPfY z|NH!v<7;_`hFIH)qKn`WJJjo<+0?}r>6?Rh|&{kREWvYZWMO}g38Ky zNFoIp>B*JL<1Nu@r_Z9$s#o{k48By1fDCbEoXHl;rR>`Stk?lL%SpNFsL5`JzsGTB z;r9hhQ5>#^&La?)HrlLH&X21rrDXVa{`H6}2psL`3;QD57*ky|vC&sdaD?bD=NYuq z#AtdUzl=S|O)QO~<>1+2CZaW#>w&80WNFq3N39>ZYQ=Y9nbpS!z+M~Rs?^u@7x;gg zm%YQv4o@7{;j6|jebCu!erb&wP~;D39AVYxBPSdz@y|8fD;sU53lBg*WM5=BRx5rr zqf#s`KopA2!#qXtO_*FQ!~~q;&ZQtnBwAd#*rMpFC`-nwKj~bHAWjqjS_5jufp7UD z=7E+8CkjN2%URfH4<+qP7a4n^XL@f<&gM^5UYc>$DgX4AZfI|68n8T;uY0%QX6XL( zKEW&@JueRPXzIn*&E?xf+`-Cr$m~LhAEdx#s>9#?=9K$=sGUr01s50J|R zsMxp7~HnLMuQ-J~@FZ zBKqRVJdk`J_n%MBftCPT(Nu0t=Ln$I_;ZQ~x}tVARJlvgn?vrSNK9X{m~|k*LvS~= zU1~Bwy`|zIE0VoPPpK!r)|-!()_SDE zJFkZDO%eFC+0P`y)S}^94K=$;DuYC)dG{w)@nPsKwtbi~ytAnlTsa-?I^p{H7EIkb)N`~XI06;==_l^M5GWfXW$YQ=RzlZj* zvFIp2ptcVUC@$Z82Smt}6{o<3-+Els0b| zy(HXOzZQ&Cb{2t>xf&>%`jw9Fe#P|Pa?CmAB5qnPCUW|T0~CyTebzxLI=o)r?)pAipStRR%^#m*K#O4}P7OTmU-;YCnY_omhz5%E^~7w1ucuaMerbiR3Ty?R1@O_{v2qu& zOCBB5TXBBGf1!isl*w~6M-t|5&p}s+8H5rEN$7Z4ntJSnR`oC8X@T7w3z>$1P3z7& zT}GhP8iIJOv;4qVFuN>09EakM`_bkd#Ort!Czz8St5pR@LeD*lOLQ)+Z4IidMV{!u zIZ`=P!COY(zgfvXKB<(_PH8U;sJ)&pJWd!BGw)frc%QB|mjFfPUxW?5)jE1uM!-H% zMWRd60hB>$xK=whqeu?GBkE}{KM%}u5=^(Fe%D+N3w)1z2ysU7vCLQ_5_r>W@dW#q zS`{nrBYwHvN1{*(4GHuOKc_JIj`~L#YBhVj3owej6DeC>gk=TbArTksDcxIb7{09n z?)fxo898QUsoQyc7@31$mSdFEmx0~1J@XI{6wd!>1Hd&F!bu(4p_IH*T=pjYU~CAr z+o5kBv9LWB+n_;tk7Dpsu@1`u6gES+VB>$bJ>vgcVQ6}z8{rfC5Lnv{w{aPRHdEP2oW706A{zr zL!K$2-EAvMsPkDs4wzK>z(gYMbca3R0}n;Q`tW8N;3XnGoG(p5xa-%JMi;BkJFLOY zZuYcMT&TFmo025B)JR+=1uP!dhA(Ba^EP@u zlKxLE+m-a@B}Hev3yu;lerUS7K$GcV( z`@wO|FH^p?=(J{idV>t2cMwepBq@GtOb92lIsRR7{_Is%MA5SM?cFlbk*p_(ucS?? z6{alE)5r_=<*3OK!gK0y$=a!!1@GXJ4VwdW%0|$8oY5DCTI#a8T;l6J$3yIrt3f3X zah(uB*HFGET?$aFIQ%`F;5GrnKi6ds4Nb>pBBuYu%!m5up8-4bVV!@_P3FdMW$#9W zUc7z*HOxTtP|6U}Kjt9%?Pl-%SzD^p;GMt&o=$DpfJB)2b+@&)qx>>$BMaWXwuw?LoL-VQ5n48&%LB^{hz0BesRrh1uOeOUygmsYe(ax0h*g z6BtId954u}#V!nFTZfH0RQ-80Tn_8JU@!3E>CItZq#7YRLP>1?F-MF4z27J9rS+$M z?=VYhEQaE62yj}(P0=4`h~{11hFc#0cZ2TmFK^YIE0?M{kobeKlEOguvVPfcrFsWn z0&!ue>dejct%}QX1r-CVp0VTm(JIHZ3j#UOJNcvCP|I>f?vTwU_#>gB0q-phalk^~-EYDbW3Ri=rfzKL-ueX|ewC-x z-B1ZDy?N-eiTd`q^0`6Q?*MMa=>ls5`y0V8E|UpSKIl{ZA#fbUFd|0EL(LnGQ|hmj z!%xcHW#4HGxE*uR-?~}x;IX@poSx%o^d|$zRcS4O3B>3C$nD9^SIv_P6mgN|XB?cW zAZ(oX0@lMn7h`pPnbwHE2~$kH_myz|hMBxd&gQ=d33yUOPd-$?haczJc|bzFx;)eX z(Mfq9pJpO;CO~p4VjXLN$a>M9L2sdwB77oIrvCa56o$;b=U3m1@8=wAJ%(3G4wWw$ z2r_N+td%SkDR&TG7$01S)sr0P`{%Fsgzyg~-yaDsu%*o8gJlmx& z8+9S?Ax4Gp9SgpoS*!V)oK_F~M(7khdOoeeqx^3X`Xa*9yZZ4L@xa!Wp-_lObZnU2 zoTWdBd(-!Og?6rG?7M+d)i`+>bqH7HqUNJ0Pw316zhbJ@Elg-lT4na zv*$iTRC@B`%knTg;#*U%#TApVxUa83S%7)bfca2K<_|UPJH8WB`#F-;bJh3m<_gJ5 z3YT4=7M#L`d>T!rLCt~~`(nQmmIo~*=5tUyPRRF>675S z1quo4mJ>RrE((^8C;CC^>p5hI;HdwAU}J)+a~cl1RQVEhjDas{RIDM&%wK%=Tk^n@ zU6<%RMr+i*YbAaX&~i8qA+G~4^JB|3AIq~hlSfT+kk1#AM$#mnY_h(T*COi~WbXso z_{-J9S|_+Jjo6S+Q)ii+<&NJ+R}+@UuGF+2j^XENwq$G5d z5-doEP=kOF2#^Fqo*(be_doOBndiBid7i!7z1!K@d+qH*ds}NxHc>VJ065Q`wYUrb z(Bm$EW??#h$2$FBKW2TllwQCQtpZzo7*I4Drm+Q`r}|?fn^FhB0W@f7Z8ndWE;hlwpy@$|h({UrS%k zmL(8seOmuynVMybmzc{kWUDRugKaHl4Se5Dnv1>LWIj4U*bJ<0xqIfp+BE6k5$QfJ?BSTfm1Z?1;ppR*9?wvc3}VJ zyk;n(g?VDpKwusWy<*$kV{f?M^eaC>DZU$IAUpW{g$_}L!}Uwakp-k9FcXSw7V4=V)y!>o{{pq}Vl^UwoVq4)20 zkJc@hV4s_Z$4A;~gDB3MPq%ApON~#^OTC%cnl{JxPWMZ5FV1mvyeGLc!lbucz&?g5 z6O(iXEJr4K_DNe$zeMXVSU&c_K0WoIR0aOvB&~xkv2UW@ip0&X8&1W}zu4FJIZ;+dBMcG8+*jOF6`H)a<}}in-e}ru)1O|X z9#ZEtXSjL5&u)ww!oU=?wAcm}v2~d|bH|O)Bah!6Fk(5Qt08$ek$OkFdAM?<)HzF& zg6Nwa=o{#&9e8keJiN4RqV5})dYxCgj2^w{7iL(ooOJS}Bu*{TZfnIyE7oYDCPYdJ z{1U?Cpv&^6?)PUK;cRUvt@Mg1ea<5!PJNlC32HwE@nEGsrL+N}!EzYQVRR%}#_&mm z6RnU7O#nPDJW@ayb+a%beHhUMM5!hy#MGHvx8IYGpv(oPcr2h!i^kXI5ZqR0Q%zi~ zcR8C*WNsBp&i~T}AF)TpbgmvgXQVu3+bPY$@-PN{Bl}i+IbKfOz>xN}b)*S<$lzz#dhpfwC1pL!9?<8gj%? zF?Ra{Rf5RLi@l(J;U}T-Wx*85pGF4A~4>cJ+4<>H#e(o0Ls*;uy)j1OuM zvEIP;N;3q44mvm~`O83?4P;l^x7?vM=wIyTTgpdv26bZ*HJkz%i44HBW9!ZPpg~3c zbh#>H@D~$DOz;Q9N+zi-pUdLp*|`gq%wY2cvMgg#s1(KbSx&xvkLDpiI^X%C&!1l^ zRqri#=;Rjhoc39ZJSkZ6Q&zdmFEt+q!N*E5MBH~2rrO=@WEViIV8I5J1@^wC!P(*~ z5_3dxiU%!u`B2a^rtan0v{LZH#cwA#>vCk<4#Js(vx8-WiF41X0D6zWDpkN<62>$B zM0Q8|;3)R(t`O`UgpPXeKk9f6=*EIuMUMg}yG!)SHS7v71dQm)1G(}Guh^13@`#x9 z$cBZhBA~U!=1r0t6^vH)2pE5ka!5XL9ew>#(mc&PIN`}a<+xswz2KMOUvMGlxMq`9BbXv)W3@~cWLKJg|s zP;&Wh*z-T*>{e}7K)bqZ>T{l^Z);|13N_8}q*H0?8U1|#!#%UAHX;q0}=v&4zI=C&ylCzyS3_~Aw{zXaC6fK!+i{5;1|88GuJJ6O;|L|(my zMJo1GZpy3d*YaFOQ~|w*{aeofd&{7VG@AO(?*4=?kp*)~w)ENR8NDw6{t3{9oCUj~ z$g0I+`s|OlgY%>2loNe$#*c{%*rT&ZqX{`Jk zj~w8khjc(yT)oy9gjX5T_V8645geg|hA}A;A8=p{l|fm6UPxh?FHg(p`Xc_NF9KU= zF;C!%KGK>3=efkJiz<0t8L>~Jl(OHmANzgW*tHeL`)N{M5E4=4dQ`Kw%r)LmjGI@9 zQq~D#)8WuXw6PvN;2uTR0Wzx#+p<3e_&xJ{IS0N?i+LFl!0J^GMHMcVp12+L`}4Hc zG)5p-s3r9A0{>m*VJ4{+-HO%wPWU06bHF;xf)Y0MfW|C(gjL~R2wng% zVZ7#hCHLx7m73v=c~@>g+%aKHgE0J075V64LmRiKBG9@1;uc5Q!Dq{Ie67pv%7}o( z(sN8mXQ2KpYXn{U3Z1+64A^X;g7m$!*V5~X>h9DG4C(0L%?1gjg6M2+nv zGLQStap$6559AQZ=0Y+kbRKs`KUND!*DIVQ)7;y0I_v zT0}Gl?WW@Im}_Vh7w1Yn&+mqNH;6jHtmspo-dVjx@BXs!cez+DjSA*YSrvB;zy&yM zfBG$a;HaW5Nnh=+4*Y`3Z-~zK% zFX}1>&_iU8d~ZXnxH9ahFk@)3Bp`eL6DQC>(>nEi!CuPV(F^|y?k2(_A}!1ia0M!* zN{{ZMKk){t?19!NqUtkuTwQO~VlGCyBptQ_NTCj`u!Y8-&I%Jj55J)eZ?F4UPz5Ww zGR$dy9f%x=txeg!?>BFxw-xdU2ijA3qqqBzc~$FE_``m3|ADon)KY4vk-nEAgELc7 z3Z79~C7E2)Fa|R(+s*t2I41*5{jJD7Y@l|nAD>99*_{&4y_0!6TWzNM!1i_aq{lpU z?X>k0j`roXTUr#N0%RU@onFphwDn90y}q%{W*8s}TmLM#HLnZu%+H+fl@tokzHXDx zSYmgE$%A9%R{o|aKiG>!sW72mDgq-JQb&}ltY^yvd?$KkecmKa6fT7X06UiqGu)8p zAytWh{%9-mg}+OstaB+Le^JWu>{n5GtV7y5tUyIvI2TC!$r52aIvvD5t5u6KrV!!;iuFT#pU%lsD1N{kuiM9Q zsAl;0l=^wp)tj=J6 zDfSJ-KJB?jKM9p~U)H1;bDYe!z>6|lAv;fvlpZw+GLh?N>8haN`c=?K}q zFf1=_-;c`aL@8ctV3kj>=a!V<(IXdA7ZRZBC;stJ{=pAa;y0to8Vbz15m~N(pJM|ySQp9?kv;bwdd*AZJnNg z!W`%h0RKkPm1=N@QmgVbaco{$crzeK@^P)ICB!kgGdsAcwskN^%6AB11SG}3BY9tC zMDj;KmmQmj%}(_q#9n_tGT(?imWoSZYTAh|hXv0+KfIU-cKtn2PCp*rO-<)>1D)ll z^S;=Z*ItDl&hX&D*yUu=UsZGJ_c+kts~INSu1w4|Qt37I1Ir9Ixr>?YKa$dRj~Fce}RS9|WlzNQ0d&+JNXb>UKx~#aa}8Z3e81ORMcum)$v=ORgeDYOJA1@=T*%4CS^4A;8uFs=bW3N z*w?(gK-Y?ch;M3EVVYi}(=ejeD)P#eCF_5)U&^b5dF5fP3bV~wKBgji6hsR8K#`<#IEWAQGV?LQB#8N`Y`%$G`P5q2MwfZKDe*)X-WvtU?8?E0#Me-cNsPi z@A~l2&hPxd?ar_k#ZL|wwO(-f9sjIGa1SPW$^(wyF>!lYx4frYWOn}A2HFH!G9s5D z>DjNT!N^eGLQ%^HhlT{GwPiawT>ySWRLDPwt{~=475Y**O!BbqESC_~z+e3J&x-(Y>}&q-xI-9^!O$|L=C~B-ou>x(%Q1 zvZKFOps+eW6(#fpzcS~P9O5Iz>0*zQpI{Z~xWMn>;iwzes~ySW$+-7Ye%1VJmY+rb zwOv|?16PY^U)34z>xLY42`9Q^r#4g9l{o8R z61j@8w*3PVwAo-CX1_arNCB@@Y+U;ok4?d_@hsDpIxYD;C;IysN&|HD8R+yd%N#=d zge>mVzH7H(H>cJ<2P#iX+VV(mG~`xGAAL5X3oy!QFo8v1{3UfjK6wZUw}ZK6Lw6zh z|8*(_t@vk3BL*zFSnXnRGThfV8FE`sI*sArkv@x@@J~bn;nJr~`=gKc#$_{seM)f= zFzNwmP6sMEB3^{z1m)>tEcj=Q(^oHEFK?TqZedK4z>>-E^d=T({n5|3_^24qdHA_#KUn>%6^8@*oFgi#`4l zt#mGbz2?AmJDeB%02}ao0S48GYU4552_Q-Tr!XGjxkqcf)dk|X8HHuQt&slMmqp;H zF5q!Tr>a5ro}%NOtWUrNlSL?J!?*|QPV|vMX_mn=oZojl3^{RubLayCc*z5N&1CA; z`Exz|Z5K+0O@jeWnPEOjALGRf(Yj!+p)@a-KYI&c0S|3zEBwq04RG=GDLyMw&gqep zG+)1yU}{Gk>X{}F z8AlbLsw>R>Uf0?MQmY<7A+f;|6#23D^sZM7VN4GGywcxDcsso_TEq+baVEuiQi20! z^l9OL9)X9anUZhE#HN#q?yuYEJssns5?B}KNe;9=T1E)N+YVF-c{o*(!97s`)!UD1 z-~=oOlB4x`0f;7tZ9M!Jp$!*(A%c7OuTYwY>e^$M^vWE9%c7KUCB>FOrtCXA+Nz9O zr5j9B#I8|sQM5)FEe|+LtCgvLE&F*IA(W8Sg=*)bnNNiJi?95Fes!T4HWs4-U>Sbr z%FCa`A7WXCT7oHoRhnSHK|sF@aZZ(=HW3jj&&+!GgL1cd?VcTc;OiZ6egSDp5( zo;T=U46+4_4~l3$#=AG#p3V&04TjwF>`EH-`jHG1FcL8?M5R6>mga-s%k@GL+jC*G zkmrg^OR*Kkx3}A_)5({vyev4B$e{C6;5Y0#DdXn0QZG&LQcQ&$^O(=Qw8nqbms7jS zH|ZY&0QBwG(1;exVMwrA0ejc(cu_hGeeN#be0c&~Qu-)yQccJ~emeH{DW&))tN?M? z(_1wM@`SCO4_^P-daz>O@fMbx0{12Z&=@v?d`(;yU80`gWBqLyRTvzo(Gs9V{M zkEx~mP+|DdAwy(Mjv?%U2i~j{a{`O<;-m(OfxvbxW7!)TVRRXDDG~y_`5-vP_4OG` zPn0@3I+=W!3_mNr6rTQ~%*?o)IkD3uQ2`pC1gZGs8GLD{^@<9>D)iprE?^-8)G^#{ znHi8fMzlOV<7yAjY>7cWtYE?)&$>9!obcetefkG^;C;FenRUoRV=R&$;wEU;Y(94w z934P$KS}M(dMFMa5!IC|`8ixg#tR9jrN_L2(kU3lM4M29;3C^ZSo$OTadHhJuS!f*dVl5z`4R+o3=$-FDE&I%%ez zmA*~Cs!si&>%| zXTT+iwR7w{rJ0x~iGFA-q5{>*gT~ET(v;)09zpVU=9s_8`p(1YPYa^bEyK}ElR4es zT2RYk>6KQKoj#g5Q~lT@u;9hv%)pDUtuxn#Q9WH?urRRDdC%->6JV!hg!!Fq`Z48k z!t%8l8cs3m;>Hg83LI}d@BvE@T=|+PEdW--f!Q~{VOzxZWE+6rjq9V z?civJB9|>8_K~+miK6F^g3i8RH;=VBJLL^bo&!U%bhspn{!<$$6wo$dr z(}B&ODu}2Bl-BOn*i%=Bz^5&s4E<7h&Soyy&PERmAX9{{(5c@kwX&j@SkUU1-70)w z=qmuNuNe%#EQ$x;du%G*=KRI+85%ubR#k`tg~TpC&3kjMTTQiLxdh(ozHKqkg*gXQ z<)ipv!y;h2@#(wT8k#QrZ^sB2#T`^m*QTKfcuGI+Hlew=SK_J^GnM(23h>e%Fd7qc z;8?j5Upa)ds0`2oURbnfm8t&x)wE+bB3E-{LqOQJ1af zdm`S)aMREls{eb~6Gfbpl_(1_kQxFzQfC{TjRt9pjRjUjDbwG2>;j03%c*^LK8~Bu z&Is-@uyw31=I+M~i$ME%%!F4-h_^;RjqBg_l{JFL5oK_>Xg+Em-&YncOZu9U)~BVQg{vLSm=4o`UVFr3MR8FXI7dPZb#kdMPzpSPSVE4 z$o#p{R|3O5BJVaSj0E!LDo?NF85|7v4At#a_+&ghyt-4Xh3B~^F!E#fE6*d)|D?&U zm*HoaHUqY1d@Z5_iBt(5YGEFNHmawa5#qkuI7*zpa)Z980q`qaVL++~wG6S$ShykB zlJze>6`>Nw@l8c(;$|*JDd{?2p~hRw+4aERn?iT+w4X{KQF=>2M`u?V2d5BM_- zihxn5XqO-|p4xZAiL2BHw`B(P5C&)Jw4sJ-uj*zyj(@10&MG3LpGB zq63WM`&4*XSVROg-N{885h-cY^0K$4gz}Msc(=$SzjezT93H6uyT^XR0{Y#()^Ho6 zOOvwu9@nu+n%@`KF~ujIsDJjCbv0X|h)4P)^CJwIu~nTXx8+Ro90w7E9;#^3y^b|( z7Qf8~6d3m#^(x&;0?TMJ9QvuD$CC}1IGH22;@#kq$qeX)hI)~68B75CGoiiOP-4?* zVc;0mcmwEHZ0t!d(_BHNgdlhvtK(9ro^2b^FDq++e!UudNG4 zQ0X%#h!G3Yja0ZvEAw1=aL4*L&(;?%kMp|!u&(Z?Nx-UxYI^!TctP0l05m6dBXLVTJ%wDgoubtPQA~%00AKh17P^v*9_gQ zK$4HS@vH3sc|Q!#!2)_2hx0u0UHMjC$-%~~l)}Uc2+~Er(3bG-o9?z+fTIu-|EHZN zsV8nfVA9KA+s?T?Qmncj?Slr38GzxI3Hj!^#|5OvgrAX;J_75<2jELqkTO7HOzQk4 zso)!vSUKy+y7vqhzMj$L3K~>?w}8r~%x(STTyQ+uHqzVS^-p^d5sc~8!ZQ>-^`V9E z-xdY~oCaG;XRY&@NwFQ6naUQ##E%8A39+)q$3qoqpO1F~b^?frhG0`B#H$%h)gdzQ z5xxA5hmQ{Fdc-E5TB`SIFX1L6%N}Py@7|I z*lnMmZZ7ST5HMH-5NE{tG`gCyFhE<8UuaE=>?dz>6O&d>!&Ewlc8!O1Jc}l4C%c8B zV>uhNY?!c<>;TJ6=L1erSk++LNBMZS&5YBL230tkAH(Xh>`qkUPmga52!4QnNGJFh zC(1(eZOdoH2ke&U{fS+DDl%VlPlICcJn0M{cq8-03vZ7#^48hjxvwPftk%u|C6%ZD z4BCkcl41MyGmNz_m+EUCRH~zpaOI)q_8WalEnN!>iPF2D^N)9>?dXL!)s$lXtm|g_^oLCWh;q=6D$GcVT+9rsU!w6JiOg5(MojvB17dw>KV4C7F7MeM zNy1E_=`JwWWpLV+Ca@zp73zPP?w8)#MpGG`&;SQ@!a0&Wtdm%L&4QitWUbOzh_uw; zzMfmpj&9|Na{W_%8^`-69`y&}Jdw*xArRZcImS)>C)OjixSJkvV@T&KG_^0&HDou% z6+vO{ykj$A1GqWZ0~I1e?04+x3;BRcGRw@oGnar2yqmzyYf{S@QFsoxXbptUEx}ZF zzni%##=z;<(g@zI)SG6u$~sk&7O#MtgdegWtqoy(35wg8xbekIK!zTc`)TD2j|D_S zSAVT9*SMAvNk@zYxBU_*^4U&`^Rk>TiBr=6!=KT5T9@-Vy>-Qtip4F7@V=Z^sg-&F zv3&>3sli70y3+b?0sM?WAd8IEcg|sGk|}lo=^9pyGYC-^)=160KW2@Lmf2yl!Ox8$G`AH8i66VF1B|6$tAp{ z*~xaD5J7#OcfZI~$JdwJ8o=M|NjKaV|0Ky%CfA2(ZyCEAYZ5RQ%^wK{(PaA%$2tIe z6?ZX?1({v3FBX~XrrpUTQ)%`n#W=-qH?5y#j`dA!NsmnQu2aJ?k2%nLJU}}|om~+U z9El$;q;(B6b+E$up_ZqByE;s^Wy{xzYvug*((=R37Mms1Kt@LvmFGVyY7yRZ2BVUD zVrw^nA4(yn)XIRnJ3yJ8lr@v0c(^=C!r|8kHoE*#W zS2?e&(*O^udlIy)zzR_3@xiG#R&tLqQFkFExB*&1aa+RH@O8ai1BE;+J?8JRDQVv8 zmTKGU#rXG)K_jfXDIX?6*W8h6fs_d+C6+Uo><)|X(E*vP^Ucw6}vGuVW z3aROf0PA^N+>O3T>cAp5{ztb`$grj7vt{1Mbx*Z@*GzZdx0YO}QF7n}yLYm*H+N7s z3tPLVB*J8|5}yB15Us>Z9>pX0d6w#fl=1v&Sr8d|cvC31P>PvteKm{Defqiwpcn;q z$M18@EHrU?fA*HcetEoCIu%^5X3;%cx)S4~wLI50ew@w70RYhKJYXi)Y-|xWj_fA* zFGc2XZv}U+hHSH=C!-R?c{*t;wk6yP)5vsox&}dp5-drR+x&oFlAPx^ylW8gE@B{C zq!&@k8xOIEExRkgke7C$-37Nb%j?!+G`Ua3T~oyCPjM?&>v5gk+RvEyv28FA0 z!P%4Jo{_9Pda#6bIY2i_1|4}6be^#eqF6J+rv=6NoucW9g9=Tfvb?Jl7TsnOk8i45 zHM#RndN9DbhM@_`AlU9i2M7>@4RZ3RGPv0z2lLP^DO>Q&7sa3De&zGzNKtUzxm)2w zDKO5x2pryLQGz{TT*!n3e~Rafi;X+PPd_|NqabqABPRYD4!=n;_>Idg5hb}h9j{gm z!?^N>yS+3=e)GL6_qeMpsNr^b9OwyFG(EMKuzjyKFak2xw8;OBlo7&FyqbQdMT%j~ zcpUFbz&>vYh1<0D^&!~0r2GdW_SCoCqhY`*E4ui3BM0J4)t`*&8%__lzX64xfQZu% z_U`8D>8pX~w)=*_3t1o|+tJI3fj4rr7RTX-Vju!@rxbT7xYVD6 zehGFhu+kcocG(P8SdMAGRb-%1xUzgS?PtJpH-~xh>=-NPC&upF`z|wXCfntu&XJe} z;Gf1aVlvjs*m9`!3S|}@AM@(Axcso+V&$sTYb!JYRpoaZq=|EuOTK?N?v@6FA%?cgmZGrjMGHSz&YO8Mcdl=Gzp3obmB|I_ zaie^nt)%TErPhxVc?k$I?R$8OWBOiCd}%$dz`tyIycW38$bL}=SkKs8ifz(~?BuOs z6k~^fd8potxwk4SC^GI}dd)53RRrXLnR^h(7_gW@-?aO5cI1Vw8oiX2t{jl*{|V>7 z)vCEIr32P#*8FHOCyzt--amTX(1E^4;GMl(sBU z#5<0NQVIRQ#hWGj+@`t2TY2oM{v0Cq)-dGK1FKc_EC+wC5CbKqR+K{S+$SRLma^pe zG`6E}2OdScjeKLzSkWo5UwUTU>#Y?ZwiL?hhyMX>I@5zpdj942IoW#$K3qAFe@;3h zn3Tz=7|&S-tRJZf52MPHl6O-VIAbgK&vdi-1Rfi@78=<)eD$7r?Vco3Sw zllig?c2;;W7unQe=xZjfkE8H^KMDx$jOBX}P2*gM%QIdJ4qtyEtAy4cA+WkYlyjal zwWj?6kFR1}YMPr3{IMn-%Jf^4bZ`xHV&$6;y}RCpag7WH!AWgIsn!Ty!Np zXfo<)TWgVzp=lY17b-UwT`w?p9QHL)qQCET@!&Z<>s-Y7&9tD(IVK2eKG0^WM&ySy zf0ElhTFA*d)07js>@N?>&yfD}{Yy&q5q9T(-{b~fw-*_88YnX*C8ud{%OeVMPj<)a z@sZWPY-6JhR(-e1S$^E&W9sMJVbb_5*)$9-bDWiG4aW;dGk~p=%snL;j$!~az?fjq za9zLHKGt=Cf)a>bp@PiU_kPIGWk5})y8C6ll^KwcS7i9PkC@@~L*&WXz(U^DM+y|R zLk>r&`&~sdRKE9f+nhbdH(y9~VD#zQY!Jd}tLtIYaeUkrLmPAF3+svS5BhH2B&l@q z%Uo3V2T=NO@4)iCOzG>tKT_Svj&~l+OOZtGyZLh@QMQD^rxPcBB4fnGd%f2FG5q$8 zaKD(~`lN9LiPlT~C-G#J{7Z{x_E4k%pCG_ua?QfTXc?6A^xsujnX~sHhg4D6=Urz< z;kD{;V$Le$r?slog&il?HQ z-+(KyPc!R@#gZKeS=Phb5Bhh$5F3yZ-BVa-5->)@xql@GolJrhFx|?BA~zA?Lteb^ zvoiW`GLKDC*>w$T4=uNa!j51dksphg9aA(jYskV_@-E$_u@2plkIj4;PTD51(5>);xf;)`w>LLr8xZTiYEz(VjTr z(-$^%2nqK3h4wefuoo1Fqz&UudVc|;AYt30@1!q%d*(M^*`$6Vn_kD1*bQUmFtisu zN5EJ%Wnl$1Kmq47>5WN0BG|8P>Z$A~bR+bjU9?^r?xK`5w3}vbjeYc+>ywU!F$Ykx z(Yh|=lI+UK=BLiC0&XYDTLSOlj{7&w0M}0tY;S`8<}+|GOL<05y8OBROXs=?Mgplr z$q>@2szTa|-;#F_nqHH@u1RDA3kI2%l5iW}UEg>@rSf}`HD92Th^pb_aGPXaL@S#m zr&|$4#2`K2N-a#U#`_c(R$>0$Zy&_yCt}r)ZZ6M#+;X-HvWGq)YidYZ`xACJ>!yMsD}N_+giLA z=_vwGc?Yi8cn&q0@#YpMMaCuS76Zk4X*J~;&5w04;mK*roJ86h%MeNtnh6(XI?Klr zONesO-EUH&+p#Xq(Zn4?5@|0ztWUdPcvOIw=SRd zFx$g^e|`l~_`8s}K_&U&5cf0Mn=hK}T?cm-XHtl`WY2OcuB8v6aSHUf3tsPR8W+S% z4NJd7`V&9?z(tiUub|Sv1C_$scMz-$Qf~dakf`@dgOlBz5->)XZ^eL+oC912UTu(s z(&cZWTI(i(`PAxryQu|t1dQTV=9HsZ`ICZeh36*Dc`^P=*40xEzcmVXTQ4T&81W$J>ABU{vT#ajyMnn5n*m9G?(YUn!tB(8$osWv|8;dXOU0~dfc^dl#(|)7uF0AG+_t=tkBts!;OTuhB z5yiqaqk!KKq1my%>TokOt1k_+X?J)8E9cLVf)mBVdBCr=7VjA=CH38LJzuBCOw%rK zZIfv3_jgc+v0=$WU~<$wE+;q)>jc4cJda;}r4KJHq7k|5r%!gfWZjX7cmSE*t_(0l zcvqLq*;xSl{f56FB`RHN0O)Io%;`9CRdAE z>NSlZ%b>(QGh9uN9-h~b!xc39nMC_wn#*RYob2Q29B~lHm)kfQz1IA20Ni>ziRK1d zpt+FZS2u9nLH?_AsDA*<>8$9ZJRVwL2op>_rP( zSvmA#PFRxL)=rO#@X!3(FgU<^`W~BcU?Dd#=733B1=#0LMon_Rm2Jh0j@~oM)NdJ) z1TzcLStFxbXy;}^ik*I?5q=(iZCUmEsb6R?%<=nPM{^>Cayf*!GOdXZ8+&x?<{+p$ z>AgC;hX^WEzxBA9LmN7sCxOHJ<)fzi^8JZ{18b{o;9H^Lmu1i~QZR}n%n ztU5_QA9Tpjul*%J=u?76@zR$pgXTSU`b@U{$^nnMe`VD!nv$)Jy;f~bl7ol>n49GX zGikVBz^jjAZ-O=0cLmgi=(0CHtB#CUm`0?7ILyje)*pH!8HF3bmx;6ZbabG)8y>5=8eDKekWzdm3$T)R{;P#Kp;>sg` zMw+{-ETM1|^DU`Q*@nCI6#b!;&X#p<*~$ZYaeHK~@k?y2P7=8J?cD{u!bXD?>YkqY zh0tYdVgfv+jV1N5Oe3wy32vS+vnQr&yc#a* z8VXEboYTTumcf!W%F%09^d;JfaK-(oJewVxdgImgA+eYTt$c{<#mg`CzR%6qvloxN ze^K%EYw3po4m2u8itzQjswS;?=s`p-^D~vg&m_0oIqK&ZJx=ML7^%5dioiB`&~X~~ zay03aOTUd}xK*2e9{sr_DCbtT{Yxt~Nc*q21pCvpe$t{i>|=or$9p98QZU5E+ab#2 zk387-;-ysayYLNxF!3-EJ`yl;E38)Od2v|rc>(C>fg|&@5Pp_cDock~)|@hwW=?T8 z_4>=Ae6o9XUYyhHtUWu|70>a|_&2W82iF*P-1n1$+^LAH*Ha&RZ`@0e{DeQhNIRvV zExD3E_?Y$JXvMpZJg#M@;dzw%tPgid;t7P=<^4VQF|1oI8D4z!a2u7pSc+P7CLq-& zg#C&#O-(gr?V1D5Ny%Jq=!e~3zNJX6*fQ=^i3Z@U%&u-$r&XFp2i{l@ke%R z+K)7DY{rgriO)XCUJMHC+u!BNf|SBd{v=pT`LW0Q>*3fZ`hV3{07?L z$F0UUfob50hwe#7hWo}5^ka6~Tbh5q|9J}sSy=r|CyQNu1;A8UkMTPD~R?X zS51!Q)up~t`f-%v{<^xn9M-NR3lHmM$OMhQTzM_?g@~GFLgQe;iq2_4<;0^0R+I4% zIiMDy9S9w;j#IKG%AC{Xxnl<|zD?UoW< zI5{pKT|5`idT@ptz9QB7%*10@D_c#)IdqHZv4m;}v`FnA@{|0ECbu6a7Es|ZTgRBc zi=R?-Pr|ebPEL5|#m=&2%$i#wTvF)wJL@5F6GW1JZzuMEO8Dm&S+ea;9-7xJ>m|>PdA+NwF)uEk zJBWM?8^vQhhtT!Qda!gUbcj%Au{N=(7aeU={}6oc&m~X`0kA)Dup4C~>r#1546$#5 zUQH<`8Ky2fA`1^Xo!DDrYn|79KaO2+kTE)S7S$jEm`yP*8o9sPevQl9LWl*O3QQdU zqvCj|9pP5V|BC9npZ4+PL((~7gM&MFfqU4t41hl~dUipG_B8m<>(%1|m2o%Wug9?P z)x)m0mvoS=@hbbfUtIcYyj;T9?n}|aoofv?4KCq31ZVYbv)Z?YSCyoDv@8>!J1jkH zm?VV`a$jl0gtBIovG*U1jQmQb95Et%3X94u7}dP_>hu9d=DN6sj`d2 z!2J?)nKNVl+STLVG!nnR>4xzWjtKR>F)X*KUzaYYYp^wI7n|5+WBnThDC&!|B*Y*K zCFu&RDNTUuX@WL)Yz8Y%e z11JMGQc-Lld%>hz<}a*&f+b;Mh^cEHgW$rA8Ckfd=zXS|Gk{P@V%t-BR9Ts za?Usfn?mmEbjN{~(R5*Lm0B%>JPqTGj|RgVPlDBT=j@d3Y*_R+he+4USfjQLzdp0S z7yaF%0xK%*2=jRK!?Od`vKNyIL4QNAUYok(ch3E9k$kKU`j)L!_!dNi))X?X&m$c{ zVPXDav%U3_$0@PSJ#&@)E(_T|35u2_OU8;sOh`M$lOhf?+lJTXk1YF+{{61MBTP=8 zdWce6RXgGl$>bxD6?PQTvOh~v4?{f!iyqx&Tk3VpW4*Wy!hXzs&5n=A00tgC z+X+8<-sdKv0$!->*GLMcDU8&0bz% zS$dU_M?z`h0y|1DrzbD(^H1UA9Yl}BHEa2#_+ppaGa~HP+ZGv>Nx}HWr#1t$H5ulJ zxwM%6j}jGzx-8%W4S?ylNw)mX<7@YyV_eJOt0V@<>neeq=*#N=>*E(R*o#Qkx1PGEAO``s~Ns1;rZ- zsJ{x5bOeg|5@fIh{-_x-{$osgxf?N2wa@r{PV`_ZZiwLOX@ z;Y``UiG0KtbP8luxucvVRISu&OA~bEUi}5D?g-~43oL>h3y=D+Ke_2sviEC5QWuG} z#&T-4%;b+108?|x`W=!`1h~pL_lfM#jJaVkyU-3VzVpxW$4!T`L3KM@Bbzr9WggWZ zsC=C31@`0cxmo9Cv|#fRF!l0U8txMfF=_29N9$^G74;W!X{__u?Z5rhUTu{mDRW?g zy^S6JR@_0rRd2m}d9G4&9Br-aA$^i>GIa1l-x9{^v+?nvLTJ$p)a;n_vnAZlXBUd?%W1!}#JR5coAnR7-Bwp4}UM?Bq*Bo{kr~ zn>?ouwg=8kXpCTdrw&V^)c~Kx+{y3zeLd0ZJX}?y`ua~+2xV!F<3eSB`Fjor%LY_q z2L1YCpEgM({#kr@$hMt5D{z--C-Yvf2jsWjr<>x^w@& z3_*Xsq7;fFJ&nBTlO0xT)_SPOODa8M?#LFKV|21hJA^Cdq(()-f|2fbigjqYJjo;s zhSa1mf8l*Ne)4Q)_orpFWzP(sbk~kiS2R)q=JAJbE+jP=8*P;z{Pls#3H7vbMpFrm zj7R0-TpuSDKEvR(-}|FWP3~xR@O{XK8CuW9E_Y{{U2P Bf5!j- literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png.import b/themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png.import new file mode 100644 index 0000000..76cbb3a --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c41lc5pb7bl64" +path="res://.godot/imported/walking_right_stop.png-3ed5a089e219400420dd047727e207b4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png" +dest_files=["res://.godot/imported/walking_right_stop.png-3ed5a089e219400420dd047727e207b4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png b/themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e561f75ab2e2243d5123a669b4beb68e4cb24d GIT binary patch literal 21122 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png.import b/themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png.import new file mode 100644 index 0000000..ee89887 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dx04s533dp3m3" +path="res://.godot/imported/walking_start_right.png-13cc2de803eda5208e5e86e2b77b873f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png" +dest_files=["res://.godot/imported/walking_start_right.png-13cc2de803eda5208e5e86e2b77b873f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/banner/frame_01.png b/themes/space-pixel/package/assets/animations/banner/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..c30b61d0d5b4c97561ff0d4ccd8dec1f2d7c3014 GIT binary patch literal 11491 zcmeIYXH*ki7dAWzz2i+)O0a>73Km2uCKl|9-Uq$QEdj?Lnmkc-Tn6ZXCUAg3bwMFDT$YXZRbxRXZ@UAq6CF(~)x zx___%YtNp*qsNqw>8hx9Nw3c}l-zXpzss`EzCC{$jVp+AijhzKt{i*zP2;u`so%49 zJyq*fc(k(i*LKH`&5@C7qB=%gM_it53{!r%UsFb}hV-L$t?nM*QYe@?P2epD1&~9M zS~G8D<0sjSweJe5sW21fQyi{bd4@*$U1A*3iTX$Bo1t&qoD#;skMB8ga%f&*#vky%;JJG+Es=%?| zGvK#3X>fC(vjaOwRSda%9`GRgz{x3aJ9FpYJZInmwh(gXgZhC@g)IwDzoPoZ2i@3Js~$8okltPk3`&EkC4C%0rG8*q`_3S3$a zC18J-TXMYU4b{o>Gw>%zpmC^lN<4J=q?n;E+E296pIaqJhx(z~1|X0zKSZ~fZo_}b z+UW8RSqgEj&z{#%$sMoYB45+@gYfuw-yGqcwDpA3-+c`x;FdC#>YmSDKzqIf~(gS;Fa!D{O=*Wp6>+p z1{Z(j3h#0bH1g`w6C*`t6!pG8CxqiZmP)IicdV!)o?a*+ZCEflCoP(6h)mwQ!B6tK zy6pFX8M=ZnZJ$BENP!;5QOSirs~2+L*(UwI?>#akR9>9DEw*LQ4sY_KK8G8e2pHzU zZ*t(Yk`9@db00p5JkaI)PXa30dStj-JKRzHF#~wg&(6HS+Z4Li1<(_DmmDzNMlP+v zNC^jM^b?if<=^yzq7Jf28wE$thRY(QI`5^5Ru^;BY0j*>&Ic{>sAuweVEsn`xVobX zG?RGvJ(C+fN7q11@Y|T91B4X`tm7xH;-)n3H!l(JGph2kAsHuU!2mZy+N&h_WFZp& z$#oK>W45bWo}qZ%DGjOB`A8Uey!!i4#9B64UbzC07k{s0ucHH%Ch9Kr+#Rbl(IPT6 zHRvY#uFlng)jmZPz^7k(%Bve(!Lu{@1J;LfU_CLYhRS>ufI9Qezq043IcHF%IW3A} z33gx*@jdRMT=dd(cpCjN4y%*}-$V4)7g_hu!oLox((>^5c-6yV7puB*QcWChPNfA z)_t`l-H)T*;xZYs#`1U0$-n?$j8X3+&e4CKR98FZB%g4vunWRA9Y@KEhOjrPfHt2_ z%(3>(Or1`ncMJRA@mt_;UHD5ZO8?F}+V*hRUSA*v(1>q@Xk5b#T&~s9GNfocAvP~L zE2){Rq9+)vrCRMCu5WE;?<8eBp8Clzd0C>M^)?Q4q?=1l5PF*ez5Iy1i^$emInUo1 z0oTE&a<*`69qD8LB=%(CW#G-BJr1Hc{_}0S2EcQK!^{})LuQuTp6qbs?!~LNa)645 zTwh1&D3u#!7wBy#tlio^&|tPk&qtA#@UwOZw)QHwFdO^Odxm!nnXzMUjs)q&bN4}2 zE3MY&`!LlnD|r|upLr9es9lZkhg3$unTH^KSExdg?8_vnm!^A-4@9}T>A7s_`d_4? z<$OQ$$enEZp5^Ep=@F9pWTiUNV{3_oh;CRt5T!X@yNNrrOQt&TSrl{KSXU3TKifmG z`6`NZ_ucSEU`bVg_?G@n*NlERZA;&m1Lk@q_g1LxhPbeP;QN^=1eH97eyRgAnsZz# zR0V(j_?wS?_N7XovSAqk{%1V{>VTx2aL4Ug%#8x@NG4huF%*zyS}H-ha%sBoM-NfKTgt_=vyXMh8!#S zF#_Ch@yHe$%YEx*+4!}`Q3xpW~|3xD)JQ}+);w9uG|rv#~vD@|+e>`5Iu@W80i z@_@_C^Ura3F22CK_pQfdH9=pv3yJI336(nlOc^Iup{n!bY4GqT>&JY1*4s%V%(XJ& zs}a>TkVp^Lddz?st(EKm+q-%p-mlG2*#h(K1Qyvpk43je-~lk+>D!CCGyk~IPFE8$ zJve=cB$P)Z{*aLTW)Ap8T=?Any|85mMtpx`Fr%=n5pVP59$i3n>fSi*VD)#t;-25A zwzcSlHBc=CH|_xr|H$iW8QN!c+~9^K*g%Mi7Td0lQOP=jtmX3PMuAvz%)SyBoU8We z3uc&?ax6j?mR`L7<^D#$0(pXT;a!6w=~Q;^eCg*C##STPFmKV_HE-yOqz%Omu(iYQ zCGr3hLnkk9C*|6}O+NOk18Mt?u5p_cEA@lk-#Nd(VMecfW8W^R+}V8 z|HU6z<9;lY$cs*!Vh-s#1@~oSQ#b#XXyY9UMV_vGn}fzpyzIL^3&zF4Cj(`k9g!AJ z97ov>ZFo5&>2Y=!?(b%|<)liv->O`>`uil1)=#IpeFESa&s4iAE+ethj>u?zyH$K# zfj?UW9Ut?ADdiKXof67cZ=8UIeWc;xjfzqE10{=8#sTb7QUTp~k5wqOYNT_JPYn?m zxjA>BH19zYv8{3-r~dk@Zt3ZLjT3&E|E#huaR&vg++-fH$iCEqo$ z(fU(LJo|-7Z-gU1ao|@*&K;{Nt*9qQz}MsZNP31`cSfF%!@0XDCSfutgjFU3#!H6q z#flm7SV}2=s64nms^y98;DS-Rg3`e6z-En7C+)<5DoFCF=K*Jy`4lPelK3z zDGP}CqkhID9Rl0Wgu`t!*ybdQj8f@O?4Gd*#Q0mJ<*!KJQPo2jT2c8HKz?u@lfO1= zkIR84_-eOLt^4XT4sh!Yh0{n#HE%IjM&$W^6Osc8Zy%Es+9>dC9N_vvHu?2-S@{ly zmxY!t$?HS^I=VhWAx%{DC~|r~r4laMJOmTl$VI*!%l3-!T3!-354Aq6=Ks)XPd@Cr z-d_B~V?pW*(jlj1Yv$ZQ($XI0o5$-Bx5Y&@<54dE%O74IGw>$PYHR+XBj6`fUdU*> zYa$Jw;eA1Ge&=PXaBjeJw1&3DY|ZY+l7BixWb3Gx5pcVj`^#g@-gHF~Z9x=(iFuUD z0$)OnJG<4p+oyp@ay<+NaPhKi`)pMS$z2{zpw81BsK4@mep`p8Wxro)sn_KZ$b{?V z(#q+ws0O~{jF;S#X!U2&TJKrgNqBA?eQIFHmmj@O3I42+3l7q-@9Z?U%qX77XPKIC zDWm-T+YqH`=Gbos#sg6U#pYBwm%dWeH&?LnTMBroBL}jvxw#rmIjJt0tuFRf*ZA_C zONcROmw)=9^loZ1;ORKHbnpSx!K_{ZFX2<7?cgy>m~4LFZFd_uX^Pdd{KUuC>q0pv zB!zddgF5Gnw;2BMQI?hOq5fUKW4e&kG66D)+1&c-e)P>rJ|l)n~=}59A$P{zDErQs#-o z3}CD-w&R`Bzk59z`R4?IVep;We!$ii@_e*7UIcHwBBW>ulpMGVDHT9W3iZYHm(Z1qPbh{C6O?;r|I02E3z&z#;+P13X=~g8OoA);2j**d6N3Ymz~9c?#h@-q{qFv^;yZ zS@LozOWq3EoXhBqJm6EpcJ#M?RQ@@<$$U5Lmt{Ra(ORh=Jg6xv#w7Mu5_Em4Cd{8x z1a>m~up*&>9Qy7qz27`c1e|-AW?V1#$4lu1g*#ac$w7!UixP^_IC=o-y!if!PEgxP zc$%5rBVjzOP5LScn_Pb~0wRofvZs}!d$G63ECsuk9YwLfDQw*){vism8PDToM#v)B z^yk|*JAvzOzYW34ZG{U4y{^Lg;Q z(yTOaFc9DMXk49iJyfrJhI*&_LSp}5rZLG;D-+%QzDoA=OpmXNBE%F3vlYrT!~1=*JYu>_I)JR zK4`WCHlP@8liU=6`fea6sGmxEQ%CwxfFezI!}lksQ_ zK#a|#4C1*AlV%B0WBx&}&dU|RKHVj}p&$C_^KkfN?jpTe4UreC5 zfMP_=^ttTvTL!Q>C#|`!tk=>c`Sv+nVh@~a3CoONT0(*m(Qj7XIKLvW~_be6Gd%@kq< zo26t$@qP3R(g&z)7pQ@L$0pgutprYoN`2lHzvghv^g#7A!^bgb@iaV8US6^33(U?i z?NMC)nn|Z?E#vu8RZJBkJ50!23F9-PGd7P$A71=b^@4BvnB`@*>?9U0%nbsjCp$-l zLVF2P>P7ToBoHPEe<^_{Uc+Cdwjx&lX^+zDRq3C9qI+L}CnU**lVa(Mf0F7gtwQB( z&~W->mFd!|Kc8ZxAV{;_yd1roW#_c26dqcPKUnSVNh?#6fD7W_$9+QcISvA-`d%5b zK+vc+sYuJae1{pddb$vOaDmT^8e+vyDrpM}pY0J?*PepUJE5-q`UkNt7KwQk)VhI5 zBTo;e5-?B*{y)6|B`cCXn`_{9R)ENtP;?XNb?7r& zLna3Y4**h(rLo|CV6g_YpR#^1w_p<&1uPXclI3{~Xj~cDPW(wfEM-3tZLN4YZrww? z`k$p6=vT$UdP8V>p5zlkm@dSA%B0FAXEO-iMsw)0SsrFa)Kba#zE>64?e$>VJoR*b zlTwA2;(c2`=8-`6YBp;O`y{Elb*t%Wx= zN8{7C3#3GG##TcitS*8qhsB&$7e9O)m)Hh2#KUDB{#w!YGO)d(gYV_^ouqAH5K>&d z;32xtX!#)0J&l}Ms?0iCx^XzYwXchTE}Ne}ZN>qwQtjl0DcRm)+|km5eM{UTvY@%c zGvlrY-hSAqPg40&obXVDP|aWLm88&dHe8U~4V&e`2=#MbY5lc?f$l{jYQZ60gXhJD zu8_sQd6oSO&t+Rvbr0vmjecdY1 zlHWt{2$EKYeTEi3POUJp*RsRF&bo)W#$*jaq5L|5Y1N!l++#^w88~Hynycl~oh`Pz z78G1bmHu19Ui6tm;^sA+$|7%86+cH@xI0+yQ|WQj6W7-x1^Kj&eQ6;r``f!xBgg%v zEPT9>mZzKP@mSlUMSPFW`7Q}%Hk&%qW^JddoDldA&UO~uy=+?CfsumBq?KDy(s_`* zD|Uw>^n#D*|3*Vi83N#v@NWA-01Ro_jO2;39owWYDF|%Bz;1+~Ub$aqeys22`HAbK zf)}K1I%58ke3QXZ>OlvMJj(uYqs$fXA6uJ&TWRJtOJ!jrUkeplgHCavsz8ffi!aG0K_Ek|KHAR_ zr(*SRT$@xN6pCoV-ilE}yJKe?9onPq_?|_p@w%MA-WBXKMX(`MEch5w`+nRB?ETz} z^f6Cv>9Mw3sgqh=(b-3=_fe$Y66;H0uGq9?q`c)b&7f#djx&xXA=*YJt&tx zkAN44c(Go%RRlx6pCw#gB2>IFvkQYe0RO|mDo0RJHK2+i>{b_AFibA)Agdv496l0lIdFmn zfApvJS5apdw0tS2^XKU0oQ#3l7tY09Ja`0u&`20_5fPqLz8&y$gz*c-8UIZ zDX^D@S2pn#T~7>XLb5&8wk-hUY2iDU${MEm4V*LHVn0-rfZGK^tiAM>S;?%vA^La{ zJUn+1&i1Wb$tj(1UV0d8ns0Icp3l6$R__;!b!tw?O0+ZHs3&%Hz0Re({i}1e^bSl> zvNZ4f?oqOe-@)82ZAI#|zVFE?KI8x&;aV%fIR!indo_~-8%VJ%gJu-MV>uCCE3GjC zr=TU^*o8+=qEHQokJ=B@3s!RC=zLPqAwo#nUUfh{)(gJd1a`0YJK6AwY{J0q$mLO2W;6mYl);LB9#|6>HW%9o z#`?#*;DQY}ZGqG(-}Vg~Lv=33DM#>f&ylWQNS%QOK_L-?}MWra+B);{Zff6Hv9|pzCc3(*1E2Ub8dp&FjNaO;d9C~;b0YG{S{7^t z1KeG&cUvl}ZxKV8ufGUOy^(skw%Vt8C%Q`qioY#1>f>M}(fPq($ihZdnSAb#$y*q) z{kezwR-*>E&01;tHZsDX9k4wEve~Q6D;6S|aLEby@s5Z683JdIP_yJ*u8gh%uJ3Tt zuvJVBJl5f74#s|^&YS}8rGgiJ7!fQLr!mmPQpKQQ=Q+N}-KNpBtM**Vt(S3-3Z8gn z;w!<;5r`23#_~zmv#hr{tSVt+s}JVrv3|X+JJ!c3EJ5w9YQ!6`K!g*gVH~N|1n_)= z4OG>xlg{Ul^}xfQG2s44#ryM(1h1+zpD8*l_-raK`2FXEt=hJnEvY#OFgj$h)kzml zM!?(M>J=1ITke8xiGcm6G4_WoDZ_3RN$a^AaB9ab8C~8QNX+);5^iu-s?6hM0XMU+ z7zFL6MY)WQE$X2JU-L}?V=lr+)+gsmzcjgh=U@Knkzs2MRQ3re_*YUQeReBaJepB{ zz!!#EU*Q_O;LFm_7~zqh!-?YSs$2NYJ}hGQmXJSXFLxhnRgo z&{5C_kEsb#X+wTfJ`b>992>6a6!zv5P8R)HNVgPP5%_jKcr}LQteQuG_gYY&9w4nsT+`NGFUtm0&f z^nWWu)3cF}uF}HoF3GLhyb!znzybW%_7`Scn!5i>AjU_e>gKnQ_Y>|D>WheKtwiA* zT(ZdhT?|%@BKU->sfmX^m`Z1wqp#XTLs7NhARDHHcsZsY0Nf1Wpd8Nn+eW?{k$l6BD_LWaUaFWaM1PE9FM+`MGAyj3uM+6E3fsY&TPHpcLs z8;bkkJVM|TOZYJ2Z@5^bUtj~Vt|07+NaV@*Gz%p} zXWXMAWzlIn$8{@^dVb8!&W$XKF z8a^nFnrc7}3Ji?H+5^%f*d4bOe$1eM@f&Mv?NRN&t)W|KWCg_Y;?T6@`t+3|C_WtC zznqy~3&yqKS1MACG1h#e%AG-HdjMK)Xs{edTia{!bNRAm{op9wgM}R~H{@V=-XrNj zUhwq#P%oDi#E%p1OVKFQ#Yf&6G$#&7C43!`f-ifU;w+|&e1`D@JhBFq^LTYzCa@`t zsNJ>nVjeMScRmT>hl&EX{Hi2S7>3b56jvo4yjX3@@BXQl10xH6kON%Pi#wx&hu%(|n~fQy9{ z_&?KpwNgHvsvoJ&Gzxw<2Gus%=@N4m4Uk0b@~R%lnDCe0R4QY!oEDL~QRzVTUOY$42AZi!`Nr{C$Ou|Zi7Irx|qH?w@Lep`vmkNhDIL^ z0RL{`j2aO6Xc+%z*gs-foL>+Jc^n9v?_)yMNY(LYKI?uu*mZcyXxo-YJ4rX+_F&jk z$4lw<#OD8+@&x9(KSPAmeE%cD5+-pE$4k_$Ax$G}trR7{VQ}po{tL$7PSUtAH5K=J z8+aqs1!#!lWe*~4ILM#KeN2Dh{D8Z5OhK@IZc;*k>)8!cyE4~L4pxfD%a=fTw;c(B~-$a*A*T)brgD?{PkL&;Nb%an~&otk7Yo z`0g)qWE_P0P%E&62PzeYKY`ThWy?l1cwxPZZWLfE%FZ{D&9SeM1OFH;-xU@a5`>=iz6#^bBI#e8_azy z@XUDxb+`Mbn#?BIb9qBkFVg$dUe9ia&BlwMFKy%)HNosHz2(wuIob^J)y517(sJW% zr0##xT_51h6tK_64GG@vz|RaM5jzZJDXXg*(5-aN$wuBABjOS>RaA1^DmbBB^Fa9_ zVdxb2(wSjIpmz7$<*A}x+rgF5h59QIlP@f;ZvBDvy6GR%k9BtRVnX?lXLiw2wBEAg ziil}_S0rJBt*eX^HF|1&r#Ikw{Ov=lpL(_&T%lBOutD9-*Useb*Vrd*3g>M#vz8%i zx{Q*lH6Tp@`DrtPV%Fh5pwB zN)jX+WWf*1zJc=$hO~4Jw2)2gHpXuf>P~xyjx#Ig`>4zzEW%b#N1+pi+@_RZujQD5 z*@tbTnEdDNsAYwP{_5QV$~7d(MerF2Uh*=Q19eyf=hnE??y=q`&q+~M#+r_P6e0mp z^hr$5$EMWB#ib*$DGy$si-b_j`h%+vh*+J)!u*rY@k6(i=X?i)+sBM7_nOUiVW%vh zxzdCE!Hln!)Inb_>G``frJn7rlG2W-7y_rW*ZhRX$&0rI#di-t33bBVpTj@ObzW#)Hxz$= zr_WXR*<+-01UOs)rW_So`qW>lJ|x((ut6iQTD&fNP0rOCPO}c##%nHiM>3_2ROQRqtGNMSubAyGc_$o#7nh z-BhE*&yP9+Cf(P^4Jh1M7{uh-i2u0s4>$HWr`cmzF z0;@yDSff%+Wqd5>0Zg!QuFLn^?%;fPc+LRypZFSjVfi`vi`&rQ>TXE(FC2H?c17OO zMP|EJADhB(xiu9xEVyza_wv2&x(;Cy#@Oq_K4#pED9N0Xsu`{4YX5vcF@<^Ajid~h zzOxS`X}BEbMtS(T_~cs0RSlkqNxL8?MwiyzKVFcRj6#F8f0rptel9`U_s`#PZ=^@u zS#j%NHgNC-HH~E*$NXj?1pOvVL`3-cv>Q3ii2UFx%>hX-`;u&g zB?EgLfFB#CkUit%WC5J7yyScDB?s2B&O7hwz%w-#!N?oBjQ%ggUSexjojj1-TGyL| zosLE(?mdG7rq=&Ga)caZt#|}~ejDF&1ZmtoS_|MJSlE4{R}U&F0C40o;ijsSwoHq> zMQ$dej+708VlUoK5bT~aoeKN7RZC9qo|OduT|iwVp6F1i=2a1Uaf} zZT!13&gIGxzd!!mGyRVhn)|4qnL1&MRkM=>({Ei4yT6NL`B^& vLxyQzIuZ3Er;w6GfB)a*|BnjV1$;R0niW6e>ih2^<(;%TcQpU7%ftTzsC5a9 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/banner/frame_01.png.import b/themes/space-pixel/package/assets/animations/banner/frame_01.png.import new file mode 100644 index 0000000..39debd5 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/banner/frame_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2bopkbsieo4l" +path="res://.godot/imported/frame_01.png-35b87883f48ffed45a9ecb707fc4525e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/banner/frame_01.png" +dest_files=["res://.godot/imported/frame_01.png-35b87883f48ffed45a9ecb707fc4525e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/banner/frame_02.png b/themes/space-pixel/package/assets/animations/banner/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..8480f12c5b52004df67b76acfb49b1f6991c1283 GIT binary patch literal 11294 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%0D`co;< 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/bill/frame_01.png.import b/themes/space-pixel/package/assets/animations/bill/frame_01.png.import new file mode 100644 index 0000000..10d3b53 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/bill/frame_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co8f6snofsikl" +path="res://.godot/imported/frame_01.png-08c44a6d0d1d083060c3665f284a81d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/bill/frame_01.png" +dest_files=["res://.godot/imported/frame_01.png-08c44a6d0d1d083060c3665f284a81d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/bill/frame_02.png b/themes/space-pixel/package/assets/animations/bill/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..3a496b8648e46dab4f70a691d74cd74992552798 GIT binary patch literal 2588 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

-@nzigy{f(79x`q*Hy_51q;rF7C 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/bill/frame_04.png.import b/themes/space-pixel/package/assets/animations/bill/frame_04.png.import new file mode 100644 index 0000000..fdc797d --- /dev/null +++ b/themes/space-pixel/package/assets/animations/bill/frame_04.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cl2qmi0ieqhd" +path="res://.godot/imported/frame_04.png-4373b7333ec49772f201d56d2f3cb70f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/bill/frame_04.png" +dest_files=["res://.godot/imported/frame_04.png-4373b7333ec49772f201d56d2f3cb70f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/card/frame_01.png b/themes/space-pixel/package/assets/animations/card/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e90e0a9fac1a64f451e2d5389f5b1d3d83bde737 GIT binary patch literal 3895 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/coin/frame_01.png.import b/themes/space-pixel/package/assets/animations/coin/frame_01.png.import new file mode 100644 index 0000000..17db3af --- /dev/null +++ b/themes/space-pixel/package/assets/animations/coin/frame_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sv5r7i74bs5" +path="res://.godot/imported/frame_01.png-379d6603d972f7b9b71935265b230b1b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/coin/frame_01.png" +dest_files=["res://.godot/imported/frame_01.png-379d6603d972f7b9b71935265b230b1b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/coin/frame_02.png b/themes/space-pixel/package/assets/animations/coin/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7f98adec71bb9052cfc9fd1588a507f47e0e4d0c GIT binary patch literal 2592 zcmdT``BxI?8va01)EqM#Ev?bUQX4aI%Ux)ZY|^yMDN6;lj8sC)C368uoy>)t7Rfa6 zSZZQQNiHcNc3nzk7`bhOOJ**);ff+4gPwctpK#B)KYZu?p7)3EJ?D9!=Q&@7_wged zYIbMK#jh?qdOb%EA2@ZbV5-lO zvi%}N`HR!xVdU)=H9S;nY;pm8AUD99_xNa#A9s;TZY!$LOTV0Lp`J^z1=p`e%TEk1X(A=j6T-AG zC4~jplt@@Tz}hz9E^lIn&JMP!zpS(JO0LDZsHg~q0S$AV9D<4(fCqMM z0lXVSLj+M93Ls1~)qf8uL}#S|EH5@{kT?5%EXj&OI4AK+uABMxmd`5Q3^tA%5=D!D z^@ilRI#x;>$mxu2kY?IFrQ+?%Nog%X-{b5YC>%Wy9r1j}UiA&*+F;VdvgN+!q_1Sk z*KVj>TMe(z32I(A2oU*_4X0%OzNQ7+>xYH9DYqk0cEhKz3K9`wk++AoO-c<6+*mAY zCnhZ}4#>rwy-UQHp^w>Qj>#qq6Y%NNl+#BuHgRHPl-1Nv5cavuvwVvYPZBoAdIE%M zX0dnKZbL8@{EfIgKi*y)D152PaA*XZJd|jx-A3}SL;1~-mlP175D>trgz$<6*sC3T z(~qq)=Y$NI5fz5kbvedO-^l6Lf|AbON)T9^LrKr#h6Al2A_HI*b+VV1uo4)@B> z_YVwrcrC4WQw6wh7JIX#^pP=w^xGt!r6&=5Zd~0`EqhpPM_hsF0T>@Z9q1G?aIfng z$5hDLm-e$SjdHRZ&B~N2O#nICYT)8Y80fa`n>ItQ_L%myim(lCIHf5#2_#XZqLubz zz}rh4Jzy+I+L#ZhjKXelzF_fAT&sqPp^dM zEVpZ*ahX{%E#T4e`8$cSlYR(zh;0Tk3TAwm8$4+VP*UN!IIP`+eY`9{g_ntY(gAip zT(Zp^g1F+uV%815L%tbu2FC5dK}mY37JQ=$_ve9WIJp04*?J3lVU-F+AvCZN>WSLr z(wJ>xi3#|_*MA84c-%`4Yrb7KOGYQezF8+A)}==ne7Cy(ZTmht@x8zNd^pbyCF3gs zN|`~=jIMI+@75=8)&S&7z=itN(}8LXx&1hJmJ$KQ3T`#9Lz}@Fr7`NtpHv*kh!a2P z7R4o7=l;~tRPPEwB@8!$n8Y|*gCNnufmUe9bbv54hFyq!sPbXJ(Dp{*gXXS7<+MX2W#?OEG(>7=g8)spx-eWVKY zbREL>vlF|Dck@$*5_b4oM3##9ca;_4M{-?~2YrD7eT)S!)DdxdKyXrGXADY5?#v%E z2&>U)X8Nru8gG2k31`>A3Qlic(|wK7a|l$*qm9^mrU*hhue z6WP6(W0cM(KzxdSGht$E-3Vxs$NTb#!TLwd6ELk>bpv zkLt!?YvmoK*Y?X^cjW=A4`T9_J5IDt*obA8TELesFN@<}NGM72i|1lo$0~m4sx58~ zhtj@77+>$7TcD3OS81zxLI)KOK0zW|pWX!Smdvy+Wix3&YK!9$v*gjg-&4*Zg*;VY z>Sy~(m*V+U6;5(R_qdj+9@2lSg1e(MFV6f}hY-(vO=H2Jq!Yi%@z-Z&I$2LQ1Htwu z4{el;WM7<-com{B<%xBbdRXeUEO1t|x9Lc>B z+1n5wKdBj+FFR?YVwx~zIcou3xGNbE3^Uw|53`{yp37>GNUTxyA2%hijiTXE;VYSQqtA x%)apbUu*E|mRE=ia9{wY{olC${|5;TtC~}%3}yB3thK)&IO=x%aMeL9`5(u^dyN19 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/coin/frame_02.png.import b/themes/space-pixel/package/assets/animations/coin/frame_02.png.import new file mode 100644 index 0000000..add7760 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/coin/frame_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2iaks2d6flqb" +path="res://.godot/imported/frame_02.png-adfbf9d38bed5007368c42d152b48450.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/coin/frame_02.png" +dest_files=["res://.godot/imported/frame_02.png-adfbf9d38bed5007368c42d152b48450.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/coin/frame_03.png b/themes/space-pixel/package/assets/animations/coin/frame_03.png new file mode 100644 index 0000000000000000000000000000000000000000..01055c9978e715756af22cb91628624f9d90f0f3 GIT binary patch literal 2441 zcmc&$`#02E8{adgF=%QuopKCOB1O@gAqF$KQ!^yxGOi_KUL==rXqqnxCCzapxs%Fq zpW|SPGE{Opm1sIdGNg;-&J5XUbJ>Mrk5*Jw z1OT8N9c)|yfXTKnfI`ZQcjT`@GNW+T!7~Z~CG6UQfxH40S&ZOlbI2{OVDdeeg`>le z{pzo_2-z!{Wx<`1*c@q5j`2nmUCh^OmgWyz0K8bClf01aA0+IP*e^J?XB2x)=>Q zwSeYL0Qti~k^(^K{IibxH7Qc1X*SM$QbePa^CJ3)2eN^G9YIW7o$Wt#;gy+HS?+Ft z;DNEiFfZHuUPE-K0vswlPH^X4Tb}9JrRSIMMVKH?I906;(z@^BugXy$#hFc>&%Du{ z$$THo&t^2HaJZsg-Mv5`Ze@suhOSDq8&WtpFRNl|A|42X=7u9iN6Qz_s7oGp9|4$B z^5OfuTiQl@b$YjM6u&_sKmu<0o0hcRu5H!>k?gMus39#&?sdKCv&J&e0q?O9#z zOtloh`Z7PMv0~JWK`{IkLAwzU)*5IrcfdfSh#wtz%S&2Z1JftGDrF%+VO7l4hGU6D z$xQ6lCWb#6B+~w;#a&(exG8&9k zd}o}*gTBg2m@Fy<$NL`BeGxO*(OE@ucw1`n$;}^i7iPF5bRlDn5}zYLhe(>meZg53 zEfyP?uZ(I)1Izqp6rMa+0P$b8awW@mI!|1B^z)SCTRf~y(^|$(+YU_|EWjKABtsZz zM*zhCI8i#99SMT*=?oTk_G#aS72gy)IY>sDEkXRP&aTYf1jk(*7iKM=z`iX)uHk(p zdi7$?Nm_5|qkXmAMJ3B*!3kPNCljGPMMD-Eyu^ zF5qRz4gAGMp~Z(fLbQ86-<{Grd-1Tw2B%mfAVc(erRuVYdM=A`zO}=<^_iF`6})E2 z)0hZSacs=nOrU#i$}e6e^x$igjF~KX)|Yp@1Wq#}yg>&zxrn;D{1u=_ti_xQs%P>u ziy}?eln7apMK6gvZUUdXgO8BDbQY`@aqh@=*WIYb~x^4BhGf0?;OGDb{? z8e%3|HuYGbOYUSh#*S&NEbp56b>(pxtb6DujG>w;>E-LAwbNx1o$}d%o>Rdx0_7Z< z0&BUhf&x~TFVip$n*^$US}k%*o$E;G@? zubr4ylYVMnYv!UTvWWW*`<3l1=y}&TZjPT@LkAfBO4#~==1f0qNh0uQ!lHjVbhhWD zChGFRyK8kl`jAfH@H71#8)VSwfPt%QJ5Qt&AhFZ%5QPGq%&ppnZ4o4+RG~-v=CxO5 zP5Ve&2VWYmlG=Q8;&^N=ff|udg$~3i z!`ikjJsCcP0oJh)HgRy%11^G;)BD#9gQ7e@S!brUJh>#LDPxjs@z6s9++Bm4vi%&ky3fqK|sXE7!$#FP)!<@bMIj9zYP-X;y#cQI``oHl8M#6C zwN+$oP$ju3)tEz9%(`KZ3@T&#*{xjp{*B$5n9s^6x4=nh-!-jy^Se&}e|`NQ9VS#h ai40ht0|U7qE0$!l6>zkr*wkA2C;bh=e*G{2 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/coin/frame_03.png.import b/themes/space-pixel/package/assets/animations/coin/frame_03.png.import new file mode 100644 index 0000000..f05ad0f --- /dev/null +++ b/themes/space-pixel/package/assets/animations/coin/frame_03.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddo0fm0ophvci" +path="res://.godot/imported/frame_03.png-93dd021feeaaf12b75bcf72874606579.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/coin/frame_03.png" +dest_files=["res://.godot/imported/frame_03.png-93dd021feeaaf12b75bcf72874606579.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_01.png b/themes/space-pixel/package/assets/animations/payment_failed/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..22396e84791ac755ca5cdc257c168acffe5555bd GIT binary patch literal 3508 zcmds4dr(t%7XBrHBs`P)1dId$i@PW=rAp+H1dA(HiLF)zMNm-0@(L&t3MPTLJ`ruF z2qN;Bwe1S>5EelM5}-n4B7qJX6p%oGpa=mZ2?P@Mh9L}XqPsh@f9&iZcka!dbI+Xf zec$@YF3Fa!XY?DY293jiE?gab4Zx=qsB70}Iq>g{(L0HfvV3kEW?%%I?q zonD^b(6UClJEOZgR+7K2-|V-+U?2}On9KPQLCR>d%_BHHDfKI|$n#9@rj3>p*C%w@ zl)pM$!LM7}7@Y_Qhg4;9BLE)S0bu0~0Qm+0Oe+`wo=^eFdI0Dd0DxWw0M_>ZE+CgJ zqr=uWIHl}CZB7-H$iu)3@##x(ls`6l0aV~h;#Df~b>*z=Ouryv1Ij_>H#s4CgQY72 zCa2$&4UK1g2)a@v?c&q4w0ry6tist%ekP?i5q3x1h|N_!EF$I?)sb_^?j{IgZJ0MP zuLg`FsIHg}W7^3tgu!rTymNt9B=&p+P8C9;JUyt3lZSwqS?V!7KtxrOxn}{-d4#RH zlFQGVI}OqKpHteug$z=~0!d9^-N07Zf-q{~9etPHiYv+k4Zy}eNFq9A((05ddR^Sx zdf`~5(r9v4S<9GuDL~`|Myc8fsSQ6D>tD(7bR=c}wnv#TJu|px+E|eR30t?)A`!Ek zu0KER|E{H`Aj$5~bXf=jHEUee{H@ULfGQE$y#oMhN)3I>deEY{*#8dm3H<26kfkg- zgSd=L@)7Aou7}U=ReO|=Gn@Y!iwo*wjPw%IXTrY(SSL(?v)pnA<%7o4*=Ys*v6*=KN%~w` z56gw#ba5=`nRf-m^yHY01-Ry&BT95oF2U zv_gi*yHL_id5@UxQ!SZdYVp2~>_DQHcMfcl7>AxaG6prEe;~Z>qnXtc;f_YjguUeS z#34-9Wv!%|8g$JL_XvoC5Y14GA2VybJ@=Esxd%p!$NXBz_Z<~$#58Tl+-H7a;Fly3 zZKl)AcgAB#+4S|IiR((Mb^Lefm;CU^exqHn;o0p@UpYlfi|rZmbs!_oes{>Iq_$pv z8}*hvhwV>gX}RVF@YEDlf5L21WTfRF8cCHRD_QrhI)3Vib`@RWcZHQ(qvdW5;yPYV z?CLq(ys#mINgy=z^f7lW2b}1?aRq-Vu?U1gTgr0qP!vTQ+gfWKg!ri6OyGcQ|08#9 zfL!1&RrV@5Ff@~u@p#?vpidIfi|NsQ$;m}^=l2ab1DwDn1Shjt;hfV}>EA4Iwj0#I zs*$=aWE`PpO>Zvpq7z+muv3H6GdU#L`_3vyG@&ApJvaLxogJlW@)(zNeGq^c^VZAH z3WdBPH06Ocx_dwSRvM{*E|@<e78EPx0d#jo8bI}G+Je;bvM%>YLlP2k>~Ru_FBO}r zVdWZt6-ZUBD^Jd4tfFpMc-85V(SK(vY)X-Xr(xA2*RKbzV5Z_H=YDH@wo-djd){~kyj`BtQ~a~4YrgW=bUQe2;EpLTxhQ3P8~6|`FDGj zIq&(gP+Xc{tSI29PtgXIBjOyDu&BmjP?_R`M46Zb zg#4XP#>Xyz=YQg827&`4(e)d@HC;E#iN0w%P2n)0-YrZjh&0`p zHN*(c$G^}im-$)VOs=edD?BjF3iK5x1pkCd)zS+WYt?=cwc3e?5-dt#slpf1s3}_l tqgI5b{(s9={-|s%+xZ_07;ArznQ1u{lRcLe3jGZOJGWE3inbk1{wH5d2^atX literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_01.png.import b/themes/space-pixel/package/assets/animations/payment_failed/frame_01.png.import new file mode 100644 index 0000000..7688b47 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/payment_failed/frame_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwvk6pkpvh63t" +path="res://.godot/imported/frame_01.png-113ab5ef9ec4986bd669d5bd168f05c4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/payment_failed/frame_01.png" +dest_files=["res://.godot/imported/frame_01.png-113ab5ef9ec4986bd669d5bd168f05c4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_02.png b/themes/space-pixel/package/assets/animations/payment_failed/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..74f8b4a845130ac3d520508021ac2331fd514a2c GIT binary patch literal 3415 zcmd^CdsLI>9e$Hw0tORwl}ltMYA4h|Wq^!ZxKt=`I0%lFLXj8*MGhdBf)Xw!1cjj% zm}|Wq3~u9cXo zzy^L^o_|a)nHn5S=K5kh4n}?-=4kL@7%?Vb?ndA(i~Np^FfY~h-4DiG-2DOcxPT@d zZ_Tm3_<64!gMTbthJxDVd$J7xh*Yy0y$=A+7XXi904O*J0G_H%Q1t-NGXOw;%l`^s zK0$;OBy;Q^@6Ej?B>ngjBhYVRhn?HHwuT){JQ_5wqz`b@wqd9)e3465DS3u~EnSDy zw4)AE*m84h{$;hlN!^D74qgL-_)@6F7z3enX*G1N46qnzh8#h!jdFk)6n zmb0pn$E~20w1|PpQ9aMXBSjX9C(n&_bvXjW1wy7}Nu?09QMC)@?$w3E3o~WtA>pHY zDrWwR?DW{PrG3weZ38$j$TJ*K0=bhty*EEKqg5U(bq%~tKw8aiCo5)Ce95cXTzaNL zG!jTEqO(=<)h!h+@Zr0qiu#!0UsRu+>AK|3rTDh6djQH_yqocFbqS1L z*8-{nI|=yEXg@a3nmB?znH|L5)x=`Os8sugIHUEGlGxjCEIkbxwk+BVKY^7uCO5Eq z2t{f>tD(T=#}NKOl>SK19gW26!I2Zco_|0J?IGd}@iQ?EMgBkiMkHZj0i}7@+(Jwp zT!a9qyx^_N3!S+X0j{qIm&cfb&=5B%IJ^=FOtMvZ~U$?nF*(FEG2DVLE+uBk8xmYNRr3vrSb8-SWsY@H?7NUCNAZ||0hnK%5(JDWo zpB;Rwv^yOoPIMiN=(5|~x@uxI|!wJOtQWCA5~ND^}!Ya=lBBhf+yHTMcXcN4$O6@ zJeQ?cw2n!g?at=Dgc1uXzsN4I*t@;-87fq@`JI}W?gAH5=1Md36%FoUQ7zVgP$*oi zY6|SmUUk}$v<*s0SSlX#ZJEn3zI><4`sXNAiOj0GBQADP#M?uytoca|jYFYcK9TN`jR62L2Nv0EQW^CzyQA(X7RpQZcVu+!FrN0I97=4-FNdS$h z;UWb|+`+MrINjgyqH#aoVzoS`BXj&waH0u*E}ra=GM09FN}588$+xlU&9X|>{6eCioH^9vgHX-U>3zb^B?;;5aHF22&uQ9L^6WO6b{q$g~luC{B4P{Y8zk)US4na3VP9JUBOt0~L=v9w9H z&-|%wStQjO~pxSm&j8KJ7b`nHA<+#eX7}3A&!N7A_CwX;%Apn)tCB zZu~Mww1ibIWj{bd<=5SnZp!D0S1?SLm(gK-t2#5;- zrGhl3yue-w3-?0Iq#k=yY>b$2L%x|jcRxdI8;w4$Li%(31AD(w8064U`aH!Ct;j%y zLQp_f9Q!9h;&L(pS!hjV4kTnhD;b!Jxy^rDFbT@K10+Mub^=TzoG30>^*5KaE45_UBAt42~}78j>*l%p0a!*D2Ww7fm{0NtOkh4CelyAm&ZZnDNb7o5hUgNiF``dMXq z;8R2{E#ovL=c9DF)5@Z)m^Iy?+W%{13LJBT;fSznIc_MeTT_sf-nuP=_iy%G@}!0< z;s>Jw)LK`$ffboloM}3~t6O7iHI!#3nC~&ugCopl!dBo4)34O@RYN_v&AG%pIP2&w zwB*Rzrl}OX(s-BXl|SH|-r?E488II}@yo0l(W=hD*i&d!p}oE1Lx#Y&J^K_&W;R}- zU0sVyW->nAwMhVJj8ZQY4?FXHU0d_LyJ+Keu^+8(^f3nGIw=rbhh<|8Wo^~kTZATo z4IvLV!x4y>GW6eHO{e$TZAdj7P}hxk9r5mN`InjW{|6vstis|r*rhLT&IhahDFHw4 L171}h5vl(Gvcu5^ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_02.png.import b/themes/space-pixel/package/assets/animations/payment_failed/frame_02.png.import new file mode 100644 index 0000000..b986c55 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/payment_failed/frame_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmv4rutkbnudh" +path="res://.godot/imported/frame_02.png-8bd91fa73de8348b1ee1bcb6127c0eca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/payment_failed/frame_02.png" +dest_files=["res://.godot/imported/frame_02.png-8bd91fa73de8348b1ee1bcb6127c0eca.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_03.png b/themes/space-pixel/package/assets/animations/payment_failed/frame_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8e46e2a3a70bd51dcee43b8f90173852f51efb5b GIT binary patch literal 3355 zcmeHKX;72r7Jjpk1QQ7=WCCJBtgXF7t%6p8$Ra9wRlt^^EJC1z0>fee(I87chy@)h zu|-7`S&BMyZ$uQP$RZGA6k4>QE^Gk_1PKy0$tFvn2{kl?I^%Tiy>ox`N9M~+-tRr< zJm);mb8^PR&2{M#^CbX)rF-}6`~m>D`YRk@Q0j+_`Fv9SFl6lUi3I?=Li2%vD>*~} za8LH`boONC40rt+-MO3KbnxpYpKXTX0(`%amxFM;oSw8s1Uo(w6V&m1V9^U6Wgt~-*$kk?amO$m}CVGh+e*oLTL+qcby`@Sl+xNNw2@buYL-vW8ZIf4$ zi1pEr^(PevE2%cE4|TQZ-}GF;Ej@7JXnb|?X#IUc`n12jAe{edQR-&!K5s1B!+oW( zP2!fclmIlV_0tk6?yw8TBevYu3I=QE_3hFa`-YwG%IA5=X`|VOEOX zQFG@g*gM+X17!h(+CkM;u;HOT%8kZC$Nu{oNt^S&3Hh#bYQLCuOH+&~ zROBBNp6?pn=CuE!d=E$ySy?NaqN0}FA8g^>C}ho!w%U4`=Jv`}Ygztcn?|qN z;=8)}Ynk15kVj{P!{xGcbXT^5t_m^89f`?vHd3}L^(&(~EK3?R@WMw4R=7|iURp)5J z-g>zC?iq`(>GKe2q=$qw=`C>Jb)=)C{k`5NJMAd%j`0vK`A*E){GycB!`h6rRcZ99 zaRam>wj4ip%m`n(j`}_ki$Kt%#~uAt5bPeNgTyp?Z%Ey%=cLdT#+fPa#*-$nhlI=O z$h1$G79akyu8!uQw*CAQ%WWF*!&(D7${6vl-J&nop;yEc1L5V@!>)|5g1T#lPp$_p z2}!k6UrK52RRQ}>>vrhFq`e->jT_(~SRnVf$9b33nqTy%_`|NzEnPq9|J)5~y%HA| z_k4ddtaA37q^UB=j{r9;SBUr&T(n*o; zs)+=g{*>j@Gird_z`-_ah? zY4^6bALg8A;=uUs1r|N~ZM_!t7%U_iKhX0#60BR*n~Pnww_DJ#6th1{^A8ORj_uElBAIK;1pIqopeo-t`$0l@rP6?Y6}LMJ&}j`S?c0 zYbEhaQ1M7>#Bio+_pFo=zks%yjR6OHO4|{47PhXTVnpKOeokh$e4d#V2D}O*yd5>6 zhBXr|ic9y$Kr70Xo<&venCY=eK`m=YN#9z1`^&1QTeGc;MP)N@CEbn+g}948a)u@D zC+OHxFbayk7SFlYQ!K?BoLpM5O$&SDdT51TM`~&Lt}%iivY_h4(V(WhqU1m1;ehmh z)Q!uraFX|k~5pq%HB63lj2xzt!9&L_0<-!?N1-Eg?3*^$W(8@U+!{*;ZuO_pqKlWDFfPQU| zU_u@%mCrsq1adL}#BCqH`lhH`a(V!K{?4O?b~vMwv=oP4BxoR!j&atrk!6Y`zL%q7 z4G=!gAlBH7p|b+jyXxHLSYhBK=y2ZX!WLOSM{_aYcNgMgcHp>IRy?(t3Ub)(qxS-|L{ZmJiO%4`#U87^AlH-*{l=?Vunt&S$CU+`2}@N zIJwzC;hZq3mkKWK@$e>E=w>SKm~d!&iWV(suf{yAkr;VToheRQ7q`g1 zwdNAM(o(Yy>1}J;Up20_DDr<#LM^q${qI6BUr(&`+-`*zuCt@5|LuUiyWDo(-VvDk E8$O+!VE_OC literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/payment_failed/frame_03.png.import b/themes/space-pixel/package/assets/animations/payment_failed/frame_03.png.import new file mode 100644 index 0000000..0b9ac3d --- /dev/null +++ b/themes/space-pixel/package/assets/animations/payment_failed/frame_03.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5v7kqjrfhqjw" +path="res://.godot/imported/frame_03.png-20ef1b78c45b7e49842910a7567db868.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/payment_failed/frame_03.png" +dest_files=["res://.godot/imported/frame_03.png-20ef1b78c45b7e49842910a7567db868.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/payment_success/frame_01.png b/themes/space-pixel/package/assets/animations/payment_success/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4af13f059346e5b5de93ca7cae76ec43a3c7305e GIT binary patch literal 3500 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 bp%P3+&N+AQ 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

c1e_Mbw@9@HhyIO$a|j>Y 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/ufo_large/frame_02.png.import b/themes/space-pixel/package/assets/animations/ufo_large/frame_02.png.import new file mode 100644 index 0000000..acadfae --- /dev/null +++ b/themes/space-pixel/package/assets/animations/ufo_large/frame_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgahoicv0q28h" +path="res://.godot/imported/frame_02.png-a4918cdd2fc973980576805a5f988f6e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/ufo_large/frame_02.png" +dest_files=["res://.godot/imported/frame_02.png-a4918cdd2fc973980576805a5f988f6e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/ufo_small/frame_01.png b/themes/space-pixel/package/assets/animations/ufo_small/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..cf240d2c0f61cad393c7d5ff087fcb3ab187665c GIT binary patch literal 1890 zcmdT_Yc$(u7=QnNA)$5Y=qOd3p4q8(q(wVj8_|ijnu;npZqsaf)TN@Rq;8S1wsQ%y z(xxtD)uBP?OqFN_Eo(?Ib8kd1R7n_diy-^cvyc0@bG8rfd7k$?=e*DJ{GQ+Md6QjT zj%#WdY5)KC@;~P;LfEe{lC%hs7*rK~}Adr)1003I=q@#oTl{~4) zo~j$Pv+dPwkBJs2P)GF;NKR2Rb2vqCI8I2)@^`%Z)7_%NyQ=Elu7pG*S5rf+ALjL{ zoe%aMex7E%I3Sx*9Qj=%^J!B$4L1|kN*now!-0RB@9d%jgLHt$LQDz_nouB79iVgp z#vJGnfhqex9#~At+(Sy?2>U%0ggQm6iYx$TQeumIX2WoSbl#hyEw$F$_$$QCUIs=+ zixS#1l^wI)y&3spM!55+I~cNt@Kp#BUt2C$RL|Ak*7#T)7UYc81(%Tvbf7(E%F7>4;S81{~M`?H$p(=ot=wIuM;&J*5XEU02`R*0(=#V1d&;C z`vm2lR>`!~hgA?6ga1eupnU8gNldoVt>K757CuWId#9iCgezT|I$+G+$}XyStWS|s zq!C~-$f$`qs7iS-H}l$eeU5{BsKR@{--`5QF%+M(l@p#NNV2?a_LbD3MBZ%2`aBIY`Zb zeT!G_uPKX%tcsUxMirGNsdh256JF9b(R?5K@=|fE4fmyOH3uVD_iBMR|Pj1T-7uS zK#sabmS#+O^SLYwz$XlAb&n-CPXSX;E1pWrz+*$X&nSI?>W)kh(Z{$R(|}f8FF=7N zBIrmFmG|XtZO~$Ro|6Q80y>gJa`KBq zz#X;oWJy5HNDtEwgW7n=O%xXAS99)}qDxec(6$4`FCP>J+afuwA)O{Fc>&3Ri5yg& zY`tl6{p>~=;4piIN=68}L4CyhyTX-f#-o=>(QfXcPq;%?0+HCr4PiT5ow9H5x)3d; z(&H|_qM5_>SZH&jxIoto*L>1fFQjL18Isk-)U$92e6bk;O~46WkmwHAkJi2rhyyG< z;~Ib7(`1A9K{^;W+(g} zw;`}E@7kXsFan zP7k+Ci1siU{#G>4zExt@!(YYV+uqHTJW8R)6zJQ3YR1-vN@w5nFST}xc#(}VhuX5B z!c%EEyJVaTT5KF-z>h*t)}!b2N_1Ksz)h#22aQ?uKqsYq)`r6JFuS5$@ZW#jYS+=S zwMR*ekp>-1;%z`)R;*55%daG9rQUZzpDtUye@KDWUuV2Y5}Rl7H+g2{0!NWgqx~;M zXIJ`uK?0boKUxjhSb(2nwE0fj;c5r1O>;Nz-{S9$Nx-SG{=e qkh{%f=m0XBO+NikcRmWF_$py9Nd4YyXJIk&X@Zjk7f0?fO5$IoukeBZ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/ufo_small/frame_01.png.import b/themes/space-pixel/package/assets/animations/ufo_small/frame_01.png.import new file mode 100644 index 0000000..30b51d2 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/ufo_small/frame_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy6p2hnvks8rp" +path="res://.godot/imported/frame_01.png-33c91e7b947de2992f5cd9947012bb67.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/ufo_small/frame_01.png" +dest_files=["res://.godot/imported/frame_01.png-33c91e7b947de2992f5cd9947012bb67.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/ufo_small/frame_02.png b/themes/space-pixel/package/assets/animations/ufo_small/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..5839c12f6198766613f547c081f3f5fd5921185b GIT binary patch literal 2634 zcmeHJi#HVN7XQZEWN;9J@@S=dj^t4yS6&Grn#GJq$|I2!kw_Rb9*0O&$U7v@Nn<$P z%y7EMb4ZhMJfkti7%>yg7~@Xou66&3d-qykz3!V`G9FYI%5KveQ7u@me&s!m*i`VA}p$b!K;)_?W z$Iu}`2ZAr@(z_eq zYOj4CV+d@dfP?lCzUCR*KhHAVj|f~T=3FD>LkdD+XwVZT0z~A2>_uRy4*|XZPe58h zV$AMFI}T`2A43Z|(`s1=#Gl%^Yt^M3A^-%sy-i}_XNQw|!5uh{n)`%N9D?+{skTB2SJR>Q%BL@@m z=bgM4B&OMLoo~Hd+bflKk;f~0bMNUO(!C^M_+)?hYyf$os?hhn^hptq?#UXFwSmc% zP`msi?vQ@-<%N$!J7EDDd0q*c)CuGe?@i|1H|$YuAQ5Fq@g~;SMVKQ38u(>n78nk5 z*Avh0c4*{3B$yV?!3Q!=14jY zc&pKk_%x2it|23GKLi#zm2$RUI~kG+N-ynmSlfL%{aeMyM|KWFlM!4cVqm2SR@!{= zlCzq-Snrw-rod?;JA2@l$MLICP;5wU&(`;jXYF`SatC4eu1C|?vn_01vggG(W1QPT z%Ng6d{N~M& z#J@QuNiC=GQXV94dL=UgQAm(O#kGd-E|r=jkgJRIk)~wLt8`m>fOx0Z}%{dkj1@CHg5}Tpjtk7-u0+==@{- zJ!`7_hUdZ8C?V^MQcx@mDMZ`h-LnSz!4+3J_&CMf^Qj3$t^lv=ZrJbJyfhL{H$G3u zH>rFF;v3B}I>isEkIS<5QTF%;P%-3(bUS8KyttSBs@4e^&2*n?x%_o@rvfl#|5&r2 zx+rD_smh_vBIb=dJvOv(&hyg>e;6u4_RHyS)bCy-4fz>$o~@*T7qO|%EIVC=QQ z#O$;_Kd;4v8ulFy99WvJUJKyYS@5~BZjCqY;k%!Dud9pe5;m=GW~Q%g7R^T! zS~`Y;Z4j52OS#fbzk4E`wxTA6Nkw~M-|0!yW0W zjgh1z$DAWt2uluYW(w*VuckJ>bIKj5cyFXwmVEqN{_i8 zGIDH(IX}&vujoC-lm4S)s8J4Hr}AsKw?-LnV>Ic+-_*Q!@Z|I`)>^yvr@)EdRo+TL zk7Ass;@y_jg`^rf9OUgyM--P?7L`bd%aX0S9!R2ItU8qxDhoj!L0N3^NP zO>_=)^`HgO9o$7huQUpxV>D(fBS4$7xfoa1&6719$*h;FiQY?LsV^|mt)DViV4=4b z?&;Li+oT{D406*JALRMGW&t?sT2Y!AM#*&Kq_<5tX z)j~QvcA{mVODgG=hHqhTDsXe34vEbDZGv?J&bBS9t$*{ZVYl+d@*Oe+t=5##%pf*v_GI-tYNWF+qh}C_8B8f^MmHY-IZp z7a3jBREv{~Vbt?kXq@lytQ==xd2l6xcFYvpWk+DY;DGDRqpl`0LBoQ-qFF`g(2(xiq+?p@BZ+1$HB>(^b literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/ufo_small/frame_02.png.import b/themes/space-pixel/package/assets/animations/ufo_small/frame_02.png.import new file mode 100644 index 0000000..2d17787 --- /dev/null +++ b/themes/space-pixel/package/assets/animations/ufo_small/frame_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2tisflc3r8q8" +path="res://.godot/imported/frame_02.png-bc96fdbfa255b226c621722b3f38f15d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/ufo_small/frame_02.png" +dest_files=["res://.godot/imported/frame_02.png-bc96fdbfa255b226c621722b3f38f15d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/background/background.png b/themes/space-pixel/package/assets/background/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9893ea75af6fa338657dc9522d106ab9c8250 GIT binary patch literal 96063 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 KqC)>l)c*i>tv;0i literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/background/background.png.import b/themes/space-pixel/package/assets/background/background.png.import new file mode 100644 index 0000000..6cb78f8 --- /dev/null +++ b/themes/space-pixel/package/assets/background/background.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1vaivunuaov7" +path="res://.godot/imported/background.png-dcccd77928a97bb3ddbc4a0551d8b8f0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/background/background.png" +dest_files=["res://.godot/imported/background.png-dcccd77928a97bb3ddbc4a0551d8b8f0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/decorations/alien1.png b/themes/space-pixel/package/assets/decorations/alien1.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d0481dc48a6330d24e78387ca60f472d6aef46 GIT binary patch literal 31719 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

kqp-ABNu3W&66H*L)E?q%AF)Sub3 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/decorations/alien1.png.import b/themes/space-pixel/package/assets/decorations/alien1.png.import new file mode 100644 index 0000000..1a83298 --- /dev/null +++ b/themes/space-pixel/package/assets/decorations/alien1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btsthd6xtskwu" +path="res://.godot/imported/alien1.png-ad004163259cc21dc65eef11e5ac9e0e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/decorations/alien1.png" +dest_files=["res://.godot/imported/alien1.png-ad004163259cc21dc65eef11e5ac9e0e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/decorations/alien2.png b/themes/space-pixel/package/assets/decorations/alien2.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeccb4746bd8ba834ae8327169f44164bab4f40 GIT binary patch literal 31086 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/decorations/alien3.png.import b/themes/space-pixel/package/assets/decorations/alien3.png.import new file mode 100644 index 0000000..862ef8b --- /dev/null +++ b/themes/space-pixel/package/assets/decorations/alien3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wxf81owt4q13" +path="res://.godot/imported/alien3.png-56c4f7b1baa050fd21293be24fca74cd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/decorations/alien3.png" +dest_files=["res://.godot/imported/alien3.png-56c4f7b1baa050fd21293be24fca74cd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/decorations/stars_1.png b/themes/space-pixel/package/assets/decorations/stars_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a409823cf74fb1a5cf6f7e65bf0b8ec749ef533 GIT binary patch literal 16919 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/decorations/stars_1.png.import b/themes/space-pixel/package/assets/decorations/stars_1.png.import new file mode 100644 index 0000000..1e9109c --- /dev/null +++ b/themes/space-pixel/package/assets/decorations/stars_1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgnlcaoieg0aw" +path="res://.godot/imported/stars_1.png-dff04f3d5b4757b15b3506b6c32ac062.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/decorations/stars_1.png" +dest_files=["res://.godot/imported/stars_1.png-dff04f3d5b4757b15b3506b6c32ac062.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/decorations/stars_2.png b/themes/space-pixel/package/assets/decorations/stars_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9359094143ba1ca1ee691c3b8ded31c3ae5d19 GIT binary patch literal 15935 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/back_button.png.import b/themes/space-pixel/package/assets/ui/back_button.png.import new file mode 100644 index 0000000..b231469 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/back_button.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sntindr0yqtc" +path="res://.godot/imported/back_button.png-36441c43385864cb39abc422b7c43873.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/back_button.png" +dest_files=["res://.godot/imported/back_button.png-36441c43385864cb39abc422b7c43873.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/billboard_ads.png b/themes/space-pixel/package/assets/ui/billboard_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..07e41fec4a29b9dd2702c15fa06aa0ebc812663e GIT binary patch literal 8086 zcmdT|c|4SB-@hzzoQQTymNq;p`-z22_qT+a80qqSFZewG zfakQ{$)5mVhkseYcO39%UyDd7{NcK$XW;?B)}6?g1w4%72S8Ns^vM&Z*tm~F{t*{w z4@5svS|eOtBB}|7ScPg9ckV~i_xK#+wiH|T{w|eW^jcZ|v{$B?h3erZUZ4`AyR}(YBQZq;Il^@kN*zw)z##rIEF0yjliZ06HiybCRmHDPiy{B=M zia1>B{IZ^zhKl#hYO~rx{CxcEtQs*{k`)S>R(v~uFZ>16MC1x~@F7<;EAkHLp^+=# z`VP5@v9KUNhs2O8fgRBo+#(>?|HqpG^Pu+Bo`OYT$t(0yb4K;5j=Q<`ZdHfLn!GIW z24XY@4~E(i9sgeAVDLi==bGP2c;Z7^kH4gH^W>DEyr~w&fZV)*y@xp(bzNh4yaXfP z%1h!FM9BQD#Yks%6(nq7<#v=bQDF;c{M6o~qNsTVYr=$b)Xin(WQdk!HMsI+;NA9( zuM&L!XL&*=Wp||sb8ylkJyP-eI-RZ$stQmzWwR6!_TMMUF;Lm z>Y?@)i!iPjThoo*R^}7Rw+&%hyNq)qucD&H>H9i)Ro&tu=GpiaSpc`*y+Cw!;fjaW zE}@5OIR1S%4p0mjtpW{&4;#8LnG+bHU6h8jhAX~o%dx#vt`t%MbBcl zjXnvvQI8qB94A`k@?br%zC@WNAn644OVJ#B9}gc%mw-f7Q@h`<+tBtL7qCU2=c)3U z>2MUh6a8Bt`pHCG`mowqjM;q5akp*_x1iBg)!XxI!Li5w#@bf^I#df+L+S6ASj^U~ zw0J=NHQ;(@qKf7MVsX@5aCO!bw@Ga4jn9;f6tA`ENXjS7pz4DoHp>!*QU1`$8Pum} z3TIaka>~IW5(`j5==4#09o(0!EZYu3X~_mCqey$D4MW8o<3Uz_IY)|N$v@3sCA@W{ z?X7gL@xRwnmg?vrJ90Kac9@V9mZ%Wvd00_6#bH*xoqDJtZ83p7i|%N(Ey)hS_e;`; zU9SWfsB7eqM^{1rB@XcZeJtzo@woI*`}v%!vqr+)LIIp=(9`XEED@gHc>3>-s~g*Q zcapm`e;*4!Q{tcjAs_^R4`m3q8!VMBZKmqVkh7+;({cRVeEXIBNLNX{Xt$Y&8HWBZzMckmcXhy9iPLuG^1Jd}tgy zkR_=|?)Ha@86b>EU83jj$aw>Kc{XI#j&?xU=0abt$iELQ7GkN`@*TmO3y^-bTp+uT z-y85C)Jv!!XByn5-6jr+eXdp2b z9uV_t@^JxkP}hrk{V+^^lw@7};;*ya_+_ER`_DzvzGneyL-cdHK}@KAM(ZBL3VLWZ z;F~UoTBDW^hjti?L>OCnUbXV;OTL+|Q_{c<(DX3L(bDXJQHrHasCGzHZNS=$_kmRL zE1I_!?xP0iQ^T`rs}p%lPiM6J4uCGktqC2>bD8^GLirp!8sYP#q4x!2?oD^uB^M`~ zRaz?#20J;@;T>b0y9bbp#KT{m^IG`4L|r~|sUxmnbkV&;>us;5NHH@iWOQ#V)X&Gn zf)#vtF>K>y=(qMFs=nJHQB-}KdlY4Xd30fVP`FH@KBa@7m}iHgi>e9Qv4Qq#t#QhN z)^6ijA9?8*Z%mw4k)*Wxe9GML+EUbL=!M*RVavn_SKigMV(qy7Fp>VFFaztUPMz)C z>!-2C=&s!9K0UlA>f?&Fi+Z6_nH!9#WGkZ9|%bDNE#tr&(<@$MgLTJyT zYj`%@CNkWp?2xo2)?R}eTPbSe3l;rP`lQKP+%yb;D|Q`^=Vo(C<*WzEatXbRpcs^| zuT{Z^*;-mS)7navS!18O4Uj(PoWJog&t^>5t4=*+IIN+*5_gmvJ3cb8^xh(KET?T) zkV#Eoo14s(xkoll<7NRjvbG20eRgkH)5eX34hfA;m+FrtURcT70F;hM(6L+AMt%SNKCR@ne|Ro&Km4Gt)3o1K(+r0e#W&KUagQu|?hnXOXV00^%% z)n$$mgK`^+f-J`xe=~0gF)AyWKFk6h<+)VbWBPvCoky#>*Q-|QN=0R_gxJe)A=~0( zidChTUcTrp3-C7BvlGLx2vDgP^k}r+4bXz~I!57Bt>tnHhBHy*on>}&>sFG-XE-8IZ5mhvelWR@zFtV!nl#zd*9o%YdXf2oC6L~D61!o<0SJY--PXg^- z!jPKNN^U~AEH{@nNMdUf?cW<+XF7d6UqP!B>)F@D0`xL&-rdSH(;!oxY~M-5;#!j; zZ7z03*|_?;jMFB#Oxy)Qdm!%qFu%;Szqt4%c`eKvqP+|!5KGsw!cFkV?I5aZU?eMi zn^2Ot6B{BnKHe)j;Hg5Q37BxfbjkTvP&A6oj&Ap;LlXB7cyfie0~7sY z5=A)|JVzTchcm-GM;eDqnHA!xgnrL zLYQNdshGPS0r3M6zJ~{wb0V@=3F4w@G=d8M7wbr*LV`dopnSo%CzN+}Dd$}2coDCb z^}H=iIHOBXcAe_r?^+@C{H40G-3p$`krOpd88I1 zNL%675|uT*rX27%lC$b;#)N*ENrVQx#=H{w*?!j3pIRe~>Me&6Ae zsT+?S$;G!*dyR{j7UsDymTnQh)?)y)+o60W$14Je&be!P4cP;31Er?1$a|BkO|2H6 zFZDTZDuiY&0^Fe&vqqaUim0Y2Gbky#_|KAx3@B;gUo=ppt*u_22qN>Fy!^CTd9Sbf z(TSt^ktmUc4{+yQ%%R?4@E(9%;`5-t*V8;H*EA0P3;t)Z2!O2E*{c;^IHAgj`Q{8X zK$Ekr&o3ZNWbiK=^(xv`2u#i3OJZ6m*~_0>h;MVnb2AV+gcZz%m_rEZwE3ZDBKUU; z7L{+ad;GJTcAq(gxD^=L-n7x=0>Mi%=TxFq7{5U|MzE}e_afNUBL!=NvF3vv)EG@9 z3D=|-u~bo$cs_0maHN$#-$sDXUTS@k=~S|DMT!){ao*Lk@q3m=OIXGVO`&3fO3`{+ zQOe~aYs(qF(>fwFEtE^Emu{#IcZPzsPx?8=76EhZ*-NF;1zQGhJq@T zjqvWaeThxk>-8A-6kJjvlhqk&orwV%J&OEK*O2<{&r$P=bB*>~`Le7S09Ds^fI_)L z$=$Z-8btZVcY?046oDUYjZe7@WjBdps#`7(6pS46O%w4uH&lCr3VN9xxXL2cm@T$M zCsr6)S;cp?xO8CV7(BO8ynSUI?euM3)^(>JIY75HfulpOc07kByt({(hEVD9 z(|Xtj6*~KskB_P3mZbcVN1Jk=#T_gjqC7h<+HJoP)?#o2w2uqR2ivxnPg}R7>AO0n zp5Fy^FqmF676i=;tV3MTZzk@}!Bo!YL8j|6+49GiVdvUa{2ZKSyz;$*V+9a0w+I{{ zuKA$4(bChrYerWg;)4&tfW(12k!pTDa$BcRYQKrZ-TgtZwj&tycm!SEitIu<9eA=F zhLkT1xGojFj+&6}e)NsKog7mqTg9BTv-zhvp)6XPjSmt}q_!0~+uR`?w<8>DJLRN$%PSj;Wq9FKuF4v z6F3Sxns(9k8XnDh*98;`7PYsGgh*|3M_8mpr)CBQGD;IHDG$%Avy;>H=}>rTHLlmb0g0U10z2OYN9qz5Vmj4A);QF+Ys!B_@((zxTdU9=0 zW6nkaGi+0_u~i&wZxX+W7d@>{xv~B2E3_7+LqV|U1i{f8E7sj3=oWsq9{|aa*=PX{R)WAn1bky+IKf&d4q^hMq2u}M zIjZReh5h6$i|N+6kv(qsmje$0;dSAPZUf>e!kX-tc-33mxd`E20(Sut3D(bM19UC8 z;9`5LnK|m5P~=pNl2QVv`4oH$NN(&~n(uwZ9yYrdP&Bj;J9w4O%L1x6VO?e3X$RFc zYdlZtf#$uT@F}-dTLjW8C-!;aM^s{S)u&N`Y`tT$44V80@ml)nQlmzH=@9EnoS)5j zUVb`(sMwCY{!;-1?{*JQ_JV0?t3#UHYiuQ$SKY_`wZ}@lcR$jyP>BHru`c28#wK@c=S?IF8Vabkn$Q+I# zUm(PUmFwc7AW`Sc0>UoiMb8@(+7a?qZ5tSy{VeuY|i6^ zAc}SitT6vMAcN-^x(9)(|G=Qx&RzzRB~e8BI#zopAKPcK2M2E`BZlz%>UQMj-)KcP z%W00$+rkp~a^F8VD{ba&J3GUZ9l34K%F2HA0WHt#tj7x1jsS2n)}hVO8AvyC=&wK zPjA-enL}8!BF2Or5Vt#^qpN%6*{o>(c5v%O^ImHF1F8B;PM0QoXDJcQA744Mg7(tT z^n-E%H%?e-xcf|t1UwmQ8^%%?Exb7wx+Q1&+GDr8;Dbr=_*2Hm`LPELDs@RgJLeh$ z_cmH@1Lz-5?aISb0-_WsGGWVN@E_T>>w-Eg?E3r+N8r}$FN-(N;&ri=bntf+DeF?39 zhrQT2vGmScMb{wSV&Qkv4!9>YFTMkdJ6&EeZjP~a3D8(xNRc~haE~kn2#Vri2j^1e zX6tI>4(9#QcmGmbEb->6cx0FXV?wy!XYO1%+24I1KZ@UYnsKpQVa}^hpB3oY^(5KU zd2l9%4XH2GcfHjq$K1A5JW&RjB~gZbj0JfLEW0Y(9ef4Ni2fJ5JhaXst1@EAbLz*|+2K#$Vagdj!n?v`@g|@fxo% zAE-L&$E;)SwRt{aQ)?4IudJv2Y~JwFomk5h2$02>(CL`Y(YD&vJcZHEznR}98^E&b z?5^#^p9>dNKKe*47|(>xmeW3}noLJ^l%~wRj?S$;IP5Pkt+_aXy+Jt=bY8mahZNNn z6<()|xyQyzDD14=6Rkgba-61UD36)5b8prhE=>-S=jMcRBTMHgwGSL*ZYFP^dzTkg z`~Fd-4FCml$NO)Zi(6}Xg;#32e+&d>!hV6Pz-=Nh%&y4|yAQ?$hm(YcBYsKA!S|rw&^89T#a+ zQf_d3mn#6!x;hdmSbCP~HODiG3kG# z@@TT;1?b1_W<|3@Hd}*jxBh`~*-mPNM;M-8SbdU|jqbjIXmNS7%-F=>^&!PuyO*M# z;y^5$sIF2;kA0RY*nq;<{XU*I*Gdn6pfwwoi%+7%7W~#=$84#u>sb8a;;K@T5rQ&k zvLQW?_wr!`C0-Zu7Z9`C-6Lo2v3V<^cjW4uU*0BTe7nP z6Jd^(+r<3@NF8Z*OykJyq9$W(q~Xc63iS`wehX7Iwr~)|;hw>WIRP3qAlzv58eRSE!XuA#jMf5>T3B9e|-g?{0m_JkEYf?C7Z96EmZbD dCEm>yIukRlA!~NNa}42f`jpYhoF8m|`7be=h!X$+ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/billboard_ads.png.import b/themes/space-pixel/package/assets/ui/billboard_ads.png.import new file mode 100644 index 0000000..808037f --- /dev/null +++ b/themes/space-pixel/package/assets/ui/billboard_ads.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0kbwcs8mic3f" +path="res://.godot/imported/billboard_ads.png-09f5dae37ed28603ff7e9bc1d29a6c0d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/billboard_ads.png" +dest_files=["res://.godot/imported/billboard_ads.png-09f5dae37ed28603ff7e9bc1d29a6c0d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/bubble_large.png b/themes/space-pixel/package/assets/ui/bubble_large.png new file mode 100644 index 0000000000000000000000000000000000000000..d964d46a303f2e596db3a277716741b8e8acaafb GIT binary patch literal 1401 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(t#9bfk$L90|U1(2s1Lwnj^u$ zz^d)(;uumf=k1+?d9wo;To3N}^uNAnh0@lp)mEDhN>t2|Tp1)5xj^U4%i0;IO?>4U z98Ry_tIxo2V;%!T!-CiM#1H74%Wjx-`kr_}nivBEhY$mUz!Q!K7H57le6|;t71l{% zWN1)eWMFXYW7wAdioN20`l`i^>^eYYDhvz?Cj<|eo%zS`yY`(G-;TpTCp!Xh6AJ?a z3n$F5XomNXPu4dif9P$nhH3L)U~rfKbO6|3WF4QB7L->0nQuBg5%sn8BaOwa# zcvJx-;wTG;UGHic)eYX(GBOxUXNAV1B~!$?FZ>5Kz#w= z{;&8s|CtR$7&rVmxPSfq;>YX>9%`?z|0~4|FD=Ebh>taHvhefB)__-lp-AD@@Zf+ZeU5rB~_ z<5<4f#c{C|@WlNqZpWtj#CC>l52YCyZhw06pBYvRfQqHfQx-Ee{Pg+D9SMs=<%W%E xI>%WYIxGM8BBj!ZGl>jq4j~mtHDCU)UHPtMU~F=J6|gL2@O1TaS?83{1OPF{BOU+% literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/bubble_large.png.import b/themes/space-pixel/package/assets/ui/bubble_large.png.import new file mode 100644 index 0000000..505a848 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/bubble_large.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4uvc8mo74hy1" +path="res://.godot/imported/bubble_large.png-9ee2621676a6266d6c87e3e367def13f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/bubble_large.png" +dest_files=["res://.godot/imported/bubble_large.png-9ee2621676a6266d6c87e3e367def13f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/bubble_small.png b/themes/space-pixel/package/assets/ui/bubble_small.png new file mode 100644 index 0000000000000000000000000000000000000000..403939fb7454ac7cf231a86171748e1a219f5472 GIT binary patch literal 838 zcmeAS@N?(olHy`uVBq!ia0y~yU;;838aUX1WNr9GZXm^3;1OBOz`!jG!i)^F=12fl z{qS^g45^s&_U>)3!ww=2fy#gX$M=bdWPQA}O!eiNIBu4YnQ}S1ZPhzZ?^>5%a8#f5 zO}gbT29v$=wG0di^*~FS{M_Xm?n=HtT(RCWn`z!T7N8IivqUnUIlV&uS-ovE?}nM2 zKmj1;*u*rWd!v0x{O4c~@NQ&VDKuv%xoWxEf{j1~rl7gZ&;2M)xra2ybOo*=->Y|O~;VEf#C{69K@ z%H<*jYyRGGZEO}~V7T*WJAXxRlOss@q5glzog4yqf(q4dhyaI&CG8ZvDEY#8BW350 zI@=F22VU=YKhW<3jA^_UKXG(;{5e43!I{JLJGwyu3&ij=0@k^k;n|};hK$0e_OpS3 z4oME$4firGWHB5|zHn2j5Y~tza=d#Wz Gp$P!g3(ms; literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/bubble_small.png.import b/themes/space-pixel/package/assets/ui/bubble_small.png.import new file mode 100644 index 0000000..e587453 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/bubble_small.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq36jb502ayh0" +path="res://.godot/imported/bubble_small.png-af06222515af2f67d59b7298476ac60e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/bubble_small.png" +dest_files=["res://.godot/imported/bubble_small.png-af06222515af2f67d59b7298476ac60e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/bubble_text.png b/themes/space-pixel/package/assets/ui/bubble_text.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9736353576985af91620813544e6cce5a3374 GIT binary patch literal 805 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 Pj-y9T9)AAaPe1=J6efQ$ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/button_big.png.import b/themes/space-pixel/package/assets/ui/button_big.png.import new file mode 100644 index 0000000..23a4819 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/button_big.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxw1d5ftc3jpp" +path="res://.godot/imported/button_big.png-53daf2f20d0531d38da6750da26e9d06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/button_big.png" +dest_files=["res://.godot/imported/button_big.png-53daf2f20d0531d38da6750da26e9d06.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/button_cancel.png b/themes/space-pixel/package/assets/ui/button_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..a796a16903c8a63d7a56fe509bf8d270c9375d95 GIT binary patch literal 3586 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/button_cancel.png.import b/themes/space-pixel/package/assets/ui/button_cancel.png.import new file mode 100644 index 0000000..a66de7d --- /dev/null +++ b/themes/space-pixel/package/assets/ui/button_cancel.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://str14omahot0" +path="res://.godot/imported/button_cancel.png-c68d2786ef503dfa2f7fd44eab8d59e5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/button_cancel.png" +dest_files=["res://.godot/imported/button_cancel.png-c68d2786ef503dfa2f7fd44eab8d59e5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/button_down.png b/themes/space-pixel/package/assets/ui/button_down.png new file mode 100644 index 0000000000000000000000000000000000000000..08540d66802cc78f95868c6c270ecdeded1eef01 GIT binary patch literal 314 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/button_square.png.import b/themes/space-pixel/package/assets/ui/button_square.png.import new file mode 100644 index 0000000..77fa3af --- /dev/null +++ b/themes/space-pixel/package/assets/ui/button_square.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jcpf3lum8v3x" +path="res://.godot/imported/button_square.png-3a6939c8a48dd51fd0720212ad6a1a42.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/button_square.png" +dest_files=["res://.godot/imported/button_square.png-3a6939c8a48dd51fd0720212ad6a1a42.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/button_up.png b/themes/space-pixel/package/assets/ui/button_up.png new file mode 100644 index 0000000000000000000000000000000000000000..cc43e242db77a2d3bd8aca9eef0e8213480136c8 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;Au}6$B+p3w-YY%9x~u@F=pDIbJ_PtlFYQE z?mA-*4Z(GX<}N-WkQ17<Yp60~YhJypHSK{AW6{d)j+wxG_7MpoS|>+iAz98zj>)!mRVi-A>& z`LLDe7dzH#jJj^`gBzF)wqKg<+-NRR0U|7l;`BE% zv2w|9{%3YwU^B&6JSCOWf8tvH={bL9@A}NTO-S#zL-BH;pBWfDUHx3vIVCg!06WWX A@Bjb+ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/button_up.png.import b/themes/space-pixel/package/assets/ui/button_up.png.import new file mode 100644 index 0000000..2bb86fa --- /dev/null +++ b/themes/space-pixel/package/assets/ui/button_up.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kir5pffovdmv" +path="res://.godot/imported/button_up.png-5e5ac029c05fd03b799846885d258b66.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/button_up.png" +dest_files=["res://.godot/imported/button_up.png-5e5ac029c05fd03b799846885d258b66.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/interactive_pet/cross.png b/themes/space-pixel/package/assets/ui/interactive_pet/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..20190828b4edcbd74acec2e4c3d3c8bc05c7921c GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoCO|{#S9GG!XV7ZFl&wkP;i>3 zi(^Pc>)RW*d0QNKoG(guGc5@Hbt8AGkP~x_3zvM_l*!p~ZEu9&tYc#ekHqshV|&sr=K^Qv#XnCpA@uHL|YJ(0e5kzGCN{hHXdrd6vRKTSMb zW*fTxZ?n$?PNS{M+UI|Lz53Rneb+)QPO!{0$a<0GdZ3CeF#Mr{aLOT$g{%2laxw)< zMfr>z)lP`Cf6ikvOKAmZU2LPDt-d{W^Zk;`Vf^oZb8ema)%5-)upuA17p|VEaFuQG yM|;(6Vku2N6K3WFD*;Uh8VTf_++P16*8Iw8>$KAsmhS_4fWgz%&t;ucLK6TMm1OV$ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/interactive_pet/home.png.import b/themes/space-pixel/package/assets/ui/interactive_pet/home.png.import new file mode 100644 index 0000000..ed8eb67 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/interactive_pet/home.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://n3incnbhl716" +path="res://.godot/imported/home.png-e47cdb385cb1ae8c69a9969ae0384667.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/interactive_pet/home.png" +dest_files=["res://.godot/imported/home.png-e47cdb385cb1ae8c69a9969ae0384667.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/logo.png b/themes/space-pixel/package/assets/ui/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8754482f1c7b807b2d5783f5b6791b15ec9606e7 GIT binary patch literal 10030 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/logo.png.import b/themes/space-pixel/package/assets/ui/logo.png.import new file mode 100644 index 0000000..d0216ae --- /dev/null +++ b/themes/space-pixel/package/assets/ui/logo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://218aa00e5vns" +path="res://.godot/imported/logo.png-e09caff8a916489027ad714199e73712.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/logo.png" +dest_files=["res://.godot/imported/logo.png-e09caff8a916489027ad714199e73712.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/panel_card.png b/themes/space-pixel/package/assets/ui/panel_card.png new file mode 100644 index 0000000000000000000000000000000000000000..7d585fbdd360e620751f9bd84f93b5618a6ec374 GIT binary patch literal 7111 zcmeHL>r-1r6h8?ugtP%1oWhVcp;C*L&|(#cLK8p)0yDHqD>_9IEf$nV_gocs=Nv^xl5BkA>0PlyKvpKu> zoZYj(``f*zZeL0QkL%9`0G=!{?o|L5YO;XCMoP6MxCSW?W#StJ02_Spj{!}m`~di6 zvbdQ2rKj#qKbw6Z%a52X_%+7&WXjI!)Zjwpcl)^^nR!`htx2ubsi!lai47WRyQ2>) z=x2+bNN(QDy(&}wrGF}UI=}Auyu^mmklSAtSXQEvN!D1)e7U8>HFDdwgyKR+&vS=_ zxFN1&V#VTM=^cP&G=U{B=nj+xIwdq1PzKi7`=KnJ@N&$z8-uE-`w14&0%gjNs$BZK z9y8Pit)}45DeI>6<%M&aD~uV+)1~F_H6}-HM4cjWONOCuH~%$qVuzP2i03@GODFw4 zkO4q;=BM|UnM}+5epW}TG=35qFB)x^G8p3ghtl_~5mq+<4L3${$=f>LbFx;?CS^5) zrx6DcZIdsCYR$uhb7`^HTXV-*lJhutQa`%as%oStWPA3UrEF2bX*|D$(O>|B(8Y5h zbH_oBp*fKy?lQTXf4-@-URL$2;1K4miV|j*W!#PYSXiufl(e|8wZ41%Zp+R+usQPq z4*AjaXFU+lLvDa;>5EB);sWh)Dr_I+wp=h5L-5kG|CciFK<#mr3uda>(lp+9Tya%+XDszqxBXW(t zGVVsqqUivWF*DS>a-nJ)YTxQZ9*_xd1#pz^Sg{OP5|4bW_55=J>#Sqc)5khtk=Iw^ zm5ReAeJ#90U90)S0C+glVE;{m52t}5wNS!8a}FP<>+KB)S9+weTE@b>FjMG(m3L?oi0=yE zEdG?%jLuP!fjVk%csNA4lX)Bk+49jxqaSnO*yi z5YOY9;T7Rwp@WPR!lpVX{}B5-lWl7ZS=_;+kjL6UQnpp0MwM_N8^h(cyUY5claGkt%ScJqaRzTu)Jm z)Z3#L&Srwxw0y69*RTW|_o&U17a}^oIjYHLK literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/panel_card.png.import b/themes/space-pixel/package/assets/ui/panel_card.png.import new file mode 100644 index 0000000..d22af90 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/panel_card.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://50n4k7kjdpyo" +path="res://.godot/imported/panel_card.png-515ae32d4b979e65038f4e96c1da1d28.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/panel_card.png" +dest_files=["res://.godot/imported/panel_card.png-515ae32d4b979e65038f4e96c1da1d28.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/panel_dispense.png b/themes/space-pixel/package/assets/ui/panel_dispense.png new file mode 100644 index 0000000000000000000000000000000000000000..581e811c21c125318025ec7a4a323aa2addac198 GIT binary patch literal 2314 zcmeHIi%*kR6hAEuMM_)H@Cb#KF&z^-HsWjvVMVdyF%os4g3$#GGcbWzA3R(}dIy1` zqL`WCltN7im1bCoWw;CqA0xQA@st$@tU#5?bU<+pl$FwN_m)3mnej`$bM86kcV0O+ z_gpxzFM;bB=m`Maq(oT?01F=(;Ngzh+uK-MG20|hJaQI*vxWQ&xTy*N@aRmE?KxPi zS};ZCe3ce}%(ahiT}lq~@6q~3M;!_;_d7N@Zqz>1&K!K}#>L?zd3bcefJ(>U^reI; zOA9w2i!OMOa_?y9Wp3n!kIt+Q87x+j|C!f=?v_~Sy4YOnKc9;mGrCGXo3;5%OX&3O z?6v1l=EBaAYKouDkM)h}x5%BB^!n{}H@VLX%IFp2kE1mlY~9>$8&GH8i_i_!3~NsW zI;sQhlKS-h~T}<-OUXkNVK8exQTvz|K|PtSbVhbj|!j z-iN*U5VUJmV8?!6Pu#B`KPPdYA8b*UqbFU{5k9a&N3QT_cLnx}Z+kJ_`MrcyWxs-s zGpRkj-9178bb`Z}EQ?1rjg%S;t~BhY4JMbG&zN)@Y`?}v*|DdDt7rGqI7528plnc& zb%tiA8$fG#JA0BD5RQWb?05}g*4Y4=hw{8uBX9jd;(J*dY@8jhI%{1{lDR!z) zE5CDpS4KeKmrN+aZ$;Q3a9zk1S}!R%98Wic+-Xn z5x`5({i{C69ACrt&x%)t!gqIvEdgxqrdAJ z$geKPcGug<>$-GUJY>3YIp-%*JE%k(k8*_vunlZ#7tz(6UsvSbTBCbeL<;ePJc4Ph zqM33lx=x!q3W~%R@%mbHq0d)iLQ|t*QwMmA8Yr5(f+L^xUhjo_p(uM9L0;oO5{`F9AVRq zo{&(EJ}$)?u$-L9(DW#_yHTgJh%EZKY+Il`EfnU9{&?Crm#W6$k;SfAQM;4FM;8uurCo%PjpDudd5X literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/panel_dispense.png.import b/themes/space-pixel/package/assets/ui/panel_dispense.png.import new file mode 100644 index 0000000..a91e5d8 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/panel_dispense.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lxwb8ho7j3iq" +path="res://.godot/imported/panel_dispense.png-1cc4e964e973ca47516b816af34e902b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/panel_dispense.png" +dest_files=["res://.godot/imported/panel_dispense.png-1cc4e964e973ca47516b816af34e902b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/panel_large.png b/themes/space-pixel/package/assets/ui/panel_large.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb45b70772a7782b09c521922535a7fd5e90ba3 GIT binary patch literal 7111 zcmeHL|5H>|6hCiS5f(wD3}pGD0}3H*Vn`NWb|o4hMm7Ue%Z3e@<^L}{e-h1wO z_ndpqd7pRBRlSyy;L7vn0f1{#V*Kj>T-4=)lOt-BzPn3M<19@)mJi_a6n+S(uJHok z%aY;`q!rc}b>Z2EPk51c^Lq|>R;37vQ+J<|ew)S%%gQ}*MDwbqIQ7e{khq|(%lC%% z<+nJ7KAn8ghc}uey+5=wS(m4Z$W8pDFl_2lzR4P$OmPR)f6Gm0Y`s&KWuzDCuRWjX zk30Jn9Nci7Fm>OKsfffB2zCN_fprO+49ElQ_kq)ZMTW;26KmdHa8S|@mR0&r`bLz? zs<4$WPVe|SfB>L=7R(-h@rAYxRk7`R>QBQ`X9+X+%i!`&HwP3}mwt_BK|^opR%yX+ zB}~%G%pc_@@k}C`k=FC8^8BJ&I|Po=%>9ZRk?^i%x#-6uaGr0g@TOg9BvT*fel&tx zL>vFw(M(8h8cyEZ2q1ZI)vdR|8ZJ?G#0a>dXBpj_T(Y}!w(G9muo>ACGP)wa6ywFI zdq05+jD&?UWr+~2HS-LoAjpI054C=#94<*`=pHN9mZkgYlx6tO#ewwC!z|Y$?J^=vN%9bf znoieyPc)%XW%E2pmXJB52nwaswk!V5h%1}3O9Bc70B6kJ5bM`?G_&3S(fU`O_zCid zZf?!U+(&G}+!%frlq`6J-OXm$hp?dYr#E_Q-^zN8+Hd zheb9SP!_Psz~U831GZ+ukjP>pi-{-;SWILw5v9R@hl$j)g|zurr5jYt#eQZ~=&m!C zEB>y?gxXQ{IlWM69L}k^4I{L%eC@!k$*_*Mzr)+L1&IJTxDz)bDwr^QBZoG8S4q9p z$e2D_vN3*Zb=01-pxt2S+ngz5fPj&sI;YYFtd020PPN?LCRs|P&FZ1e%CW02D70*M^IWi^#u_1G`sPDU(RK6`}E8K~|lGMDJNH;Udq2AjesX&*jsPf#jn#!kxd?AHLSh?8Zy1izx%$%+QZT2QKB%7kE&A)ek zOc=B?*BU!~te80;-C~^_(-yyBFWR6y%Hk+=LHzn)d!6#H%29;)K>qJ5I(CCN&W~;j sM7Yn!oQvJSx`a&znNpxFijW^ib-`wadX0O0Y`ztED3>SZZaIuiZG0<*vPl6Yk>e7 z+=d~UP-?owID(+IbHPX*eHSwcuxu1;DU6kpZGfq5afMOJ=<5q{iT}+0Fn`>fb8ha< zJ?A;kea>fxGvDF`h6e)RrHfOK01VnC5WuF*_12rkwBg9bIb{HM$HpR{)`S72%968{6Uwu~A#2hT(<{i@{)YxL84tFFb6h*PGK zJU%W|I3Jk4X^^qW%MH}(Uu~vuw=<5%TpO|Z*4;DtojntK_z|W1F~{@Qh^WD0VRTJ2 z?Bi95ojX}Qzmas^>ROJ}vZ#&o@=n8=AJQAj;N~&f=}-adx$I(>fc@f$x-^m0#kMaQ zsO)CrwP4JbyrL7cf^5iW+6)H^_na3=f8m9N6K`voi>9hKYmL z$*f!RemU%qatbrGtAeB+C9HczeTdu^gyb?NX;7j%#=T8PK< zvPErtA}U?viX`44iKO(Q0OYVs@^ivM#RdYg)yzfzpj)=FJr;Sex_{Im`yWvBiE4XV z|L7?sS?e-2bU8Sx=Bh~kIqK2sy@~z1xUlvO1sN+>7iKyJme}@A;lS~`dZ;Q4%KI++ zL_e)An<{gXO2Xy?VUh2yM zmXr&ut(c6B45>v_mkRu8`6K7e4znoE+x)d@;f6$h*Ro9Im!I}DQ0r?yxz7l_I*=b; zy2?>5pY=^Kq+-_R90FEN&h3@7W-5h{$1~;{$@Va)%wJUuDLQ72azuv{AWv!r-uTFr z<$84&eoT>O1c98(Si4{=5?(fz;|8~mlMFZ_ypB)axiw6@7E9M*?)4Cg5}s9I^uqoq;Q-bNk~u2 KO#MDZTK_i>+R|SD literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/panel_medium.png.import b/themes/space-pixel/package/assets/ui/panel_medium.png.import new file mode 100644 index 0000000..b6b8de8 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/panel_medium.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp2gv8jrxb1is" +path="res://.godot/imported/panel_medium.png-fdc5afc39b829fc567243d4fe7eac33b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/panel_medium.png" +dest_files=["res://.godot/imported/panel_medium.png-fdc5afc39b829fc567243d4fe7eac33b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/panel_wide.png b/themes/space-pixel/package/assets/ui/panel_wide.png new file mode 100644 index 0000000000000000000000000000000000000000..a815c0a0e38afdfffac67f9200a668cd0bdc3e05 GIT binary patch literal 2310 zcmeAS@N?(olHy`uVBq!ia0y~yU;#22893O0l&&g^3XtL~@Q5sCVBi)8VMc~ob0ioT zICgltIEGZrd3)C|BQ#y2;bHMnNAc-?dQHLFB?YTOxO7u;)5Dj0EpG~5n4;yResJZB zE2hP}*mOj^=gM&1@+^3HMb-OmUZ+W}$K(p#XY-2R|F-cyz;b^6$Ljax|IR%7{1a#| z!;Js^*?E8epNrPqf9-cm`^WEF zs?5m1aNv;Mn;1*;J*?C1_8P1yW%#kb`Tx6Pmw#U3V+MMc``mKzvUO+LL<`DJHUIZ? z{(r6ez5iFIfL*1PxVvDy58*?-ZDA?@?enl0fBebWE>rT*~#0jgQ!BoJZ3 zQuF8SQ^l=}1(zP=zhGxzNO;9}ZryLgg!+B9dMr9s|L;bzG#uXl=HSEo5BP!3(Yp1k zdY-KW)3PG>11e?=-`eY&?SV$U7Go+?7h*i8^SiP7y@kx5FZbX61KCi`abxa*H@m+u ze0bD;SNZ?l<^MsVi`RCZ+3n5Gz#jP*XybyU@+Z0tfgt}dYhVS(Z^G6u3<*Dg&S`L9s3>^;Z<9PH zP_*(LSS2tA00Gk-FvW;$22=*w0S?GohP*_>=EE#C-+oU|mIry>@9eju)rW87fV}7c zN&t30p6uP&58~$EecXP&ZRG|?7!ApMI9$q;k>rm9niYRO+?>G2(ErYE=G)r4JO6*) zB+m;>kBe{3Z@q6{|MqImoZAdH{=DsmB-7+IS?_-}uymNf&G36YD5W3Rbz8FXZ@rK- zL;Foonoqcz>;J_6zpomDOsV7pIgl+4p<636mff9SdHi0>{IkzL8_u_n*_ z9~a|q7LbdV8GZ1t{1D&Cupxs7$ZgnYGwZ{J{gW6UY={UqGc(HVo8c&N!($HoF5;YjgD}9cy>;?;_~DE3MpqS z%N;KNyUxu}=gy$ugB!is@awQeT&!G!z3Kev8$a#kWH`hEM$^tS*qy!n)>`}F+q(E$ zhcB9$%{w_0w>fyMAVw91O2%&FG Xr?rH9&o{r#1O=$4tDnm{r-UW|p15Ni literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/stock_low.png.import b/themes/space-pixel/package/assets/ui/stock_low.png.import new file mode 100644 index 0000000..93a589d --- /dev/null +++ b/themes/space-pixel/package/assets/ui/stock_low.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7wodqqe8yuij" +path="res://.godot/imported/stock_low.png-253692d85d64f0ca766c4ad0e836fd16.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/stock_low.png" +dest_files=["res://.godot/imported/stock_low.png-253692d85d64f0ca766c4ad0e836fd16.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/stock_many.png b/themes/space-pixel/package/assets/ui/stock_many.png new file mode 100644 index 0000000000000000000000000000000000000000..83449b520313454c0abe7278a979608d3375bd26 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K595~p3dJ8OHwpj#Cl_@>YDO=$HdnE_bj=KfAMg8Uo$+$ zWFni!&u~VWK|l>R+V<9VgIvBG|AF~Z>tFABUMzA=bFfU ziOdZKj5I+Ta=*RrY^=nGZ6`yx20~|GdVuWz+3#8>9%%~BEloIpMhb8KRYXxV7LLHu=t z=?tJ#CNMBGC@?ZGI09YP1kzK<`r-JUKkR+aTo3#=VnmY!86d>KAfUp)px}W`H=Pw^ zoU!b;W0nR5fXasM+fS|f?3nKxV{`QJ&QaF;u@Z-pe{fB`* c2m5|6!?L-Csge6QEI|?F>FVdQ&MBb@0E0MYm;e9( literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/sum_bar.png.import b/themes/space-pixel/package/assets/ui/sum_bar.png.import new file mode 100644 index 0000000..b38de82 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/sum_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbnw5b84pre6y" +path="res://.godot/imported/sum_bar.png-75cf739076199e2a0d0d8b6e3a1dab10.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/sum_bar.png" +dest_files=["res://.godot/imported/sum_bar.png-75cf739076199e2a0d0d8b6e3a1dab10.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/tumbler_off.png b/themes/space-pixel/package/assets/ui/tumbler_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6bfec8a4045efbaf90490373a42681bfe57f80 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zwWo_?NX4ADbJqqPF%W5uPBZ1|bv3kM$l`69d+;Mig$`5efk%}rGKZB6R#z~j@kW@i z#U;%2Q};1bxqI*SmfKI}oHx1rr*!h<;@f%4b;DPODklE>thm~NEp=OUfY+(_U&=L9 zSTz_5P6co*xSHI;X2oD3!eEiD*s!f%oKJ18^zME7$IktEmUO#)!hGf>1|RiA4%M>< za4H-5kIA1Vf4PpZHEpv5rf)63tsuXo5Z+44xdV0aLKfjU?}{QRNhmHmqU zqI@7%!v8l<@)cHZ*}H$ysm+(!cAs1J>(ZxL|2%l#votN{Vtl8y^|Iloxz75>tJ!}pge85< z{UzNktt!sM*MDv=b4=nT!%uhD`mXsmEua6co1U->f9p5Xhk5&Uzg@gP_4~%tP3Ov) ze(wmpZ05FoXQj$XXO)=(0=wzHVKsue<(b zze`cWj3cuan7zHgsASo&cYpT2-9=m9np!eQZe-@+lwHuq-_l^bNC>%$7hZlj(LjFT{`$K{%hoO{YkR{l+Qv{&AoH4Askz zyYfBxWX&di;QHt6iOf6y^hp@7G#nOS;FD#T)A{#Sz&>3W=C7-h#J5k6ypjIZ+Jo1b z!9w`#tC?z5np2yrkGg$5$f4YHWx?0)A5PAAc{SFs%;KZ2y+q<+?WR2s(jRw-b1}?G q;NUoT!65I)#|)(=CXEe0S#7RA{2yk?wGx;%89ZJ6T-G@yGywoAGB;2F literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/tumbler_off.png.import b/themes/space-pixel/package/assets/ui/tumbler_off.png.import new file mode 100644 index 0000000..1c6d33b --- /dev/null +++ b/themes/space-pixel/package/assets/ui/tumbler_off.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dioycex1x3g62" +path="res://.godot/imported/tumbler_off.png-9474b30016336019c7b6f5c626006ed3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/tumbler_off.png" +dest_files=["res://.godot/imported/tumbler_off.png-9474b30016336019c7b6f5c626006ed3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/ui/tumbler_on.png b/themes/space-pixel/package/assets/ui/tumbler_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c915073a7c74af53e83a0afa5c597dc80ae67bed GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zy{C&~NX4ADb8UkT8;G>bpLr!yQC0Nij;87z%%Oe^yy^=$)jf{NI?dPK!5!+g;D|WK zV@5-#X*sWdsuz~+KPL71`lYP-j~(W``Ci@m(6qjLwFBGJw5q8`rr5vE*GS@OG|01d@JN}F!3U36*IFXu1I8<_+q zekuBBKGF4-U3|cko0-kA%h%QARQlFS{ZKJ@KG~tdYDaZSFBFeSNagE%VDhL}Kd-YYKPdKe>D`0j_n)-)8H(Ls zV!u}UV0**uoOg2{Fin1^bl>(?$<_P6s-$cGeyA6o@ome4ynWSg7TfcFP)u0CZt9y{ zGP&K|u(H&EC8eF4G4}g%PDT+2GyS>TcX`?_`Mx?n?fRGHf(*_Le|#3)3|)AX`|ZAE zUz1N~|GMnJe&Q701=U<}jb*Y{4U?|i4E*+U+s}9Bu5Jr|%8XziD{c1p` z@G!DSa52chQ3d0fbMIMxT0LO>@b9P6iR+B|3?&a(4U#z&PWZfu?|ZhsH929uZyHD28U^w_pdeZ3&A5OSlS_n*^44$rjF6*2UngCyDIw=4E literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/ui/tumbler_on.png.import b/themes/space-pixel/package/assets/ui/tumbler_on.png.import new file mode 100644 index 0000000..c2fd4c3 --- /dev/null +++ b/themes/space-pixel/package/assets/ui/tumbler_on.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://od3ytfnm6es0" +path="res://.godot/imported/tumbler_on.png-ab60be199e26ddc4861dd29e39a32727.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/ui/tumbler_on.png" +dest_files=["res://.godot/imported/tumbler_on.png-ab60be199e26ddc4861dd29e39a32727.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/background_decoration.tscn b/themes/space-pixel/package/background_decoration.tscn new file mode 100644 index 0000000..e7ee36b --- /dev/null +++ b/themes/space-pixel/package/background_decoration.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=11 format=3] + +[ext_resource type="Texture2D" path="assets/decorations/stars_1.png" id="1_stars_1"] +[ext_resource type="Texture2D" path="assets/decorations/stars_2.png" id="2_stars_2"] +[ext_resource type="Texture2D" path="assets/animations/ufo_small/frame_01.png" id="3_ufo_small"] +[ext_resource type="Texture2D" path="assets/animations/ufo_large/frame_01.png" id="4_ufo_large"] +[ext_resource type="Texture2D" path="assets/animations/ufo_small/frame_02.png" id="5_ufo_small_2"] +[ext_resource type="Texture2D" path="assets/animations/ufo_large/frame_02.png" id="6_ufo_large_2"] +[ext_resource type="Script" path="scripts/ufo_flight_controller.gd" id="7_flight_controller"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_stars"] +animations = [{ +"frames": [{"duration": 1.0, "texture": ExtResource("1_stars_1")}, {"duration": 1.0, "texture": ExtResource("2_stars_2")}], +"loop": true, +"name": &"twinkle", +"speed": 1.0 +}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_ufo_large"] +animations = [{ +"frames": [{"duration": 1.0, "texture": ExtResource("4_ufo_large")}, {"duration": 1.0, "texture": ExtResource("6_ufo_large_2")}], +"loop": true, +"name": &"flight", +"speed": 1.0 +}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_ufo_small"] +animations = [{ +"frames": [{"duration": 1.0, "texture": ExtResource("3_ufo_small")}, {"duration": 1.0, "texture": ExtResource("5_ufo_small_2")}], +"loop": true, +"name": &"flight", +"speed": 1.5 +}] + +[node name="SpacePixelDecoration" type="Node2D"] +script = ExtResource("7_flight_controller") + +[node name="Stars" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +modulate = Color(1, 1, 1, 0.72) +position = Vector2(540, 960) +sprite_frames = SubResource("SpriteFrames_stars") +animation = &"twinkle" +autoplay = "twinkle" + +[node name="UfoLarge" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(-380, 1350) +sprite_frames = SubResource("SpriteFrames_ufo_large") +animation = &"flight" +autoplay = "flight" + +[node name="UfoSmall" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(-160, 1550) +sprite_frames = SubResource("SpriteFrames_ufo_small") +animation = &"flight" +autoplay = "flight" diff --git a/themes/space-pixel/package/components/footer.tscn b/themes/space-pixel/package/components/footer.tscn new file mode 100644 index 0000000..360f913 --- /dev/null +++ b/themes/space-pixel/package/components/footer.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=3 format=3] + +[ext_resource type="Texture2D" path="../assets/ui/logo.png" id="1_logo"] +[ext_resource type="Script" path="../scripts/home_reference_label.gd" id="2_reference_label"] + +[node name="PreviewFooter" type="Control"] +layout_mode = 3 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -152.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 2 + +[node name="Logo" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 0 +offset_left = -18.0 +offset_top = 24.0 +offset_right = 323.0 +offset_bottom = 109.0 +mouse_filter = 2 +texture = ExtResource("1_logo") +expand_mode = 1 +stretch_mode = 5 + +[node name="Brand" type="Label" parent="."] +visible = false +layout_mode = 0 +offset_right = 1.0 +offset_bottom = 1.0 +theme_type_variation = &"SupportText" +text = "РАЗМЕН\nЖЕТОНОВ" + +[node name="Support" type="Label" parent="."] +layout_mode = 0 +offset_left = 341.0 +offset_top = 19.0 +offset_right = 677.0 +offset_bottom = 105.0 +theme_type_variation = &"SupportText" +theme_override_constants/line_spacing = 10 +theme_override_font_sizes/font_size = 24 +text = "ТЕХ ПОДДЕРЖКА:\n+7-XXX-XXX-XX-XX" +vertical_alignment = 1 +mouse_filter = 2 +pivot_offset = Vector2(0, 43) +scale = Vector2(1.35, 1) +script = ExtResource("2_reference_label") +format_mode = "support" diff --git a/themes/space-pixel/package/components/interactive_pet.tscn b/themes/space-pixel/package/components/interactive_pet.tscn new file mode 100644 index 0000000..432b7c2 --- /dev/null +++ b/themes/space-pixel/package/components/interactive_pet.tscn @@ -0,0 +1,3485 @@ +[gd_scene format=3 uid="uid://coexu8odbbour"] + +[ext_resource type="Script" uid="uid://k2f6x5chdh01" path="res://themes/space-pixel/package/scripts/interactive_pet.gd" id="1_pet_script"] +[ext_resource type="Texture2D" uid="uid://bpyxt5fswdyqg" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_down.png" id="2_climbing_down"] +[ext_resource type="Texture2D" uid="uid://cm7gpna4ns3be" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_start.png" id="3_climbing_start"] +[ext_resource type="Texture2D" uid="uid://cnbee5ael5tsg" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_up.png" id="4_climbing_up"] +[ext_resource type="Texture2D" uid="uid://dokquou3nkitt" path="res://themes/space-pixel/package/assets/animations/alien_pet/dancing.png" id="5_dancing"] +[ext_resource type="Texture2D" uid="uid://bfs0gdewfedmh" path="res://themes/space-pixel/package/assets/animations/alien_pet/falling.png" id="6_floating"] +[ext_resource type="Texture2D" uid="uid://7d45p4xo6waq" path="res://themes/space-pixel/package/assets/animations/alien_pet/hanging.png" id="7_hanging"] +[ext_resource type="Texture2D" uid="uid://p2k1nr7u0n8l" path="res://themes/space-pixel/package/assets/animations/alien_pet/sitting.png" id="8_sitting"] +[ext_resource type="Texture2D" uid="uid://cavh0687pqu4o" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_left_stop.png" id="9_walking_left_stop"] +[ext_resource type="Texture2D" uid="uid://c41lc5pb7bl64" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_right_stop.png" id="10_walking_right_stop"] +[ext_resource type="Texture2D" uid="uid://rxjilm82m058" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_left.png" id="11_walking_left"] +[ext_resource type="Texture2D" uid="uid://dj5bhh36bcenk" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_right.png" id="12_walking_right"] +[ext_resource type="Texture2D" uid="uid://dp6txiyte76en" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_left_start.png" id="13_walking_left_start"] +[ext_resource type="Texture2D" uid="uid://dx04s533dp3m3" path="res://themes/space-pixel/package/assets/animations/alien_pet/walking_start_right.png" id="14_walking_start_right"] +[ext_resource type="Texture2D" uid="uid://bsmel1k8ohsub" path="res://themes/space-pixel/package/assets/animations/alien_pet/come_closer.png" id="15_come_closer"] +[ext_resource type="Texture2D" uid="uid://bog3bxikpv4vv" path="res://themes/space-pixel/package/assets/animations/alien_pet/idle.png" id="16_idle"] +[ext_resource type="Texture2D" uid="uid://cfx08kqh1l2dk" path="res://themes/space-pixel/package/assets/animations/alien_pet/landing.png" id="17_landing"] +[ext_resource type="Texture2D" uid="uid://cge3gefu8fxqs" path="res://themes/space-pixel/package/assets/animations/alien_pet/turn_left.png" id="18_turn_left"] +[ext_resource type="Texture2D" uid="uid://kvdyxfre1n8c" path="res://themes/space-pixel/package/assets/animations/alien_pet/turn_right.png" id="19_turn_right"] +[ext_resource type="Texture2D" uid="uid://evysfqsy6g8w" path="res://themes/space-pixel/package/assets/animations/alien_pet/action.png" id="20_action"] +[ext_resource type="Texture2D" uid="uid://d337pf8yibt1l" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_action_start.png" id="21_climbing_action_start"] +[ext_resource type="Texture2D" uid="uid://c6rcpc0l736sq" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_action_stop.png" id="22_climbing_action_stop"] +[ext_resource type="Texture2D" uid="uid://kanikcd4bu5v" path="res://themes/space-pixel/package/assets/animations/alien_pet/climbing_action.png" id="23_climbing_action"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_p1714"] +atlas = ExtResource("20_action") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8c6ti"] +atlas = ExtResource("20_action") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tniwl"] +atlas = ExtResource("20_action") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6yq1d"] +atlas = ExtResource("20_action") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5ecvf"] +atlas = ExtResource("20_action") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7oebb"] +atlas = ExtResource("20_action") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f6nk0"] +atlas = ExtResource("20_action") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5kqdc"] +atlas = ExtResource("20_action") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cy34w"] +atlas = ExtResource("20_action") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_uw8w4"] +atlas = ExtResource("20_action") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_0jeb0"] +atlas = ExtResource("20_action") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vrvgl"] +atlas = ExtResource("23_climbing_action") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qfw80"] +atlas = ExtResource("23_climbing_action") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8ayha"] +atlas = ExtResource("23_climbing_action") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_dlx3p"] +atlas = ExtResource("23_climbing_action") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ehvel"] +atlas = ExtResource("23_climbing_action") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_001ov"] +atlas = ExtResource("23_climbing_action") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_s8q76"] +atlas = ExtResource("23_climbing_action") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_a5udf"] +atlas = ExtResource("23_climbing_action") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bw5x5"] +atlas = ExtResource("23_climbing_action") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qyxep"] +atlas = ExtResource("23_climbing_action") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xkdno"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_kfm5u"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1a3qf"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_w7kiu"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qggv0"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mwp8a"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jvwdv"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6fthk"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v21ty"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_x52ca"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_whajc"] +atlas = ExtResource("21_climbing_action_start") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oviss"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_aoqd0"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f786a"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mil3v"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_o1tmv"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_14y8m"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oy35m"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5ntlk"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6ftmd"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5ptsy"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4o0kk"] +atlas = ExtResource("22_climbing_action_stop") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_18ift"] +atlas = ExtResource("2_climbing_down") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_33wbu"] +atlas = ExtResource("2_climbing_down") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qi250"] +atlas = ExtResource("2_climbing_down") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6tcir"] +atlas = ExtResource("2_climbing_down") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_kub5e"] +atlas = ExtResource("2_climbing_down") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mqvp5"] +atlas = ExtResource("2_climbing_down") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_sa2fm"] +atlas = ExtResource("2_climbing_down") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rrh6t"] +atlas = ExtResource("2_climbing_down") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_olvb2"] +atlas = ExtResource("2_climbing_down") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ykoa0"] +atlas = ExtResource("2_climbing_down") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pb5wh"] +atlas = ExtResource("2_climbing_down") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rf71h"] +atlas = ExtResource("2_climbing_down") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3s374"] +atlas = ExtResource("2_climbing_down") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_byluo"] +atlas = ExtResource("2_climbing_down") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_yakrs"] +atlas = ExtResource("2_climbing_down") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8o4sm"] +atlas = ExtResource("2_climbing_down") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vc2fe"] +atlas = ExtResource("3_climbing_start") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_28rgb"] +atlas = ExtResource("3_climbing_start") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6hd38"] +atlas = ExtResource("3_climbing_start") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_x0os1"] +atlas = ExtResource("3_climbing_start") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lvcc8"] +atlas = ExtResource("3_climbing_start") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nckjj"] +atlas = ExtResource("3_climbing_start") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ujele"] +atlas = ExtResource("3_climbing_start") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_466jh"] +atlas = ExtResource("3_climbing_start") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oyoy4"] +atlas = ExtResource("3_climbing_start") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qsh7i"] +atlas = ExtResource("3_climbing_start") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3n7x0"] +atlas = ExtResource("3_climbing_start") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oe4uu"] +atlas = ExtResource("3_climbing_start") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_18noe"] +atlas = ExtResource("3_climbing_start") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_d7lsy"] +atlas = ExtResource("3_climbing_start") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gt28j"] +atlas = ExtResource("3_climbing_start") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p8bvr"] +atlas = ExtResource("3_climbing_start") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_i52qu"] +atlas = ExtResource("3_climbing_start") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ovyu0"] +atlas = ExtResource("3_climbing_start") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_27udb"] +atlas = ExtResource("3_climbing_start") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hiyls"] +atlas = ExtResource("4_climbing_up") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_un2so"] +atlas = ExtResource("4_climbing_up") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_22wwf"] +atlas = ExtResource("4_climbing_up") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p7j38"] +atlas = ExtResource("4_climbing_up") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ie5ux"] +atlas = ExtResource("4_climbing_up") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hd3lm"] +atlas = ExtResource("4_climbing_up") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_y4kbk"] +atlas = ExtResource("4_climbing_up") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_soxka"] +atlas = ExtResource("4_climbing_up") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7p6ng"] +atlas = ExtResource("4_climbing_up") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5nnyo"] +atlas = ExtResource("4_climbing_up") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_02vj1"] +atlas = ExtResource("4_climbing_up") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_naj0j"] +atlas = ExtResource("4_climbing_up") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_te1xw"] +atlas = ExtResource("4_climbing_up") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_a50f7"] +atlas = ExtResource("4_climbing_up") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rlp38"] +atlas = ExtResource("4_climbing_up") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4lpf7"] +atlas = ExtResource("4_climbing_up") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_0o1st"] +atlas = ExtResource("15_come_closer") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qdk1a"] +atlas = ExtResource("15_come_closer") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hx5pd"] +atlas = ExtResource("15_come_closer") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ehxu0"] +atlas = ExtResource("15_come_closer") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_c3yjf"] +atlas = ExtResource("15_come_closer") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_inikp"] +atlas = ExtResource("15_come_closer") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_e51pw"] +atlas = ExtResource("15_come_closer") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_kpa4g"] +atlas = ExtResource("15_come_closer") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v8l2m"] +atlas = ExtResource("15_come_closer") +region = Rect2(1024, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tnnld"] +atlas = ExtResource("15_come_closer") +region = Rect2(1152, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jl5ov"] +atlas = ExtResource("15_come_closer") +region = Rect2(1280, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ubsyx"] +atlas = ExtResource("15_come_closer") +region = Rect2(1408, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f6bcv"] +atlas = ExtResource("15_come_closer") +region = Rect2(1536, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tnllf"] +atlas = ExtResource("15_come_closer") +region = Rect2(1664, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5yrpk"] +atlas = ExtResource("15_come_closer") +region = Rect2(1792, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7fugc"] +atlas = ExtResource("15_come_closer") +region = Rect2(1920, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p7ss2"] +atlas = ExtResource("15_come_closer") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8wcq3"] +atlas = ExtResource("15_come_closer") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_j1wry"] +atlas = ExtResource("15_come_closer") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5w2ha"] +atlas = ExtResource("15_come_closer") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v1w5o"] +atlas = ExtResource("15_come_closer") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1lqm2"] +atlas = ExtResource("15_come_closer") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_umq30"] +atlas = ExtResource("15_come_closer") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2s456"] +atlas = ExtResource("15_come_closer") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ktafw"] +atlas = ExtResource("15_come_closer") +region = Rect2(1024, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_763bp"] +atlas = ExtResource("15_come_closer") +region = Rect2(1152, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_g52vn"] +atlas = ExtResource("15_come_closer") +region = Rect2(1280, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_b1dj3"] +atlas = ExtResource("15_come_closer") +region = Rect2(1408, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_thfkn"] +atlas = ExtResource("15_come_closer") +region = Rect2(1536, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ky0pi"] +atlas = ExtResource("15_come_closer") +region = Rect2(1664, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xrwqd"] +atlas = ExtResource("15_come_closer") +region = Rect2(1792, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_woq8o"] +atlas = ExtResource("15_come_closer") +region = Rect2(1920, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4h4ig"] +atlas = ExtResource("15_come_closer") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_u8rur"] +atlas = ExtResource("15_come_closer") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rn3if"] +atlas = ExtResource("15_come_closer") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_60ehj"] +atlas = ExtResource("15_come_closer") +region = Rect2(384, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ns2qv"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_swv85"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bjivs"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fpn50"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7l7kh"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_glkt7"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4fpdy"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oardh"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pwc7q"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_h7hki"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_0iqe6"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6286g"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6sdg4"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_0p85c"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_c66jl"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_a3eqw"] +atlas = ExtResource("5_dancing") +region = Rect2(1920, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wyrwo"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7eett"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rf7u6"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_u4b1f"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_x8lri"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3u3mj"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8qj56"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4fc3q"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_n1q13"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oaqsy"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qy0eh"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_e6o2g"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lrmk1"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_r7cpx"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cxn1k"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_s75oe"] +atlas = ExtResource("5_dancing") +region = Rect2(1920, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_b5mik"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m86pd"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_25acx"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4utlm"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_j1bsy"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tmgc5"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_b8xqb"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2fm21"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_po2pu"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xwcwy"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_j0o54"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7jsyk"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_17ms8"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p4gxb"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xyqv4"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_l8u0n"] +atlas = ExtResource("5_dancing") +region = Rect2(1920, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_l6vva"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fa5h5"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4lu5k"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_t6fhg"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_y0d05"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ebbdg"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_c70pw"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_r6ljm"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nwct2"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vuqb5"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pneku"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rqbwa"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jk530"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vxhif"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_usv3h"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_k6yk0"] +atlas = ExtResource("5_dancing") +region = Rect2(1920, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_262k3"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_on21h"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1g4it"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v5kkw"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_n0p8r"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2ukdk"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_iplt6"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_avbn2"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_04biu"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lnh25"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8tjbq"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_skw87"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fknqf"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ecke3"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_28226"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gjtls"] +atlas = ExtResource("5_dancing") +region = Rect2(1920, 512, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_akjwq"] +atlas = ExtResource("5_dancing") +region = Rect2(0, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_333qr"] +atlas = ExtResource("5_dancing") +region = Rect2(128, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nojie"] +atlas = ExtResource("5_dancing") +region = Rect2(256, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bi0ch"] +atlas = ExtResource("5_dancing") +region = Rect2(384, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_eyi1n"] +atlas = ExtResource("5_dancing") +region = Rect2(512, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_llipu"] +atlas = ExtResource("5_dancing") +region = Rect2(640, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m2exb"] +atlas = ExtResource("5_dancing") +region = Rect2(768, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wuyje"] +atlas = ExtResource("5_dancing") +region = Rect2(896, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cepc8"] +atlas = ExtResource("5_dancing") +region = Rect2(1024, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p6ste"] +atlas = ExtResource("5_dancing") +region = Rect2(1152, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8r0nc"] +atlas = ExtResource("5_dancing") +region = Rect2(1280, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pknhn"] +atlas = ExtResource("5_dancing") +region = Rect2(1408, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3d7vy"] +atlas = ExtResource("5_dancing") +region = Rect2(1536, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bx4f8"] +atlas = ExtResource("5_dancing") +region = Rect2(1664, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ki123"] +atlas = ExtResource("5_dancing") +region = Rect2(1792, 640, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3krfi"] +atlas = ExtResource("6_floating") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_uen7d"] +atlas = ExtResource("6_floating") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gecc2"] +atlas = ExtResource("6_floating") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8jtcy"] +atlas = ExtResource("6_floating") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_855mo"] +atlas = ExtResource("6_floating") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pko00"] +atlas = ExtResource("6_floating") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7105n"] +atlas = ExtResource("6_floating") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_d5d30"] +atlas = ExtResource("6_floating") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_042jw"] +atlas = ExtResource("6_floating") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_20uf8"] +atlas = ExtResource("6_floating") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hsx1o"] +atlas = ExtResource("6_floating") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_duejx"] +atlas = ExtResource("6_floating") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ockil"] +atlas = ExtResource("6_floating") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_45e2l"] +atlas = ExtResource("6_floating") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jg8l4"] +atlas = ExtResource("6_floating") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1g6a7"] +atlas = ExtResource("6_floating") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fb0hx"] +atlas = ExtResource("6_floating") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m8kgo"] +atlas = ExtResource("6_floating") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ib48p"] +atlas = ExtResource("6_floating") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2ajdj"] +atlas = ExtResource("6_floating") +region = Rect2(384, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qj42n"] +atlas = ExtResource("6_floating") +region = Rect2(512, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ws2jq"] +atlas = ExtResource("6_floating") +region = Rect2(640, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gj2w1"] +atlas = ExtResource("6_floating") +region = Rect2(768, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_h1d6d"] +atlas = ExtResource("6_floating") +region = Rect2(896, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p7v4m"] +atlas = ExtResource("6_floating") +region = Rect2(0, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_u2m8g"] +atlas = ExtResource("6_floating") +region = Rect2(128, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_y7yed"] +atlas = ExtResource("6_floating") +region = Rect2(256, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_co712"] +atlas = ExtResource("6_floating") +region = Rect2(384, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1ecmv"] +atlas = ExtResource("6_floating") +region = Rect2(512, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_voohc"] +atlas = ExtResource("6_floating") +region = Rect2(640, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_o7uc4"] +atlas = ExtResource("7_hanging") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_84vms"] +atlas = ExtResource("7_hanging") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vmdhf"] +atlas = ExtResource("7_hanging") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_c28ku"] +atlas = ExtResource("7_hanging") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_srjwt"] +atlas = ExtResource("7_hanging") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_b6vew"] +atlas = ExtResource("7_hanging") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nafm8"] +atlas = ExtResource("7_hanging") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_63s0s"] +atlas = ExtResource("7_hanging") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gcggp"] +atlas = ExtResource("7_hanging") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bxhwq"] +atlas = ExtResource("7_hanging") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cwngy"] +atlas = ExtResource("7_hanging") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lldte"] +atlas = ExtResource("7_hanging") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tv88g"] +atlas = ExtResource("7_hanging") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_aapo5"] +atlas = ExtResource("7_hanging") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wnmq1"] +atlas = ExtResource("7_hanging") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jsfm6"] +atlas = ExtResource("7_hanging") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2ymtc"] +atlas = ExtResource("7_hanging") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xq0vy"] +atlas = ExtResource("7_hanging") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v0nwu"] +atlas = ExtResource("7_hanging") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mwioe"] +atlas = ExtResource("7_hanging") +region = Rect2(384, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6phgx"] +atlas = ExtResource("7_hanging") +region = Rect2(512, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m1oul"] +atlas = ExtResource("7_hanging") +region = Rect2(640, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4g55x"] +atlas = ExtResource("7_hanging") +region = Rect2(768, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xad33"] +atlas = ExtResource("16_idle") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6fy5m"] +atlas = ExtResource("16_idle") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8xvdq"] +atlas = ExtResource("16_idle") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1y4fx"] +atlas = ExtResource("16_idle") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wwjx6"] +atlas = ExtResource("16_idle") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_og64f"] +atlas = ExtResource("16_idle") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_86y48"] +atlas = ExtResource("16_idle") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_dfscs"] +atlas = ExtResource("16_idle") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1ywcw"] +atlas = ExtResource("16_idle") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f5u3j"] +atlas = ExtResource("16_idle") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_4ywtq"] +atlas = ExtResource("16_idle") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_htj7m"] +atlas = ExtResource("16_idle") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_moxrq"] +atlas = ExtResource("16_idle") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nt6jq"] +atlas = ExtResource("16_idle") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1ag4u"] +atlas = ExtResource("16_idle") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ul6bl"] +atlas = ExtResource("16_idle") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_e3k0j"] +atlas = ExtResource("16_idle") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_aioe3"] +atlas = ExtResource("16_idle") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1yddp"] +atlas = ExtResource("16_idle") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2i2r6"] +atlas = ExtResource("17_landing") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nnyxq"] +atlas = ExtResource("17_landing") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m8bci"] +atlas = ExtResource("17_landing") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jcnuq"] +atlas = ExtResource("17_landing") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6std6"] +atlas = ExtResource("17_landing") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_40rep"] +atlas = ExtResource("17_landing") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5cnie"] +atlas = ExtResource("17_landing") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rkcs3"] +atlas = ExtResource("17_landing") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hn42w"] +atlas = ExtResource("17_landing") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xexfq"] +atlas = ExtResource("17_landing") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_sdeiv"] +atlas = ExtResource("17_landing") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_kwi4v"] +atlas = ExtResource("8_sitting") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gjqrp"] +atlas = ExtResource("8_sitting") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_kyccr"] +atlas = ExtResource("8_sitting") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ea0le"] +atlas = ExtResource("8_sitting") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_88j6p"] +atlas = ExtResource("8_sitting") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f7sxy"] +atlas = ExtResource("8_sitting") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ctqcc"] +atlas = ExtResource("8_sitting") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3flrw"] +atlas = ExtResource("8_sitting") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_w3a3j"] +atlas = ExtResource("8_sitting") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_uwjv3"] +atlas = ExtResource("8_sitting") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mdlp0"] +atlas = ExtResource("8_sitting") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ig2oa"] +atlas = ExtResource("8_sitting") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5tp2c"] +atlas = ExtResource("8_sitting") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tx62n"] +atlas = ExtResource("8_sitting") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7gj5l"] +atlas = ExtResource("8_sitting") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_s0wbm"] +atlas = ExtResource("8_sitting") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_dcxye"] +atlas = ExtResource("8_sitting") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wlc13"] +atlas = ExtResource("8_sitting") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jw2qi"] +atlas = ExtResource("8_sitting") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5hj7k"] +atlas = ExtResource("8_sitting") +region = Rect2(384, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_m5fe5"] +atlas = ExtResource("8_sitting") +region = Rect2(512, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fq4oa"] +atlas = ExtResource("8_sitting") +region = Rect2(640, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_306se"] +atlas = ExtResource("8_sitting") +region = Rect2(768, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7us7t"] +atlas = ExtResource("8_sitting") +region = Rect2(896, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wetbv"] +atlas = ExtResource("8_sitting") +region = Rect2(0, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cgsks"] +atlas = ExtResource("8_sitting") +region = Rect2(128, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5ekgr"] +atlas = ExtResource("8_sitting") +region = Rect2(256, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_yjnot"] +atlas = ExtResource("8_sitting") +region = Rect2(384, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ronbm"] +atlas = ExtResource("8_sitting") +region = Rect2(512, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_6a0oe"] +atlas = ExtResource("8_sitting") +region = Rect2(640, 384, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xghdm"] +atlas = ExtResource("18_turn_left") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_or51f"] +atlas = ExtResource("18_turn_left") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_1nvyc"] +atlas = ExtResource("18_turn_left") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5rhas"] +atlas = ExtResource("18_turn_left") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ine4j"] +atlas = ExtResource("18_turn_left") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3a302"] +atlas = ExtResource("18_turn_left") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bvsvp"] +atlas = ExtResource("18_turn_left") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_jug24"] +atlas = ExtResource("18_turn_left") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_216y7"] +atlas = ExtResource("18_turn_left") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vtsh3"] +atlas = ExtResource("18_turn_left") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_64bfp"] +atlas = ExtResource("19_turn_right") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_3bvqx"] +atlas = ExtResource("19_turn_right") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_osh2x"] +atlas = ExtResource("19_turn_right") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_csbmi"] +atlas = ExtResource("19_turn_right") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_akhul"] +atlas = ExtResource("19_turn_right") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7wqe0"] +atlas = ExtResource("19_turn_right") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ek3uu"] +atlas = ExtResource("19_turn_right") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rek4b"] +atlas = ExtResource("19_turn_right") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_aq50j"] +atlas = ExtResource("19_turn_right") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_o1ies"] +atlas = ExtResource("19_turn_right") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_k0g41"] +atlas = ExtResource("11_walking_left") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_r31cj"] +atlas = ExtResource("11_walking_left") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2kaan"] +atlas = ExtResource("11_walking_left") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5avkc"] +atlas = ExtResource("11_walking_left") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_wllvd"] +atlas = ExtResource("11_walking_left") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_tqep8"] +atlas = ExtResource("11_walking_left") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_dg2ou"] +atlas = ExtResource("11_walking_left") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_f05ab"] +atlas = ExtResource("11_walking_left") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_uwmem"] +atlas = ExtResource("11_walking_left") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lrbxu"] +atlas = ExtResource("11_walking_left") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nd34c"] +atlas = ExtResource("11_walking_left") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_vamp1"] +atlas = ExtResource("11_walking_left") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_e6n1f"] +atlas = ExtResource("11_walking_left") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_dtipg"] +atlas = ExtResource("11_walking_left") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7bj0h"] +atlas = ExtResource("11_walking_left") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_7176c"] +atlas = ExtResource("11_walking_left") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_e0vd5"] +atlas = ExtResource("11_walking_left") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_pvcky"] +atlas = ExtResource("11_walking_left") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lyf8l"] +atlas = ExtResource("11_walking_left") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_y32pd"] +atlas = ExtResource("13_walking_left_start") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hucjn"] +atlas = ExtResource("13_walking_left_start") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xvjk6"] +atlas = ExtResource("13_walking_left_start") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_bwxhd"] +atlas = ExtResource("13_walking_left_start") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_k16y0"] +atlas = ExtResource("13_walking_left_start") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_b1xwo"] +atlas = ExtResource("9_walking_left_stop") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_esgdu"] +atlas = ExtResource("9_walking_left_stop") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_txknb"] +atlas = ExtResource("9_walking_left_stop") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fhhix"] +atlas = ExtResource("9_walking_left_stop") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_w6u4e"] +atlas = ExtResource("12_walking_right") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_sonbe"] +atlas = ExtResource("12_walking_right") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_lblpb"] +atlas = ExtResource("12_walking_right") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_67ehv"] +atlas = ExtResource("12_walking_right") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qvvbc"] +atlas = ExtResource("12_walking_right") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_xs7a8"] +atlas = ExtResource("12_walking_right") +region = Rect2(640, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_yxefm"] +atlas = ExtResource("12_walking_right") +region = Rect2(768, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_nx458"] +atlas = ExtResource("12_walking_right") +region = Rect2(896, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_8uslj"] +atlas = ExtResource("12_walking_right") +region = Rect2(0, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_2vis6"] +atlas = ExtResource("12_walking_right") +region = Rect2(128, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_hhhxs"] +atlas = ExtResource("12_walking_right") +region = Rect2(256, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_fkwr5"] +atlas = ExtResource("12_walking_right") +region = Rect2(384, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_x4uvy"] +atlas = ExtResource("12_walking_right") +region = Rect2(512, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_5dgh0"] +atlas = ExtResource("12_walking_right") +region = Rect2(640, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_md7h6"] +atlas = ExtResource("12_walking_right") +region = Rect2(768, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_d3hvn"] +atlas = ExtResource("12_walking_right") +region = Rect2(896, 128, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_831f1"] +atlas = ExtResource("12_walking_right") +region = Rect2(0, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_cm1ae"] +atlas = ExtResource("12_walking_right") +region = Rect2(128, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_v0246"] +atlas = ExtResource("12_walking_right") +region = Rect2(256, 256, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_p66ib"] +atlas = ExtResource("10_walking_right_stop") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_mxf2g"] +atlas = ExtResource("10_walking_right_stop") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_sm1lg"] +atlas = ExtResource("10_walking_right_stop") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_rfw88"] +atlas = ExtResource("10_walking_right_stop") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_oeeat"] +atlas = ExtResource("14_walking_start_right") +region = Rect2(0, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_gjbtp"] +atlas = ExtResource("14_walking_start_right") +region = Rect2(128, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_qlii4"] +atlas = ExtResource("14_walking_start_right") +region = Rect2(256, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_c1x2e"] +atlas = ExtResource("14_walking_start_right") +region = Rect2(384, 0, 128, 128) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_i8h7t"] +atlas = ExtResource("14_walking_start_right") +region = Rect2(512, 0, 128, 128) +filter_clip = true + +[sub_resource type="SpriteFrames" id="SpriteFrames_nfixd"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_p1714") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8c6ti") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tniwl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6yq1d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5ecvf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7oebb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f6nk0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5kqdc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cy34w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uw8w4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0jeb0") +}], +"loop": 1, +"name": &"action", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_vrvgl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qfw80") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8ayha") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dlx3p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ehvel") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_001ov") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s8q76") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a5udf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bw5x5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qyxep") +}], +"loop": 1, +"name": &"climbing_action", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xkdno") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kfm5u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1a3qf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_w7kiu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qggv0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mwp8a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jvwdv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6fthk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v21ty") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x52ca") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_whajc") +}], +"loop": 0, +"name": &"climbing_action_start", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_oviss") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aoqd0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f786a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mil3v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o1tmv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_14y8m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oy35m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5ntlk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6ftmd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5ptsy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4o0kk") +}], +"loop": 0, +"name": &"climbing_action_stop", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_18ift") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_33wbu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qi250") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6tcir") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kub5e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mqvp5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sa2fm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rrh6t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_olvb2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ykoa0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pb5wh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rf71h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3s374") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_byluo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yakrs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8o4sm") +}], +"loop": 1, +"name": &"climbing_down", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_vc2fe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_28rgb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6hd38") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x0os1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lvcc8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nckjj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ujele") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_466jh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oyoy4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qsh7i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3n7x0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oe4uu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_18noe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d7lsy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gt28j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p8bvr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i52qu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ovyu0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_27udb") +}], +"loop": 0, +"name": &"climbing_start", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_hiyls") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_un2so") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_22wwf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p7j38") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ie5ux") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hd3lm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y4kbk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_soxka") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7p6ng") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5nnyo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_02vj1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_naj0j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_te1xw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a50f7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rlp38") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4lpf7") +}], +"loop": 1, +"name": &"climbing_up", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_0o1st") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qdk1a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hx5pd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ehxu0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c3yjf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_inikp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e51pw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kpa4g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v8l2m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tnnld") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jl5ov") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ubsyx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f6bcv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tnllf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5yrpk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7fugc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p7ss2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8wcq3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j1wry") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5w2ha") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v1w5o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1lqm2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_umq30") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2s456") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ktafw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_763bp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g52vn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b1dj3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_thfkn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ky0pi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xrwqd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_woq8o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4h4ig") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u8rur") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rn3if") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_60ehj") +}], +"loop": 0, +"name": &"come_closer", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ns2qv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_swv85") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bjivs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fpn50") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7l7kh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_glkt7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4fpdy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oardh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pwc7q") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h7hki") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0iqe6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6286g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6sdg4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0p85c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c66jl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a3eqw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wyrwo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7eett") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rf7u6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u4b1f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x8lri") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3u3mj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8qj56") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4fc3q") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n1q13") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oaqsy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qy0eh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e6o2g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lrmk1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r7cpx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cxn1k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s75oe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b5mik") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m86pd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_25acx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4utlm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j1bsy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tmgc5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b8xqb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2fm21") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_po2pu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xwcwy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j0o54") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7jsyk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_17ms8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p4gxb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xyqv4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l8u0n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l6vva") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fa5h5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4lu5k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t6fhg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y0d05") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ebbdg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c70pw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r6ljm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nwct2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vuqb5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pneku") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rqbwa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jk530") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vxhif") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_usv3h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k6yk0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_262k3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_on21h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1g4it") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v5kkw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n0p8r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2ukdk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_iplt6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_avbn2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_04biu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lnh25") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8tjbq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_skw87") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fknqf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ecke3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_28226") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gjtls") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_akjwq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_333qr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nojie") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bi0ch") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eyi1n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_llipu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m2exb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wuyje") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cepc8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p6ste") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8r0nc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pknhn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3d7vy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bx4f8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ki123") +}], +"loop": 1, +"name": &"dancing", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_3krfi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uen7d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gecc2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8jtcy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_855mo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pko00") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7105n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d5d30") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_042jw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_20uf8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hsx1o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_duejx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ockil") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_45e2l") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jg8l4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1g6a7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fb0hx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m8kgo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ib48p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2ajdj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qj42n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ws2jq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gj2w1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h1d6d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p7v4m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u2m8g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y7yed") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_co712") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1ecmv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_voohc") +}], +"loop": 1, +"name": &"falling", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_o7uc4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_84vms") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vmdhf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c28ku") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_srjwt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b6vew") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nafm8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_63s0s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gcggp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bxhwq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cwngy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lldte") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tv88g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aapo5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wnmq1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jsfm6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2ymtc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xq0vy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v0nwu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mwioe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6phgx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m1oul") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4g55x") +}], +"loop": 1, +"name": &"hanging", +"speed": 12.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xad33") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6fy5m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8xvdq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1y4fx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wwjx6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_og64f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_86y48") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dfscs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1ywcw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f5u3j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4ywtq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_htj7m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_moxrq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nt6jq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1ag4u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ul6bl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e3k0j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aioe3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1yddp") +}], +"loop": 1, +"name": &"idle", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2i2r6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nnyxq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m8bci") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jcnuq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6std6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_40rep") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5cnie") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rkcs3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hn42w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xexfq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sdeiv") +}], +"loop": 0, +"name": &"landing", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_kwi4v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gjqrp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kyccr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ea0le") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_88j6p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f7sxy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ctqcc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3flrw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_w3a3j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uwjv3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mdlp0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ig2oa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5tp2c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tx62n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7gj5l") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s0wbm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dcxye") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wlc13") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jw2qi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5hj7k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m5fe5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fq4oa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_306se") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7us7t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wetbv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cgsks") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5ekgr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yjnot") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ronbm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6a0oe") +}], +"loop": 1, +"name": &"sitting", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xghdm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_or51f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1nvyc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5rhas") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ine4j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3a302") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bvsvp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jug24") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_216y7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vtsh3") +}], +"loop": 0, +"name": &"turn_left", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_64bfp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3bvqx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_osh2x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_csbmi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_akhul") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7wqe0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ek3uu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rek4b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aq50j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o1ies") +}], +"loop": 0, +"name": &"turn_right", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_k0g41") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r31cj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2kaan") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5avkc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wllvd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tqep8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dg2ou") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f05ab") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uwmem") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lrbxu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nd34c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vamp1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e6n1f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dtipg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7bj0h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7176c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e0vd5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pvcky") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lyf8l") +}], +"loop": 1, +"name": &"walking_left", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_y32pd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hucjn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xvjk6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bwxhd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k16y0") +}], +"loop": 0, +"name": &"walking_left_start", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_b1xwo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_esgdu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_txknb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fhhix") +}], +"loop": 0, +"name": &"walking_left_stop", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_w6u4e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sonbe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lblpb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_67ehv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qvvbc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xs7a8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yxefm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nx458") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8uslj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2vis6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hhhxs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fkwr5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x4uvy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5dgh0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_md7h6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d3hvn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_831f1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cm1ae") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v0246") +}], +"loop": 1, +"name": &"walking_right", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_p66ib") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mxf2g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sm1lg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rfw88") +}], +"loop": 0, +"name": &"walking_right_stop", +"speed": 24.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_oeeat") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gjbtp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qlii4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c1x2e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i8h7t") +}], +"loop": 0, +"name": &"walking_start_right", +"speed": 24.0 +}] + +[node name="InteractivePet" type="Node2D" unique_id=1955588965] +script = ExtResource("1_pet_script") +climbing_down_texture = ExtResource("2_climbing_down") +climbing_start_texture = ExtResource("3_climbing_start") +climbing_up_texture = ExtResource("4_climbing_up") +dancing_texture = ExtResource("5_dancing") +come_closer_texture = ExtResource("15_come_closer") +falling_texture = ExtResource("6_floating") +hanging_texture = ExtResource("7_hanging") +sitting_texture = ExtResource("8_sitting") +idle_texture = ExtResource("16_idle") +landing_texture = ExtResource("17_landing") +turn_left_texture = ExtResource("18_turn_left") +turn_right_texture = ExtResource("19_turn_right") +walking_left_stop_texture = ExtResource("9_walking_left_stop") +walking_right_stop_texture = ExtResource("10_walking_right_stop") +walking_left_texture = ExtResource("11_walking_left") +walking_right_texture = ExtResource("12_walking_right") +walking_left_start_texture = ExtResource("13_walking_left_start") +walking_start_right_texture = ExtResource("14_walking_start_right") +action_texture = ExtResource("20_action") +climbing_action_start_texture = ExtResource("21_climbing_action_start") +climbing_action_stop_texture = ExtResource("22_climbing_action_stop") +climbing_action_texture = ExtResource("23_climbing_action") + +[node name="VisualRoot" type="Node2D" parent="." unique_id=181212115] +position = Vector2(64, 96) + +[node name="Sprite" type="AnimatedSprite2D" parent="VisualRoot" unique_id=999923383] +texture_filter = 1 +position = Vector2(0, -56) +sprite_frames = SubResource("SpriteFrames_nfixd") +animation = &"action" +frame_progress = 0.5807543 diff --git a/themes/space-pixel/package/components/on_screen_keyboards.tscn b/themes/space-pixel/package/components/on_screen_keyboards.tscn new file mode 100644 index 0000000..cb63dce --- /dev/null +++ b/themes/space-pixel/package/components/on_screen_keyboards.tscn @@ -0,0 +1,595 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Texture2D" path="../assets/ui/button_down.png" id="1_hide_icon"] + +[node name="KeyboardOverlay" type="Control"] +z_index = 30 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="TextKeyboard" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard" +visible = false +layout_mode = 1 +anchors_preset = 12 +anchor_right = 1.0 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -512.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="TextKeyboard"] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Header" type="HBoxContainer" parent="TextKeyboard/Content"] +custom_minimum_size = Vector2(0, 58) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Title" type="Label" parent="TextKeyboard/Content/Header"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 20 +text = "ЭКРАННАЯ КЛАВИАТУРА" +vertical_alignment = 1 + +[node name="HideButton" type="Button" parent="TextKeyboard/Content/Header"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.header.hide_button" +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +focus_mode = 0 +tooltip_text = "Скрыть клавиатуру" +icon = ExtResource("1_hide_icon") +flat = true + +[node name="LetterRows" type="VBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Row0" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key00" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_00" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "й" +theme_type_variation = &"KeypadButton" + +[node name="Key01" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_01" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ц" +theme_type_variation = &"KeypadButton" + +[node name="Key02" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_02" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "у" +theme_type_variation = &"KeypadButton" + +[node name="Key03" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_03" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "к" +theme_type_variation = &"KeypadButton" + +[node name="Key04" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_04" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "е" +theme_type_variation = &"KeypadButton" + +[node name="Key05" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_05" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "н" +theme_type_variation = &"KeypadButton" + +[node name="Key06" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_06" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "г" +theme_type_variation = &"KeypadButton" + +[node name="Key07" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_07" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ш" +theme_type_variation = &"KeypadButton" + +[node name="Key08" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_08" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "щ" +theme_type_variation = &"KeypadButton" + +[node name="Key09" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_09" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "з" +theme_type_variation = &"KeypadButton" + +[node name="Key10" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_10" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "х" +theme_type_variation = &"KeypadButton" + +[node name="Key11" type="Button" parent="TextKeyboard/Content/LetterRows/Row0"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_11" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ъ" +theme_type_variation = &"KeypadButton" + +[node name="Row1" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key12" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_12" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ф" +theme_type_variation = &"KeypadButton" + +[node name="Key13" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_13" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ы" +theme_type_variation = &"KeypadButton" + +[node name="Key14" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_14" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "в" +theme_type_variation = &"KeypadButton" + +[node name="Key15" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_15" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "а" +theme_type_variation = &"KeypadButton" + +[node name="Key16" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_16" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "п" +theme_type_variation = &"KeypadButton" + +[node name="Key17" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_17" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "р" +theme_type_variation = &"KeypadButton" + +[node name="Key18" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_18" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "о" +theme_type_variation = &"KeypadButton" + +[node name="Key19" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_19" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "л" +theme_type_variation = &"KeypadButton" + +[node name="Key20" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_20" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "д" +theme_type_variation = &"KeypadButton" + +[node name="Key21" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_21" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ж" +theme_type_variation = &"KeypadButton" + +[node name="Key22" type="Button" parent="TextKeyboard/Content/LetterRows/Row1"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_22" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "э" +theme_type_variation = &"KeypadButton" + +[node name="Row2" type="HBoxContainer" parent="TextKeyboard/Content/LetterRows"] +layout_mode = 2 +theme_override_constants/separation = 6 + +[node name="Key23" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_23" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "я" +theme_type_variation = &"KeypadButton" + +[node name="Key24" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_24" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ч" +theme_type_variation = &"KeypadButton" + +[node name="Key25" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_25" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "с" +theme_type_variation = &"KeypadButton" + +[node name="Key26" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_26" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "м" +theme_type_variation = &"KeypadButton" + +[node name="Key27" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_27" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "и" +theme_type_variation = &"KeypadButton" + +[node name="Key28" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_28" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "т" +theme_type_variation = &"KeypadButton" + +[node name="Key29" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_29" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ь" +theme_type_variation = &"KeypadButton" + +[node name="Key30" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_30" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "б" +theme_type_variation = &"KeypadButton" + +[node name="Key31" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_31" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ю" +theme_type_variation = &"KeypadButton" + +[node name="Key32" type="Button" parent="TextKeyboard/Content/LetterRows/Row2"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_32" +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ё" +theme_type_variation = &"KeypadButton" + +[node name="PrimaryActions" type="HBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="ShiftButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button" +custom_minimum_size = Vector2(128, 76) +layout_mode = 2 +focus_mode = 0 +text = "SHIFT" +theme_type_variation = &"KeyboardActionButton" + +[node name="LanguageButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button" +custom_minimum_size = Vector2(96, 76) +layout_mode = 2 +focus_mode = 0 +text = "RU" +theme_type_variation = &"KeyboardActionButton" + +[node name="SymbolsButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button" +custom_minimum_size = Vector2(116, 76) +layout_mode = 2 +focus_mode = 0 +text = "?123" +theme_type_variation = &"KeyboardActionButton" + +[node name="BackspaceButton" type="Button" parent="TextKeyboard/Content/PrimaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button" +custom_minimum_size = Vector2(236, 76) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "СТЕРЕТЬ" +theme_type_variation = &"KeyboardActionButton" + +[node name="SecondaryActions" type="HBoxContainer" parent="TextKeyboard/Content"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="ClearButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button" +custom_minimum_size = Vector2(164, 76) +layout_mode = 2 +focus_mode = 0 +text = "ОЧИСТИТЬ" +theme_type_variation = &"KeyboardActionButton" + +[node name="CaretLeftButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button" +custom_minimum_size = Vector2(88, 76) +layout_mode = 2 +focus_mode = 0 +text = "<" +theme_type_variation = &"KeyboardActionButton" + +[node name="SpaceButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button" +custom_minimum_size = Vector2(220, 76) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ПРОБЕЛ" +theme_type_variation = &"KeyboardActionButton" + +[node name="CaretRightButton" type="Button" parent="TextKeyboard/Content/SecondaryActions"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button" +custom_minimum_size = Vector2(88, 76) +layout_mode = 2 +focus_mode = 0 +text = ">" +theme_type_variation = &"KeyboardActionButton" + +[node name="NumericKeyboard" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard" +visible = false +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -280.0 +offset_top = -520.0 +offset_right = 280.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 0 +theme_type_variation = &"WhitePanel" + +[node name="Content" type="VBoxContainer" parent="NumericKeyboard"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="Header" type="HBoxContainer" parent="NumericKeyboard/Content"] +custom_minimum_size = Vector2(0, 64) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Title" type="Label" parent="NumericKeyboard/Content/Header"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 20 +text = "ЦИФРОВАЯ КЛАВИАТУРА" +vertical_alignment = 1 + +[node name="HideButton" type="Button" parent="NumericKeyboard/Content/Header"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button" +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +focus_mode = 0 +tooltip_text = "Скрыть клавиатуру" +icon = ExtResource("1_hide_icon") +flat = true + +[node name="Grid" type="GridContainer" parent="NumericKeyboard/Content"] +layout_mode = 2 +theme_override_constants/h_separation = 10 +theme_override_constants/v_separation = 10 +columns = 3 + +[node name="Digit1" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit1" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "1" +theme_type_variation = &"KeypadButton" + +[node name="Digit2" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit2" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "2" +theme_type_variation = &"KeypadButton" + +[node name="Digit3" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit3" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "3" +theme_type_variation = &"KeypadButton" + +[node name="Digit4" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit4" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "4" +theme_type_variation = &"KeypadButton" + +[node name="Digit5" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit5" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "5" +theme_type_variation = &"KeypadButton" + +[node name="Digit6" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit6" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "6" +theme_type_variation = &"KeypadButton" + +[node name="Digit7" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit7" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "7" +theme_type_variation = &"KeypadButton" + +[node name="Digit8" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit8" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "8" +theme_type_variation = &"KeypadButton" + +[node name="Digit9" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit9" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "9" +theme_type_variation = &"KeypadButton" + +[node name="ClearButton" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "ОЧИСТИТЬ" +theme_type_variation = &"KeypadButton" + +[node name="Digit0" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.digit0" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "0" +theme_type_variation = &"KeypadButton" + +[node name="BackspaceButton" type="Button" parent="NumericKeyboard/Content/Grid"] +metadata/exchanger_binding_id = "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button" +custom_minimum_size = Vector2(0, 96) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 0 +text = "СТЕРЕТЬ" +theme_type_variation = &"KeypadButton" diff --git a/themes/space-pixel/package/contracts/screen_bindings.v2.json b/themes/space-pixel/package/contracts/screen_bindings.v2.json new file mode 100644 index 0000000..657e795 --- /dev/null +++ b/themes/space-pixel/package/contracts/screen_bindings.v2.json @@ -0,0 +1,3929 @@ +{ + "Format": "ExchangerThemeBindingContract", + "Version": 2, + "ScreenMetadataKey": "exchanger_screen_binding_id", + "ElementMetadataKey": "exchanger_binding_id", + "Source": "Immutable Exchanger ThemeView contract: host binds existing theme-owned nodes only", + "Screens": [ + { + "BindingId": "screen.home", + "Key": "home", + "RootName": "ThemeScreen_Home", + "Path": "res://exchanger_theme_dlc/scenes/screen_home.tscn", + "Bindings": [ + { + "Id": "home.scroll.content.footer.margin.content.brand", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Brand" + }, + { + "Id": "home.scroll.content.speech_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SpeechText" + }, + { + "Id": "home.scroll.content.price_panel.margin.content.price", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.cash_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CashButton" + }, + { + "Id": "home.scroll.content.payment_panel.margin.content.buttons.card_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CardButton" + }, + { + "Id": "home.scroll.content.footer.margin.content.support", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/Support" + }, + { + "Id": "home.scroll.content.stock_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus" + }, + { + "Id": "home.scroll.content.stock_status.state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/StockStatus/Margin/Content/State" + }, + { + "Id": "home.scroll.content.footer.margin.content.connection_status.label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin/Label" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.poster", + "Types": [ + "TextureRect" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/Poster" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.video_player", + "Types": [ + "VideoStreamPlayer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/VideoPlayer" + }, + { + "Id": "home.scroll.content.advertisement_panel.layer.content.fallback_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/FallbackLabel" + } + ] + }, + { + "BindingId": "screen.cash_payment", + "Key": "cash_payment", + "RootName": "ThemeScreen_CashPayment", + "Path": "res://exchanger_theme_dlc/scenes/screen_cash_payment.tscn", + "Bindings": [ + { + "Id": "cash_payment.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "cash_payment.content.summary.margin.values.balance", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Balance" + }, + { + "Id": "cash_payment.content.summary.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Tokens" + }, + { + "Id": "cash_payment.content.summary.margin.values.bonus", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Summary/Margin/Values/Bonus" + }, + { + "Id": "cash_payment.content.dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DispenseButton" + }, + { + "Id": "cash_payment.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "cash_payment.content.debug_panel.add10_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add10Button" + }, + { + "Id": "cash_payment.content.debug_panel.add50_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add50Button" + }, + { + "Id": "cash_payment.content.debug_panel.add100_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/Add100Button" + } + ] + }, + { + "BindingId": "screen.card_amount", + "Key": "card_amount", + "RootName": "ThemeScreen_CardAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_amount.tscn", + "Bindings": [ + { + "Id": "card_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot13" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot12" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot11" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot10" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot09" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot08" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot07" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot06" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot05" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot04" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot03" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot02" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot01" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot00" + }, + { + "Id": "card_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_amount.content.reward_panel.content.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/RewardPanel/Content/Value" + }, + { + "Id": "card_amount.content.selection_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/SelectionLabel" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.other_amount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/OtherAmountButton" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid", + "Types": [ + "GridContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot14" + }, + { + "Id": "card_amount.content.amount_panel.margin.content.preset_grid.slot_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot15" + } + ] + }, + { + "BindingId": "screen.card_custom_amount", + "Key": "card_custom_amount", + "RootName": "ThemeScreen_CardCustomAmount", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_custom_amount.tscn", + "Bindings": [ + { + "Id": "card_custom_amount.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit7" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit6" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit5" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit4" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit3" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit2" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit1" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit0" + }, + { + "Id": "card_custom_amount.content.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ConfirmButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/BackspaceButton" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/ClearButton" + }, + { + "Id": "card_custom_amount.content.hint", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Hint" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.input_value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/InputValue" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Tokens" + }, + { + "Id": "card_custom_amount.content.amount_panel.margin.values.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AmountPanel/Margin/Values/Amount" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit8" + }, + { + "Id": "card_custom_amount.content.keypad_panel.content.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.card_terminal", + "Key": "card_terminal", + "RootName": "ThemeScreen_CardTerminal", + "Path": "res://exchanger_theme_dlc/scenes/screen_card_terminal.tscn", + "Bindings": [ + { + "Id": "card_terminal.content.top_bar.back_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/TopBar/BackButton" + }, + { + "Id": "card_terminal.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "card_terminal.content.amount", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Amount" + }, + { + "Id": "card_terminal.content.tokens", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Tokens" + }, + { + "Id": "card_terminal.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "card_terminal.content.debug_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel" + }, + { + "Id": "card_terminal.content.debug_panel.approve_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ApproveButton" + }, + { + "Id": "card_terminal.content.debug_panel.decline_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DeclineButton" + }, + { + "Id": "card_terminal.content.debug_panel.dispense_failure_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/DispenseFailureButton" + }, + { + "Id": "card_terminal.content.debug_panel.partial_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/PartialDispenseButton" + }, + { + "Id": "card_terminal.content.debug_panel.connection_loss_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/DebugPanel/ConnectionLossButton" + } + ] + }, + { + "BindingId": "screen.success", + "Key": "success", + "RootName": "ThemeScreen_Success", + "Path": "res://exchanger_theme_dlc/scenes/screen_success.tscn", + "Bindings": [ + { + "Id": "success.content.result_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Title" + }, + { + "Id": "success.content.result_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ResultPanel/Margin/Values/Body/Message" + }, + { + "Id": "success.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "success.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.error", + "Key": "error", + "RootName": "ThemeScreen_Error", + "Path": "res://exchanger_theme_dlc/scenes/screen_error.tscn", + "Bindings": [ + { + "Id": "error.content.error_panel.margin.values.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Title" + }, + { + "Id": "error.content.error_panel.margin.values.body.message", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/ErrorPanel/Margin/Values/Body/Message" + }, + { + "Id": "error.content.countdown", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Countdown" + }, + { + "Id": "error.content.home_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/HomeButton" + } + ] + }, + { + "BindingId": "screen.service_access", + "Key": "service_access", + "RootName": "ThemeScreen_ServiceAccess", + "Path": "res://exchanger_theme_dlc/scenes/screen_service_access.tscn", + "Bindings": [ + { + "Id": "service_access.content.header", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Header" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit7" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit6" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit5" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit4" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit3" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit2" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit1" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit8" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit0" + }, + { + "Id": "service_access.content.access_panel.fields.enter_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/EnterButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.erase", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Erase" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.clear", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Clear" + }, + { + "Id": "service_access.content.access_panel.fields.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Status" + }, + { + "Id": "service_access.content.access_panel.fields.pin_display", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinDisplay" + }, + { + "Id": "service_access.content.access_panel.fields.pin_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/PinLabel" + }, + { + "Id": "service_access.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/Description" + }, + { + "Id": "service_access.content.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/CancelButton" + }, + { + "Id": "service_access.content.access_panel.fields.keypad.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit9" + } + ] + }, + { + "BindingId": "screen.settings", + "Key": "settings", + "RootName": "ThemeScreen_Settings", + "Path": "res://exchanger_theme_dlc/scenes/screen_settings.tscn", + "Bindings": [ + { + "Id": "settings.scroll.content.section_tabs.general_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/GeneralButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Threshold" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/EmptyState" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Bonus" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row/Path" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Error" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row/Amount" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row/Amount" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/RemoveButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.bonus", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Bonus" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.preset_rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/LimitsError" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.custom_step", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/CustomStep" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.limits.max_amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits/MaxAmount" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.card_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CardEnabled" + }, + { + "Id": "settings.scroll.content.payment_methods_panel.margin.content.cash_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content/CashEnabled" + }, + { + "Id": "settings.scroll.content.preview_panel.margin.content.values", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel/Margin/Content/Values" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.add_rule_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/AddRuleButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel.margin.content.price", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel/Margin/Content/Price" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.test_panel.margin.content.test_sound_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel/Margin/Content/TestSoundButton" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.advertisement_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.mute", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/Mute" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.value", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Value" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.add_preset_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/AddPresetButton" + }, + { + "Id": "settings.scroll.content.card_options_panel.margin.content.presets_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetsError" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.idle", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Idle" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cash_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashPayment" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.poster_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/PosterPath" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackError" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/FallbackText" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.muted", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Muted" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.reset_pin_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/ResetPinButton" + }, + { + "Id": "settings.scroll.content.security_panel.margin.content.enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel/Margin/Content/Enabled" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.support_phone", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.master_panel.margin.content.volume_row.slider", + "Types": [ + "HSlider" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow/Slider" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.short_text", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhoneError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortTextError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationNameError" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.support_phone", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/SupportPhone" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.short_text", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ShortText" + }, + { + "Id": "settings.scroll.content.branding_panel.margin.content.application_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.success", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/Success" + }, + { + "Id": "settings.scroll.content.timeouts_panel.margin.content.grid.cashless_payment", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid/CashlessPayment" + }, + { + "Id": "settings.scroll.content.branding_preview_panel.margin.content.application_name", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content/ApplicationName" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/ConfirmButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/CancelButton" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.amount", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Amount" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel" + }, + { + "Id": "settings.scroll.content.advertisement_settings_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementSettingsPanel" + }, + { + "Id": "settings.scroll.content.test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TestPanel" + }, + { + "Id": "settings.scroll.content.advertisement_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPanel" + }, + { + "Id": "settings.scroll.content.master_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/MasterPanel" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel" + }, + { + "Id": "settings.scroll.content.security_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SecurityPanel" + }, + { + "Id": "settings.scroll.content.branding_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPanel" + }, + { + "Id": "settings.scroll.content.section_tabs.diagnostics_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/DiagnosticsButton" + }, + { + "Id": "settings.scroll.content.section_tabs.equipment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/EquipmentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.service_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/ServiceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.payment_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PaymentButton" + }, + { + "Id": "settings.scroll.content.section_tabs.pricing_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/PricingButton" + }, + { + "Id": "settings.scroll.content.section_tabs.appearance_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AppearanceButton" + }, + { + "Id": "settings.scroll.content.section_tabs.advertisement_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AdvertisementButton" + }, + { + "Id": "settings.scroll.content.section_tabs.audio_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs/AudioButton" + }, + { + "Id": "settings.scroll.content.branding_preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BrandingPreviewPanel" + }, + { + "Id": "settings.scroll.content.advertisement_poster_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content/Error" + }, + { + "Id": "settings.scroll.content.price_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PricePanel" + }, + { + "Id": "settings.scroll.content.preview_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PreviewPanel" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.description", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Description" + }, + { + "Id": "settings.service_dialog_overlay.dialog.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Title" + }, + { + "Id": "settings.service_dialog_overlay", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/ServiceDialogOverlay" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Status" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2/RecountButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/ManualAddButton" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1/RecountButton" + }, + { + "Id": "settings.scroll.content.bonus_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1Label" + }, + { + "Id": "settings.scroll.content.service_inventory_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel" + }, + { + "Id": "settings.scroll.content.equipment_window_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel" + }, + { + "Id": "settings.scroll.content.timeouts_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/TimeoutsPanel" + }, + { + "Id": "settings.scroll.content.card_options_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/CardOptionsPanel" + }, + { + "Id": "settings.scroll.content.payment_methods_panel", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/PaymentMethodsPanel" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.count", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Count" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows", + "Types": [ + "VBoxContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/AddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Error" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_32", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_32" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_31", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_31" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_30", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_30" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_29", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_29" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_28", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_28" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_27", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_27" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_26", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_26" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_25", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_25" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/LanguageButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_24", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_24" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_22", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_22" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_21", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_21" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_20", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_20" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_19", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_19" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_18", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_18" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_17", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_17" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_16", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_16" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_15", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_15" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_14", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_14" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row2.key_23", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row2/Key_23" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_13", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_13" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/ShiftButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/BackspaceButton" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.threshold", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row/Threshold" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.slot_00", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00" + }, + { + "Id": "settings.scroll.content.bonus_panel.margin.content.rows.empty_state", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/EmptyState" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/BackspaceButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Header/HideButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit9", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit9" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit8", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit8" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit7", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit7" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/SymbolsButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit6", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit6" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit4", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit4" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit3", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit3" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit2", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit2" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit1", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit1" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit0", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit0" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/SpaceButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/ClearButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretRightButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretLeftButton" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard.content.grid.digit5", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit5" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.remove_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row/RemoveButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row1.key_12", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row1/Key_12" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_10", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_10" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.minimum_level", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MinimumLevel" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.recent_errors", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RecentErrors" + }, + { + "Id": "settings.scroll.content.diagnostics_status_panel.margin.content.runtime_summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content/RuntimeSummary" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.target_fps", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/TargetFps" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.debug_window", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/DebugWindow" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.borderless", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Borderless" + }, + { + "Id": "settings.scroll.content.equipment_window_panel.margin.content.fullscreen", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content/Fullscreen" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.connection_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ConnectionError" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.reconnect_seconds", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/ReconnectSeconds" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.max_file_size", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/MaxFileSize" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.baud_rate", + "Types": [ + "OptionButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/BaudRate" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_name", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortName" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.use_mock", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/UseMock" + }, + { + "Id": "settings.scroll.content.appearance_notice_panel.margin.content.current_theme", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content/CurrentTheme" + }, + { + "Id": "settings.scroll.content.appearance_effects_panel.margin.content.reduced_effects", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content/ReducedEffects" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.package_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PackageStatus" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.path_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/PathError" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_path", + "Types": [ + "LineEdit" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalPath" + }, + { + "Id": "settings.scroll.content.appearance_theme_panel.margin.content.external_enabled", + "Types": [ + "CheckButton" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content/ExternalEnabled" + }, + { + "Id": "settings.scroll.content.advertisement_preview_panel.margin.content.summary", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content/Summary" + }, + { + "Id": "settings.scroll.content.equipment_connection_panel.margin.content.port_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content/PortError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_11", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_11" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.retention_days", + "Types": [ + "SpinBox" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/RetentionDays" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseButton" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_09", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_09" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_08", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_08" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_07", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_07" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_06", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_06" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_05", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_05" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_04", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_04" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_03", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_03" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_02", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_02" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_01", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_01" + }, + { + "Id": "settings.scroll.content.diagnostics_logging_panel.margin.content.logging_error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content/LoggingError" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard.content.letter_rows.row0.key_00", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row0/Key_00" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.recount_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/RecountButton" + }, + { + "Id": "settings.scroll.content", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content" + }, + { + "Id": "settings.scroll.content.section_tabs", + "Types": [ + "Node" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/SectionTabs" + }, + { + "Id": "settings.scroll.content.header.margin.content.title", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header/Margin/Content/Title" + }, + { + "Id": "settings.scroll.content.header", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/Header" + }, + { + "Id": "settings.keyboard_overlay.numeric_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/NumericKeyboard" + }, + { + "Id": "settings.keyboard_overlay.text_keyboard", + "Types": [ + "Control" + ], + "Required": true, + "FallbackPath": "SafeMargin/KeyboardOverlay/TextKeyboard" + }, + { + "Id": "settings.scroll", + "Types": [ + "ScrollContainer" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll" + }, + { + "Id": "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_status", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content/TestDispenseStatus" + }, + { + "Id": "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button", + "Types": [ + "Button" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/ManualAddButton" + }, + { + "Id": "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.error", + "Types": [ + "Label" + ], + "Required": true, + "FallbackPath": "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Error" + } + ] + } + ] +} diff --git a/themes/space-pixel/package/manifest.json b/themes/space-pixel/package/manifest.json new file mode 100644 index 0000000..45d083f --- /dev/null +++ b/themes/space-pixel/package/manifest.json @@ -0,0 +1,33 @@ +{ + "Format": "ExchangerThemeDlc", + "FormatVersion": 2, + "ThemeId": "space-pixel", + "DisplayName": "Космическая pixel-тема", + "UiThemePath": "res://exchanger_theme_dlc/ui_theme.tres", + "BackgroundTexturePath": "", + "BackgroundDecorationPath": "", + "BackgroundDecorationScale": 0.666667, + "InteractivePetScene": "res://exchanger_theme_dlc/components/interactive_pet.tscn", + "ScreenScenes": { + "screen.home": "res://exchanger_theme_dlc/scenes/screen_home.tscn", + "screen.cash_payment": "res://exchanger_theme_dlc/scenes/screen_cash_payment.tscn", + "screen.card_amount": "res://exchanger_theme_dlc/scenes/screen_card_amount.tscn", + "screen.card_custom_amount": "res://exchanger_theme_dlc/scenes/screen_card_custom_amount.tscn", + "screen.card_terminal": "res://exchanger_theme_dlc/scenes/screen_card_terminal.tscn", + "screen.success": "res://exchanger_theme_dlc/scenes/screen_success.tscn", + "screen.error": "res://exchanger_theme_dlc/scenes/screen_error.tscn", + "screen.service_access": "res://exchanger_theme_dlc/scenes/screen_service_access.tscn", + "screen.settings": "res://exchanger_theme_dlc/scenes/screen_settings.tscn" + }, + "VisualSlots": { + "home.top": "res://exchanger_theme_dlc/visuals/home_top.tscn", + "home.advertisement": "res://exchanger_theme_dlc/visuals/home_advertisement.tscn", + "cash.instructions": "res://exchanger_theme_dlc/visuals/cash_instructions.tscn", + "cash.tip": "res://exchanger_theme_dlc/visuals/cash_tip.tscn", + "card.terminal": "res://exchanger_theme_dlc/visuals/card_terminal.tscn", + "result.success": "res://exchanger_theme_dlc/visuals/result_success.tscn", + "result.error": "res://exchanger_theme_dlc/visuals/result_error.tscn" + }, + "FallbackColor": "#00183D", + "UseNearestTextureFilter": true +} diff --git a/themes/space-pixel/package/scenes/screen_card_amount.tscn b/themes/space-pixel/package/scenes/screen_card_amount.tscn new file mode 100644 index 0000000..54e9b9d --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_card_amount.tscn @@ -0,0 +1,873 @@ +[gd_scene load_steps=29 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="4_footer"] +[ext_resource type="Texture2D" path="../assets/ui/button_long.png" id="5_button_long"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_01.png" id="6_banner_1"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_02.png" id="7_banner_2"] +[ext_resource type="Texture2D" path="../assets/ui/panel_medium.png" id="8_panel_medium"] +[ext_resource type="Texture2D" path="../assets/ui/button_big.png" id="9_button_big"] +[ext_resource type="Script" path="../scripts/stable_banner_animation.gd" id="10_banner_script"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="11_home_icon"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_card_amount_banner"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("6_banner_1")}, {"duration": 1.0, "texture": ExtResource("7_banner_2")}], "loop": true, "name": &"default", "speed": 1.0}] + +[sub_resource type="StyleBoxTexture" id="StyleBox_preset_normal"] +content_margin_left = 16.0 +content_margin_top = 4.0 +content_margin_right = 16.0 +content_margin_bottom = 8.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_preset_hover"] +content_margin_left = 16.0 +content_margin_top = 4.0 +content_margin_right = 16.0 +content_margin_bottom = 8.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(1.08, 1.08, 1.08, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_preset_pressed"] +content_margin_left = 16.0 +content_margin_top = 6.0 +content_margin_right = 16.0 +content_margin_bottom = 6.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.78, 0.84, 0.8, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_preset_disabled"] +content_margin_left = 16.0 +content_margin_top = 4.0 +content_margin_right = 16.0 +content_margin_bottom = 8.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.42, 0.48, 0.54, 0.72) + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_header"] +atlas = ExtResource("8_panel_medium") +region = Rect2(4, 34, 504, 68) + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_body"] +atlas = ExtResource("8_panel_medium") +region = Rect2(5, 102, 502, 98) + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_bottom"] +atlas = ExtResource("8_panel_medium") +region = Rect2(5, 200, 502, 20) + +[sub_resource type="AtlasTexture" id="AtlasTexture_reward_panel"] +atlas = ExtResource("8_panel_medium") +region = Rect2(4, 34, 504, 186) + +[sub_resource type="StyleBoxTexture" id="StyleBox_confirm_normal"] +content_margin_left = 40.0 +content_margin_top = 11.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("9_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_confirm_hover"] +content_margin_left = 40.0 +content_margin_top = 11.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("9_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_confirm_pressed"] +content_margin_left = 40.0 +content_margin_top = 13.0 +content_margin_right = 30.0 +content_margin_bottom = 16.0 +texture = ExtResource("9_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_confirm_disabled"] +content_margin_left = 40.0 +content_margin_top = 11.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("9_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(0.42, 0.48, 0.54, 0.72) + +[sub_resource type="StyleBoxTexture" id="StyleBox_other_normal"] +content_margin_left = 17.0 +content_margin_top = 6.0 +content_margin_right = 16.0 +content_margin_bottom = 6.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_other_hover"] +content_margin_left = 17.0 +content_margin_top = 6.0 +content_margin_right = 16.0 +content_margin_bottom = 6.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(1.08, 1.08, 1.08, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_other_pressed"] +content_margin_left = 17.0 +content_margin_top = 8.0 +content_margin_right = 16.0 +content_margin_bottom = 4.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.78, 0.84, 0.8, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_other_disabled"] +content_margin_left = 17.0 +content_margin_top = 6.0 +content_margin_right = 16.0 +content_margin_bottom = 6.0 +texture = ExtResource("5_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.42, 0.48, 0.54, 0.72) + +[node name="ThemeScreen_CardAmount" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.card_amount" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="BackButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"back_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 161.0 +metadata/exchanger_pet_surface_y = 43.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(72.5, 135) + +[node name="RewardWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"reward_window" +metadata/exchanger_pet_surface_from_x = 38.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 160.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="AmountWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"amount_window" +metadata/exchanger_pet_surface_from_x = 38.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 350.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="PresetRow1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"preset_row_1" +metadata/exchanger_pet_surface_from_x = 76.0 +metadata/exchanger_pet_surface_to_x = 605.0 +metadata/exchanger_pet_surface_y = 451.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(192, 488) + +[node name="PresetRow2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"preset_row_2" +metadata/exchanger_pet_surface_from_x = 76.0 +metadata/exchanger_pet_surface_to_x = 605.0 +metadata/exchanger_pet_surface_y = 511.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(192, 488) + +[node name="PresetRow3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"preset_row_3" +metadata/exchanger_pet_surface_from_x = 76.0 +metadata/exchanger_pet_surface_to_x = 605.0 +metadata/exchanger_pet_surface_y = 571.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(192, 488) + +[node name="PresetRow4" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"preset_row_4" +metadata/exchanger_pet_surface_from_x = 76.0 +metadata/exchanger_pet_surface_to_x = 605.0 +metadata/exchanger_pet_surface_y = 631.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(192, 488) + +[node name="OtherAmountButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"other_amount_button" +metadata/exchanger_pet_surface_from_x = 224.0 +metadata/exchanger_pet_surface_to_x = 451.0 +metadata/exchanger_pet_surface_y = 704.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(337.5) + +[node name="ConfirmButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"confirm_button" +metadata/exchanger_pet_surface_from_x = 34.0 +metadata/exchanger_pet_surface_to_x = 571.5 +metadata/exchanger_pet_surface_y = 873.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(303) + +[node name="FloorToBack" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_back" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"back_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 43.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToReward" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_reward" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"reward_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 160.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToAmount" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_amount" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"amount_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 350.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToPreset1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_preset_1" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"preset_row_1" +metadata/exchanger_pet_climb_x = 76.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 451.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToPreset2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_preset_2" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"preset_row_2" +metadata/exchanger_pet_climb_x = 76.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 511.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToPreset3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_preset_3" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"preset_row_3" +metadata/exchanger_pet_climb_x = 76.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 571.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToPreset4" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_preset_4" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"preset_row_4" +metadata/exchanger_pet_climb_x = 76.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 631.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToOther" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_other" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"other_amount_button" +metadata/exchanger_pet_climb_x = 224.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 704.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToConfirm" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_confirm" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"confirm_button" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 873.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 122.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_amount.content.top_bar.back_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 43.0 +offset_right = 96.0 +offset_bottom = 90.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_amount.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 109.0 +offset_top = 42.0 +offset_right = 161.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("11_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 37.0 +offset_top = 94.0 +offset_right = 108.0 +offset_bottom = 118.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 14 +text = "НАЗАД" +horizontal_alignment = 1 +pivot_offset = Vector2(35.5, 12) +scale = Vector2(1.45, 1) + +[node name="Title" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 200.0 +offset_top = 44.0 +offset_right = 728.0 +offset_bottom = 108.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 +pivot_offset = Vector2(264, 32) +scale = Vector2(1.35, 1) + +[node name="RewardPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 36.0 +offset_top = 148.0 +offset_right = 685.0 +offset_bottom = 273.0 +theme_type_variation = &"ReferencePanel" + +[node name="Content" type="Control" parent="SafeMargin/Content/RewardPanel"] +layout_mode = 2 + +[node name="PanelTexture" type="TextureRect" parent="SafeMargin/Content/RewardPanel/Content"] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -22.0 +offset_top = -10.0 +offset_right = 22.0 +offset_bottom = 18.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_reward_panel") +expand_mode = 1 +stretch_mode = 0 + +[node name="Header" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +layout_mode = 0 +offset_left = 2.0 +offset_top = -9.0 +offset_right = 370.0 +offset_bottom = 34.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 21) +scale = Vector2(1.21, 1) + +[node name="Value" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +metadata/exchanger_binding_id = "card_amount.content.reward_panel.content.value" +layout_mode = 0 +offset_left = 2.0 +offset_top = 37.0 +offset_right = 300.0 +offset_bottom = 108.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 27 +text = "ВЫБЕРИТЕ СУММУ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 33.5) +scale = Vector2(1.25, 1) + +[node name="Bonus" type="Label" parent="SafeMargin/Content/RewardPanel/Content"] +metadata/exchanger_binding_id = "card_amount.content.reward_panel.content.bonus" +layout_mode = 0 +offset_left = 295.0 +offset_top = 35.0 +offset_right = 595.0 +offset_bottom = 110.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 25 +text = "БЕЗ БОНУСА" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(150, 35.5) +scale = Vector2(1.35, 1) + +[node name="AmountPanel" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 38.0 +offset_top = 350.0 +offset_right = 684.0 +offset_bottom = 814.0 + +[node name="Chrome" type="PanelContainer" parent="SafeMargin/Content/AmountPanel"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_type_variation = &"ReferencePanel" + +[node name="BackgroundHeader" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -3.0 +offset_right = 645.0 +offset_bottom = 46.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_header") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBody" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 46.0 +offset_right = 648.0 +offset_bottom = 456.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_body") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBottom" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 456.0 +offset_right = 648.0 +offset_bottom = 464.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_bottom") +expand_mode = 1 +stretch_mode = 0 + +[node name="BottomBorder" type="ColorRect" parent="SafeMargin/Content/AmountPanel"] +visible = false +layout_mode = 0 +offset_left = 3.0 +offset_top = 462.0 +offset_right = 640.0 +offset_bottom = 464.0 +mouse_filter = 2 +color = Color(0.52549, 0.823529, 0.478431, 1) + +[node name="WhiteBody" type="ColorRect" parent="SafeMargin/Content/AmountPanel"] +visible = false +layout_mode = 0 +offset_left = 4.0 +offset_top = 44.0 +offset_right = 642.0 +offset_bottom = 463.0 +mouse_filter = 2 +color = Color(1, 1, 1, 1) + +[node name="Divider" type="ColorRect" parent="SafeMargin/Content/AmountPanel"] +visible = false +layout_mode = 0 +offset_left = 4.0 +offset_top = 44.0 +offset_right = 642.0 +offset_bottom = 47.0 +mouse_filter = 2 +color = Color(0.82, 0.77, 0.89, 1) + +[node name="Header" type="Label" parent="SafeMargin/Content/AmountPanel"] +layout_mode = 0 +offset_left = 22.0 +offset_top = 0.0 +offset_right = 620.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +theme_override_font_sizes/font_size = 30 +text = "ОПЛАТА" +vertical_alignment = 1 +pivot_offset = Vector2(0, 22) +scale = Vector2(1.125, 1) + +[node name="Margin" type="Control" parent="SafeMargin/Content/AmountPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin/Content/AmountPanel/Margin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PresetGrid" type="GridContainer" parent="SafeMargin/Content/AmountPanel/Margin/Content"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid" +layout_mode = 0 +offset_left = 38.0 +offset_top = 101.0 +offset_right = 604.0 +offset_bottom = 325.0 +pivot_offset = Vector2(0, 112.5) +scale = Vector2(1.16, 1) +theme_override_constants/h_separation = 22 +theme_override_constants/v_separation = 15 +columns = 2 + +[node name="PresetSlot00" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_00" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "10 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot01" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_01" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "50 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot02" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_02" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "100 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot03" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_03" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "150 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot04" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_04" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "200 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot05" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_05" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "300 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot06" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_06" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "400 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot07" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_07" +custom_minimum_size = Vector2(233, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_preset_disabled") +theme_override_styles/hover = SubResource("StyleBox_preset_hover") +theme_override_styles/normal = SubResource("StyleBox_preset_normal") +theme_override_styles/pressed = SubResource("StyleBox_preset_pressed") +text = "500 РУБ." +theme_override_font_sizes/font_size = 28 + +[node name="PresetSlot08" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_08" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot09" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_09" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot10" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_10" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot11" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_11" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot12" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_12" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot13" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_13" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot14" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_14" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="PresetSlot15" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.preset_grid.slot_15" +visible = false +custom_minimum_size = Vector2(200, 45) +layout_mode = 2 +theme_type_variation = &"CompactButton" +text = "0 РУБ." + +[node name="OtherAmountButton" type="Button" parent="SafeMargin/Content/AmountPanel/Margin/Content"] +metadata/exchanger_binding_id = "card_amount.content.amount_panel.margin.content.other_amount_button" +layout_mode = 0 +offset_left = 186.0 +offset_top = 354.0 +offset_right = 409.5 +offset_bottom = 399.0 +pivot_offset = Vector2(0, 22.5) +scale = Vector2(1.208, 1) +theme_type_variation = &"CompactButton" +theme_override_styles/disabled = SubResource("StyleBox_other_disabled") +theme_override_styles/hover = SubResource("StyleBox_other_hover") +theme_override_styles/normal = SubResource("StyleBox_other_normal") +theme_override_styles/pressed = SubResource("StyleBox_other_pressed") +text = "ДРУГАЯ СУММА" +theme_override_font_sizes/font_size = 27 + +[node name="ConfirmButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_amount.content.confirm_button" +layout_mode = 0 +offset_left = 34.0 +offset_top = 873.0 +offset_right = 571.5 +offset_bottom = 949.0 +pivot_offset = Vector2(0, 38) +scale = Vector2(1.2, 1) +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 45 +theme_override_styles/disabled = SubResource("StyleBox_confirm_disabled") +theme_override_styles/hover = SubResource("StyleBox_confirm_hover") +theme_override_styles/normal = SubResource("StyleBox_confirm_normal") +theme_override_styles/pressed = SubResource("StyleBox_confirm_pressed") +text = "ПОДТВЕРДИТЬ" + +[node name="BottomTip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 1128.0 +mouse_filter = 2 + +[node name="Banner" type="AnimatedSprite2D" parent="SafeMargin/Content/BottomTip"] +texture_filter = 1 +position = Vector2(376.5, 1067.5) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_card_amount_banner") +autoplay = "default" +script = ExtResource("10_banner_script") + +[node name="SelectionLabel" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_amount.content.selection_label" +layout_mode = 0 +offset_left = 225.0 +offset_top = 1022.0 +offset_right = 660.0 +offset_bottom = 1092.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 18 +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("4_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_card_custom_amount.tscn b/themes/space-pixel/package/scenes/screen_card_custom_amount.tscn new file mode 100644 index 0000000..40c8fe0 --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_card_custom_amount.tscn @@ -0,0 +1,725 @@ +[gd_scene load_steps=20 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="2_footer"] +[ext_resource type="Texture2D" path="../assets/ui/sum_bar.png" id="5_sum_bar"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_01.png" id="6_banner_1"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_02.png" id="7_banner_2"] +[ext_resource type="Texture2D" path="../assets/ui/panel_medium.png" id="8_panel_medium"] +[ext_resource type="Texture2D" path="../assets/ui/button_square.png" id="9_button_square"] +[ext_resource type="Script" path="../scripts/stable_banner_animation.gd" id="10_banner_script"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="11_home_icon"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_card_custom_amount_banner"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("6_banner_1")}, {"duration": 1.0, "texture": ExtResource("7_banner_2")}], "loop": true, "name": &"default", "speed": 1.0}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_header"] +atlas = ExtResource("8_panel_medium") +region = Rect2(4, 34, 504, 68) + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_body"] +atlas = ExtResource("8_panel_medium") +region = Rect2(5, 102, 502, 98) + +[sub_resource type="AtlasTexture" id="AtlasTexture_panel_bottom"] +atlas = ExtResource("8_panel_medium") +region = Rect2(5, 200, 502, 20) + +[sub_resource type="StyleBoxTexture" id="StyleBox_ref_keypad_normal"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 10.0 +texture = ExtResource("9_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_ref_keypad_hover"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 10.0 +texture = ExtResource("9_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_ref_keypad_pressed"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +texture = ExtResource("9_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_ref_keypad_disabled"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 10.0 +texture = ExtResource("9_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(0.36, 0.42, 0.5, 0.7) + +[node name="ThemeScreen_CardCustomAmount" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.card_custom_amount" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="BackButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"back_button" +metadata/exchanger_pet_surface_from_x = 48.0 +metadata/exchanger_pet_surface_to_x = 161.0 +metadata/exchanger_pet_surface_y = 42.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(72, 135) + +[node name="AmountWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"amount_window" +metadata/exchanger_pet_surface_from_x = 38.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 184.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="KeypadWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_window" +metadata/exchanger_pet_surface_from_x = 38.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 378.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="KeypadRow1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_1" +metadata/exchanger_pet_surface_from_x = 277.0 +metadata/exchanger_pet_surface_to_x = 443.0 +metadata/exchanger_pet_surface_y = 568.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(300, 360, 420) + +[node name="KeypadRow2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_2" +metadata/exchanger_pet_surface_from_x = 277.0 +metadata/exchanger_pet_surface_to_x = 443.0 +metadata/exchanger_pet_surface_y = 626.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(300, 360, 420) + +[node name="KeypadRow3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_3" +metadata/exchanger_pet_surface_from_x = 277.0 +metadata/exchanger_pet_surface_to_x = 443.0 +metadata/exchanger_pet_surface_y = 685.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(300, 360, 420) + +[node name="KeypadActionRow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_action_row" +metadata/exchanger_pet_surface_from_x = 147.0 +metadata/exchanger_pet_surface_to_x = 550.0 +metadata/exchanger_pet_surface_y = 741.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(223, 360, 473) + +[node name="FloorToBack" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_back" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"back_button" +metadata/exchanger_pet_climb_x = 48.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 42.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToAmount" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_amount" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"amount_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 184.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToKeypad" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_keypad" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 378.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_1" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_1" +metadata/exchanger_pet_climb_x = 277.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 568.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_2" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_2" +metadata/exchanger_pet_climb_x = 277.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 626.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_3" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_3" +metadata/exchanger_pet_climb_x = 277.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 685.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToActions" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_actions" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_action_row" +metadata/exchanger_pet_climb_x = 147.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 741.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_custom_amount.content.top_bar.back_button" +layout_mode = 0 +offset_left = 48.0 +offset_top = 42.0 +offset_right = 96.0 +offset_bottom = 90.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_custom_amount.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 109.0 +offset_top = 42.0 +offset_right = 161.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("11_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 36.0 +offset_top = 94.0 +offset_right = 108.0 +offset_bottom = 118.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 14 +text = "НАЗАД" +horizontal_alignment = 1 +pivot_offset = Vector2(36, 12) +scale = Vector2(1.45, 1) + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 200.0 +offset_top = 44.0 +offset_right = 728.0 +offset_bottom = 108.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 +pivot_offset = Vector2(264, 32) +scale = Vector2(1.35, 1) + +[node name="AmountPanel" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 38.0 +offset_top = 184.0 +offset_right = 684.0 +offset_bottom = 359.0 + +[node name="BackgroundHeader" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -2.0 +offset_right = 646.0 +offset_bottom = 46.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_header") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBody" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 46.0 +offset_right = 648.0 +offset_bottom = 148.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_body") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBottom" type="TextureRect" parent="SafeMargin/Content/AmountPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 148.0 +offset_right = 648.0 +offset_bottom = 175.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_bottom") +expand_mode = 1 +stretch_mode = 0 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/AmountPanel"] +layout_mode = 0 +offset_left = 22.0 +offset_right = 624.0 +offset_bottom = 175.0 + +[node name="Values" type="Control" parent="SafeMargin/Content/AmountPanel/Margin"] +layout_mode = 2 + +[node name="Header" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 0 +offset_right = 602.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 22) +scale = Vector2(1.25, 1) + +[node name="Amount" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +metadata/exchanger_binding_id = "card_custom_amount.content.amount_panel.margin.values.amount" +layout_mode = 0 +offset_left = 4.0 +offset_top = 57.0 +offset_right = 294.0 +offset_bottom = 137.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 27 +text = "100 ЖЕТОНОВ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 40) +scale = Vector2(1.2, 1) + +[node name="Tokens" type="Label" parent="SafeMargin/Content/AmountPanel/Margin/Values"] +metadata/exchanger_binding_id = "card_custom_amount.content.amount_panel.margin.values.tokens" +layout_mode = 0 +offset_left = 296.0 +offset_top = 55.0 +offset_right = 602.0 +offset_bottom = 139.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 25 +text = "+ 50 ЖЕТОНОВ\nВ ПОДАРОК" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(153, 42) +scale = Vector2(1.3, 1) + +[node name="KeypadPanel" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 38.0 +offset_top = 378.0 +offset_right = 684.0 +offset_bottom = 844.0 + +[node name="BackgroundHeader" type="TextureRect" parent="SafeMargin/Content/KeypadPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -2.0 +offset_top = -1.0 +offset_right = 646.0 +offset_bottom = 45.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_header") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBody" type="TextureRect" parent="SafeMargin/Content/KeypadPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 45.0 +offset_right = 648.0 +offset_bottom = 442.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_body") +expand_mode = 1 +stretch_mode = 0 + +[node name="BackgroundBottom" type="TextureRect" parent="SafeMargin/Content/KeypadPanel"] +texture_filter = 1 +layout_mode = 0 +offset_left = -4.0 +offset_top = 442.0 +offset_right = 648.0 +offset_bottom = 466.0 +mouse_filter = 2 +texture = SubResource("AtlasTexture_panel_bottom") +expand_mode = 1 +stretch_mode = 0 + +[node name="Content" type="Control" parent="SafeMargin/Content/KeypadPanel"] +layout_mode = 0 +offset_left = 22.0 +offset_right = 624.0 +offset_bottom = 466.0 + +[node name="Header" type="Label" parent="SafeMargin/Content/KeypadPanel/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 0 +offset_right = 602.0 +offset_bottom = 44.0 +theme_type_variation = &"PanelTitle" +text = "ОПЛАТА" +vertical_alignment = 1 +pivot_offset = Vector2(0, 22) +scale = Vector2(1.17, 1) + +[node name="Prompt" type="Label" parent="SafeMargin/Content/KeypadPanel/Content"] +layout_mode = 0 +offset_top = 62.0 +offset_right = 602.0 +offset_bottom = 106.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "ВВЕДИТЕ СУММУ" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(301, 22) +scale = Vector2(1.17, 1) + +[node name="InputBar" type="TextureRect" parent="SafeMargin/Content/KeypadPanel/Content"] +texture_filter = 1 +layout_mode = 0 +offset_left = 131.0 +offset_top = 120.0 +offset_right = 470.0 +offset_bottom = 164.0 +mouse_filter = 2 +texture = ExtResource("5_sum_bar") +expand_mode = 1 +stretch_mode = 5 + +[node name="InputValue" type="Label" parent="SafeMargin/Content/KeypadPanel/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.input_value" +layout_mode = 0 +offset_top = 118.0 +offset_left = 205.0 +offset_right = 397.0 +offset_bottom = 164.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 28 +text = "1000" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(96, 23) +scale = Vector2(1.15, 1) + +[node name="Keypad" type="Control" parent="SafeMargin/Content/KeypadPanel/Content"] +layout_mode = 0 +offset_right = 602.0 +offset_bottom = 444.0 + +[node name="Digit1" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit1" +layout_mode = 0 +offset_left = 217.0 +offset_top = 190.0 +offset_right = 263.0 +offset_bottom = 236.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "1" +[node name="Digit2" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit2" +layout_mode = 0 +offset_left = 277.0 +offset_top = 190.0 +offset_right = 323.0 +offset_bottom = 236.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "2" +[node name="Digit3" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit3" +layout_mode = 0 +offset_left = 337.0 +offset_top = 190.0 +offset_right = 383.0 +offset_bottom = 236.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "3" +[node name="Digit4" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit4" +layout_mode = 0 +offset_left = 217.0 +offset_top = 248.0 +offset_right = 263.0 +offset_bottom = 294.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "4" +[node name="Digit5" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit5" +layout_mode = 0 +offset_left = 277.0 +offset_top = 248.0 +offset_right = 323.0 +offset_bottom = 294.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "5" +[node name="Digit6" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit6" +layout_mode = 0 +offset_left = 337.0 +offset_top = 248.0 +offset_right = 383.0 +offset_bottom = 294.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "6" +[node name="Digit7" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit7" +layout_mode = 0 +offset_left = 217.0 +offset_top = 307.0 +offset_right = 263.0 +offset_bottom = 353.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "7" +[node name="Digit8" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit8" +layout_mode = 0 +offset_left = 277.0 +offset_top = 307.0 +offset_right = 323.0 +offset_bottom = 353.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "8" +[node name="Digit9" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit9" +layout_mode = 0 +offset_left = 337.0 +offset_top = 307.0 +offset_right = 383.0 +offset_bottom = 353.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "9" + +[node name="ClearButton" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.clear_button" +layout_mode = 0 +offset_left = 87.0 +offset_top = 363.0 +offset_right = 239.6 +offset_bottom = 408.0 +pivot_offset = Vector2(0, 22.5) +scale = Vector2(1.16, 1) +theme_type_variation = &"CancelButton" +theme_override_font_sizes/font_size = 28 +text = "СТЕРЕТЬ" + +[node name="Digit0" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.digit0" +layout_mode = 0 +offset_left = 277.0 +offset_top = 364.0 +offset_right = 323.0 +offset_bottom = 410.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "0" + +[node name="BackspaceButton" type="Button" parent="SafeMargin/Content/KeypadPanel/Content/Keypad"] +metadata/exchanger_binding_id = "card_custom_amount.content.keypad_panel.content.keypad.backspace_button" +visible = false +layout_mode = 0 +offset_left = 337.0 +offset_top = 365.0 +offset_right = 383.0 +offset_bottom = 411.0 +theme_type_variation = &"KeypadButton" +theme_override_styles/disabled = SubResource("StyleBox_ref_keypad_disabled") +theme_override_styles/hover = SubResource("StyleBox_ref_keypad_hover") +theme_override_styles/normal = SubResource("StyleBox_ref_keypad_normal") +theme_override_styles/pressed = SubResource("StyleBox_ref_keypad_pressed") +theme_override_font_sizes/font_size = 27 +text = "⌫" + +[node name="ConfirmButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.confirm_button" +layout_mode = 0 +offset_left = 397.0 +offset_top = 741.0 +offset_right = 549.6 +offset_bottom = 786.0 +pivot_offset = Vector2(0, 22.5) +scale = Vector2(1.16, 1) +theme_type_variation = &"KeyboardActionButton" +theme_override_font_sizes/font_size = 28 +text = "OK" + +[node name="BottomTip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 1128.0 +mouse_filter = 2 + +[node name="Banner" type="AnimatedSprite2D" parent="SafeMargin/Content/BottomTip"] +texture_filter = 1 +position = Vector2(376.5, 1067.5) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_card_custom_amount_banner") +autoplay = "default" +script = ExtResource("10_banner_script") + +[node name="Hint" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_custom_amount.content.hint" +visible = false +layout_mode = 0 +offset_left = 225.0 +offset_top = 1022.0 +offset_right = 660.0 +offset_bottom = 1092.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 18 +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("2_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_card_terminal.tscn b/themes/space-pixel/package/scenes/screen_card_terminal.tscn new file mode 100644 index 0000000..19a9ff0 --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_card_terminal.tscn @@ -0,0 +1,311 @@ +[gd_scene load_steps=13 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] +[ext_resource type="PackedScene" path="../visuals/card_terminal.tscn" id="4_terminal_visual"] +[ext_resource type="Texture2D" path="../assets/ui/panel_card.png" id="5_panel_card"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_01.png" id="6_banner_1"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_02.png" id="7_banner_2"] +[ext_resource type="Script" path="../scripts/stable_banner_animation.gd" id="8_banner_script"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="9_home_icon"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_card_terminal_banner"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("6_banner_1")}, {"duration": 1.0, "texture": ExtResource("7_banner_2")}], "loop": true, "name": &"default", "speed": 1.0}] + +[sub_resource type="StyleBoxTexture" id="StyleBox_terminal_panel"] +content_margin_left = 42.0 +content_margin_top = 109.0 +content_margin_right = 42.0 +content_margin_bottom = 109.0 +texture = ExtResource("5_panel_card") + +[node name="ThemeScreen_CardTerminal" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.card_terminal" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="BackButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"back_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 161.0 +metadata/exchanger_pet_surface_y = 43.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(73, 135) + +[node name="PaymentWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"payment_window" +metadata/exchanger_pet_surface_from_x = 32.0 +metadata/exchanger_pet_surface_to_x = 688.0 +metadata/exchanger_pet_surface_y = 243.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="CancelButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"cancel_button" +metadata/exchanger_pet_surface_from_x = 162.0 +metadata/exchanger_pet_surface_to_x = 436.0 +metadata/exchanger_pet_surface_y = 840.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(299) + +[node name="FloorToBack" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_back" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"back_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 43.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToPayment" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 243.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToCancel" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_cancel" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"cancel_button" +metadata/exchanger_pet_climb_x = 162.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 840.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 120.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_terminal.content.top_bar.back_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 43.0 +offset_right = 97.0 +offset_bottom = 91.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "card_terminal.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 109.0 +offset_top = 42.0 +offset_right = 161.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("9_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 38.0 +offset_top = 95.0 +offset_right = 103.0 +offset_bottom = 123.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 16 +text = "НАЗАД" +horizontal_alignment = 1 +pivot_offset = Vector2(32.5, 14) +scale = Vector2(1.2, 1) + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 200.0 +offset_top = 43.0 +offset_right = 720.0 +offset_bottom = 103.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА КАРТОЙ" +horizontal_alignment = 1 +pivot_offset = Vector2(260, 30) +scale = Vector2(1.385, 1) + +[node name="PaymentPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 19.0 +offset_top = 243.0 +offset_right = 702.0 +offset_bottom = 923.0 +theme_type_variation = &"ReferencePanel" +theme_override_styles/panel = SubResource("StyleBox_terminal_panel") + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Content/PaymentPanel"] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="Header" type="Label" parent="SafeMargin/Content/PaymentPanel/Content"] +custom_minimum_size = Vector2(0, 43) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +theme_override_font_sizes/font_size = 34 +text = "ОПЛАТА" +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/PaymentPanel/Content"] +custom_minimum_size = Vector2(0, 419) +layout_mode = 2 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Content/PaymentPanel/Content/Body" instance=ExtResource("4_terminal_visual")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Instruction" type="Label" parent="SafeMargin/Content/PaymentPanel/Content/Body"] +layout_mode = 0 +offset_left = 99.0 +offset_top = 297.0 +offset_right = 499.0 +offset_bottom = 387.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 21 +text = "ПРИЛОЖИТЕ КАРТУ\nК ТЕРМИНАЛУ ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.amount" +layout_mode = 0 +offset_left = 211.0 +offset_top = 991.0 +offset_right = 680.0 +offset_bottom = 1042.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 20 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Tokens" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.tokens" +visible = false + +[node name="CancelButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.cancel_button" +layout_mode = 0 +offset_left = 210.0 +offset_top = 840.0 +offset_right = 484.0 +offset_bottom = 886.0 +theme_type_variation = &"CancelButton" +text = "ОТМЕНА" +pivot_offset = Vector2(137, 23) +scale = Vector2(1.35, 1) + +[node name="BottomTip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 1128.0 +mouse_filter = 2 + +[node name="Banner" type="AnimatedSprite2D" parent="SafeMargin/Content/BottomTip"] +texture_filter = 1 +position = Vector2(376.5, 1067.5) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_card_terminal_banner") +autoplay = "default" +script = ExtResource("8_banner_script") + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.countdown" +layout_mode = 0 +offset_left = 211.0 +offset_top = 1042.0 +offset_right = 680.0 +offset_bottom = 1088.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="DebugPanel" type="VBoxContainer" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel" +visible = false + +[node name="ApproveButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.approve_button" +text = "Одобрить" +[node name="DeclineButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.decline_button" +text = "Отклонить" +[node name="DispenseFailureButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.dispense_failure_button" +text = "Ошибка выдачи" +[node name="PartialDispenseButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.partial_dispense_button" +text = "Частичная выдача" +[node name="ConnectionLossButton" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "card_terminal.content.debug_panel.connection_loss_button" +text = "Потеря связи" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_cash_payment.tscn b/themes/space-pixel/package/scenes/screen_cash_payment.tscn new file mode 100644 index 0000000..232b845 --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_cash_payment.tscn @@ -0,0 +1,586 @@ +[gd_scene load_steps=16 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] +[ext_resource type="PackedScene" path="../visuals/cash_instructions.tscn" id="4_instructions"] +[ext_resource type="PackedScene" path="../visuals/cash_tip.tscn" id="5_tip"] +[ext_resource type="Texture2D" path="../assets/ui/panel_medium.png" id="6_panel"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_01.png" id="7_banner_1"] +[ext_resource type="Texture2D" path="../assets/animations/banner/frame_02.png" id="8_banner_2"] +[ext_resource type="Script" path="../scripts/stable_banner_animation.gd" id="9_banner_script"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="10_home_icon"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_cash_panel"] +atlas = ExtResource("6_panel") +region = Rect2(4, 34, 504, 186) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cash_panel_top"] +atlas = ExtResource("6_panel") +region = Rect2(4, 34, 504, 66) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cash_panel_body"] +atlas = ExtResource("6_panel") +region = Rect2(4, 100, 504, 120) + +[sub_resource type="SpriteFrames" id="SpriteFrames_cash_banner"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("7_banner_1")}, {"duration": 1.0, "texture": ExtResource("8_banner_2")}], "loop": true, "name": &"default", "speed": 1.0}] + +[node name="ThemeScreen_CashPayment" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.cash_payment" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="BackButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"back_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 161.0 +metadata/exchanger_pet_surface_y = 42.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(75, 135) + +[node name="SummaryWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"summary_window" +metadata/exchanger_pet_surface_from_x = 36.0 +metadata/exchanger_pet_surface_to_x = 685.0 +metadata/exchanger_pet_surface_y = 148.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="BalanceWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"balance_window" +metadata/exchanger_pet_surface_from_x = 36.0 +metadata/exchanger_pet_surface_to_x = 372.0 +metadata/exchanger_pet_surface_y = 280.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(204) + +[node name="TipWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"tip_window" +metadata/exchanger_pet_surface_from_x = 381.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 281.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(532) + +[node name="InstructionWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"instruction_window" +metadata/exchanger_pet_surface_from_x = 35.0 +metadata/exchanger_pet_surface_to_x = 685.0 +metadata/exchanger_pet_surface_y = 451.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="DispenseButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"dispense_button" +metadata/exchanger_pet_surface_from_x = 36.0 +metadata/exchanger_pet_surface_to_x = 684.0 +metadata/exchanger_pet_surface_y = 883.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="FloorToBack" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_back" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"back_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 42.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToSummary" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_summary" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"summary_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 148.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToBalance" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_balance" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"balance_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 280.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToTip" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_tip" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"tip_window" +metadata/exchanger_pet_climb_x = 680.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 281.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="FloorToInstruction" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_instruction" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"instruction_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 451.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToDispense" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_dispense" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"dispense_button" +metadata/exchanger_pet_climb_x = 680.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 883.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TopBar" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 92.0 + +[node name="BackButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "cash_payment.content.top_bar.back_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 42.0 +offset_right = 101.0 +offset_bottom = 94.0 +theme_type_variation = &"BackButton" + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content/TopBar"] +metadata/exchanger_binding_id = "cash_payment.content.top_bar.home_navigation_button" +layout_mode = 0 +offset_left = 109.0 +offset_top = 42.0 +offset_right = 161.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("10_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="BackText" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 39.0 +offset_top = 90.0 +offset_right = 103.0 +offset_bottom = 116.0 +mouse_filter = 2 +theme_type_variation = &"SupportText" +theme_override_font_sizes/font_size = 16 +text = "НАЗАД" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(32, 13) +scale = Vector2(1.28, 1) + +[node name="Title" type="Label" parent="SafeMargin/Content/TopBar"] +layout_mode = 0 +offset_left = 170.0 +offset_top = 38.5 +offset_right = 680.0 +offset_bottom = 90.5 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НАЛИЧНЫМИ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 26) +scale = Vector2(1.355, 1.1) + +[node name="CurrentBalancePanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 36.0 +offset_top = 280.0 +offset_right = 372.0 +offset_bottom = 406.0 +theme_type_variation = &"ReferencePanel" + +[node name="Content" type="Control" parent="SafeMargin/Content/CurrentBalancePanel"] +layout_mode = 2 + +[node name="PanelTexture" type="TextureRect" parent="SafeMargin/Content/CurrentBalancePanel/Content"] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -22.0 +offset_top = -10.0 +offset_right = 22.0 +offset_bottom = 18.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_cash_panel") +expand_mode = 1 +stretch_mode = 0 + +[node name="Title" type="Label" parent="SafeMargin/Content/CurrentBalancePanel/Content"] +layout_mode = 0 +offset_top = -8.0 +offset_right = 307.0 +offset_bottom = 34.0 +theme_type_variation = &"PanelTitle" +text = "ТЕКУЩИЙ БАЛАНС" +vertical_alignment = 1 +pivot_offset = Vector2(0, 21) +scale = Vector2(1.23, 1) + +[node name="Summary" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 36.0 +offset_top = 148.0 +offset_right = 685.0 +offset_bottom = 273.0 +theme_type_variation = &"ReferencePanel" + +[node name="Margin" type="Control" parent="SafeMargin/Content/Summary"] +layout_mode = 2 + +[node name="Values" type="Control" parent="SafeMargin/Content/Summary/Margin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelTexture" type="TextureRect" parent="SafeMargin/Content/Summary/Margin/Values"] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -22.0 +offset_top = -10.0 +offset_right = 22.0 +offset_bottom = 18.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_cash_panel") +expand_mode = 1 +stretch_mode = 0 + +[node name="Caption" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +layout_mode = 0 +offset_left = 2.0 +offset_top = -9.0 +offset_right = 370.0 +offset_bottom = 34.0 +theme_type_variation = &"PanelTitle" +text = "К ВЫДАЧЕ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 21) +scale = Vector2(1.21, 1) + +[node name="Balance" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.balance" +layout_mode = 0 +offset_left = 10.0 +offset_top = 165.0 +offset_right = 310.0 +offset_bottom = 240.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 27 +text = "1000 РУБЛЕЙ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 37) +scale = Vector2(1.22, 1) + +[node name="Tokens" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.tokens" +layout_mode = 0 +offset_left = 2.0 +offset_top = 37.0 +offset_right = 300.0 +offset_bottom = 108.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 27 +text = "100 ЖЕТОНОВ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 33.5) +scale = Vector2(1.25, 1) + +[node name="Bonus" type="Label" parent="SafeMargin/Content/Summary/Margin/Values"] +metadata/exchanger_binding_id = "cash_payment.content.summary.margin.values.bonus" +layout_mode = 0 +offset_left = 295.0 +offset_top = 35.0 +offset_right = 595.0 +offset_bottom = 110.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 25 +text = "+ 50 ЖЕТОНОВ\nВ ПОДАРОК" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(150, 35.5) +scale = Vector2(1.35, 1) + +[node name="InstructionPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 35.0 +offset_top = 451.0 +offset_right = 685.0 +offset_bottom = 816.0 +theme_type_variation = &"ReferencePanel" + +[node name="Content" type="Control" parent="SafeMargin/Content/InstructionPanel"] +layout_mode = 2 + +[node name="PanelTop" type="TextureRect" parent="SafeMargin/Content/InstructionPanel/Content"] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_left = -22.0 +offset_top = -10.0 +offset_right = 22.0 +offset_bottom = 34.0 +grow_horizontal = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_cash_panel_top") +expand_mode = 1 +stretch_mode = 0 + +[node name="PanelBody" type="NinePatchRect" parent="SafeMargin/Content/InstructionPanel/Content"] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -22.0 +offset_top = 34.0 +offset_right = 22.0 +offset_bottom = 18.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_cash_panel_body") +patch_margin_left = 15 +patch_margin_right = 15 +patch_margin_bottom = 12 + +[node name="Header" type="Label" parent="SafeMargin/Content/InstructionPanel/Content"] +layout_mode = 0 +offset_top = -9.0 +offset_left = 4.0 +offset_right = 322.0 +offset_bottom = 33.0 +theme_type_variation = &"PanelTitle" +text = "КАК ВНЕСТИ" +vertical_alignment = 1 +pivot_offset = Vector2(0, 21) +scale = Vector2(1.25, 1) + +[node name="Body" type="Control" parent="SafeMargin/Content/InstructionPanel/Content"] +layout_mode = 0 +offset_left = -21.0 +offset_top = 33.0 +offset_right = 627.0 +offset_bottom = 355.0 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Content/InstructionPanel/Content/Body" instance=ExtResource("4_instructions")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BillText" type="Label" parent="SafeMargin/Content/InstructionPanel/Content/Body"] +layout_mode = 0 +offset_left = 294.0 +offset_top = 44.0 +offset_right = 551.0 +offset_bottom = 118.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 21 +text = "ВСТАВЬТЕ КУПЮРЫ\nВ КУПЮРОПРИЁМНИК" +vertical_alignment = 1 +pivot_offset = Vector2(0, 37) +scale = Vector2(1.08, 1) + +[node name="CoinText" type="Label" parent="SafeMargin/Content/InstructionPanel/Content/Body"] +layout_mode = 0 +offset_left = 294.0 +offset_top = 183.0 +offset_right = 551.0 +offset_bottom = 265.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 21 +text = "ИЛИ МОНЕТЫ\nВ МОНЕТОПРИЁМНИК" +vertical_alignment = 1 +pivot_offset = Vector2(0, 41) +scale = Vector2(1.08, 1) + +[node name="DispenseButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.dispense_button" +layout_mode = 0 +offset_left = 36.0 +offset_top = 883.0 +offset_right = 684.0 +offset_bottom = 959.0 +theme_type_variation = &"PrimaryButton" +text = "" + +[node name="Caption" type="Label" parent="SafeMargin/Content/DispenseButton"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -6.0 +offset_bottom = -6.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 40 +text = "ВЫДАТЬ" +horizontal_alignment = 1 +vertical_alignment = 1 +pivot_offset = Vector2(324, 38) +scale = Vector2(1.37, 1) + +[node name="Tip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 381.0 +offset_top = 281.0 +offset_right = 684.0 +offset_bottom = 406.0 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Content/Tip" instance=ExtResource("5_tip")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TipText" type="Label" parent="SafeMargin/Content"] +visible = false +layout_mode = 0 +offset_left = 381.0 +offset_top = 281.0 +offset_right = 557.0 +offset_bottom = 365.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 14 +text = "АВТОМАТ НЕ ВЫДАЁТ СДАЧУ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="BottomTip" type="Control" parent="SafeMargin/Content"] +layout_mode = 0 +offset_right = 720.0 +offset_bottom = 1128.0 +mouse_filter = 2 + +[node name="BannerText" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.banner_text" +layout_mode = 0 +offset_left = 225.0 +offset_top = 1022.0 +offset_right = 660.0 +offset_bottom = 1092.0 +mouse_filter = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 18 +text = "АВТОМАТ НЕ ВЫДАЁТ СДАЧУ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Banner" type="AnimatedSprite2D" parent="SafeMargin/Content/BottomTip"] +texture_filter = 1 +position = Vector2(376.5, 1067.5) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_cash_banner") +autoplay = "default" +script = ExtResource("9_banner_script") + +[node name="DebugPanel" type="HBoxContainer" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel" +visible = false + +[node name="Add10Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add10_button" +text = "+10 ₽" + +[node name="Add50Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add50_button" +text = "+50 ₽" + +[node name="Add100Button" type="Button" parent="SafeMargin/Content/DebugPanel"] +metadata/exchanger_binding_id = "cash_payment.content.debug_panel.add100_button" +text = "+100 ₽" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_error.tscn b/themes/space-pixel/package/scenes/screen_error.tscn new file mode 100644 index 0000000..52a223a --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_error.tscn @@ -0,0 +1,212 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] +[ext_resource type="PackedScene" path="../visuals/result_error.tscn" id="4_result_visual"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="5_home_icon"] + +[node name="ThemeScreen_Error" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.error" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="ErrorWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"error_window" +metadata/exchanger_pet_surface_from_x = 96.0 +metadata/exchanger_pet_surface_to_x = 624.0 +metadata/exchanger_pet_surface_y = 176.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="HomeButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"home_button" +metadata/exchanger_pet_surface_from_x = 84.0 +metadata/exchanger_pet_surface_to_x = 636.0 +metadata/exchanger_pet_surface_y = 862.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="HomeNavigationButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"home_navigation_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 101.0 +metadata/exchanger_pet_surface_y = 42.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(75) + +[node name="FloorToHomeNavigation" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_home_navigation" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"home_navigation_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 42.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToError" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_error" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"error_window" +metadata/exchanger_pet_climb_x = 96.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 176.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToHome" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_home" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"home_button" +metadata/exchanger_pet_climb_x = 84.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 862.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.home_navigation_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 42.0 +offset_right = 101.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("5_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="ScreenTitle" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА НЕ ПРОШЛА" +horizontal_alignment = 1 + +[node name="ErrorPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/ErrorPanel"] +layout_mode = 2 + +[node name="Values" type="VBoxContainer" parent="SafeMargin/Content/ErrorPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="SafeMargin/Content/ErrorPanel/Margin/Values"] +metadata/exchanger_binding_id = "error.content.error_panel.margin.values.title" +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ОШИБКА ОПЛАТЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/ErrorPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Content/ErrorPanel/Margin/Values/Body" instance=ExtResource("4_result_visual")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Message" type="Label" parent="SafeMargin/Content/ErrorPanel/Margin/Values/Body"] +metadata/exchanger_binding_id = "error.content.error_panel.margin.values.body.message" +layout_mode = 0 +offset_left = 30.0 +offset_top = 410.0 +offset_right = 454.0 +offset_bottom = 506.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 22 +text = "ПОПРОБУЙТЕ ЕЩЁ РАЗ\nИЛИ ВЫБЕРИТЕ ДРУГОЙ СПОСОБ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.countdown" +visible = false +theme_type_variation = &"ErrorText" + +[node name="HomeButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "error.content.home_button" +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_home.tscn b/themes/space-pixel/package/scenes/screen_home.tscn new file mode 100644 index 0000000..c60d6fa --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_home.tscn @@ -0,0 +1,902 @@ +[gd_scene format=3 uid="uid://bq5v17i2jq3ca"] + +[ext_resource type="Theme" uid="uid://dfq25gg23x0xh" path="res://themes/space-pixel/package/ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" uid="uid://d1vaivunuaov7" path="res://themes/space-pixel/package/assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="res://themes/space-pixel/package/background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="res://themes/space-pixel/package/visuals/home_top.tscn" id="6_theme_top"] +[ext_resource type="PackedScene" path="res://themes/space-pixel/package/visuals/home_advertisement.tscn" id="7_theme_promo"] +[ext_resource type="Texture2D" uid="uid://4uvc8mo74hy1" path="res://themes/space-pixel/package/assets/ui/bubble_large.png" id="8_price_bubble"] +[ext_resource type="Texture2D" uid="uid://coavqhyjqqkda" path="res://themes/space-pixel/package/assets/ui/panel_wide.png" id="9_panel_wide"] +[ext_resource type="Texture2D" uid="uid://c7wodqqe8yuij" path="res://themes/space-pixel/package/assets/ui/stock_low.png" id="10_stock_low"] +[ext_resource type="Texture2D" uid="uid://dt26n4n470hnm" path="res://themes/space-pixel/package/assets/ui/stock_many.png" id="10_stock_many"] +[ext_resource type="Texture2D" uid="uid://218aa00e5vns" path="res://themes/space-pixel/package/assets/ui/logo.png" id="11_logo"] +[ext_resource type="Texture2D" uid="uid://b4gr7gwf5jyy6" path="res://themes/space-pixel/package/assets/ui/button_long.png" id="12_button_long"] +[ext_resource type="Script" uid="uid://dqgrwkru1akc1" path="res://themes/space-pixel/package/scripts/home_reference_label.gd" id="13_reference_label"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_home_button_normal"] +content_margin_left = 18.0 +content_margin_top = 8.0 +content_margin_right = 18.0 +content_margin_bottom = 8.0 +texture = ExtResource("12_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_home_button_pressed"] +content_margin_left = 18.0 +content_margin_top = 10.0 +content_margin_right = 18.0 +content_margin_bottom = 6.0 +texture = ExtResource("12_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.78, 0.84, 0.8, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_home_button_hover"] +content_margin_left = 18.0 +content_margin_top = 8.0 +content_margin_right = 18.0 +content_margin_bottom = 8.0 +texture = ExtResource("12_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(1.08, 1.08, 1.08, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_home_button_disabled"] +content_margin_left = 18.0 +content_margin_top = 8.0 +content_margin_right = 18.0 +content_margin_bottom = 8.0 +texture = ExtResource("12_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.42, 0.48, 0.54, 0.72) + +[node name="ThemeScreen_Home" type="Control" unique_id=1804336361] +texture_filter = 1 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") +metadata/exchanger_screen_binding_id = "screen.home" +metadata/exchanger_self_contained_visuals = true + +[node name="ThemeBackground" type="TextureRect" parent="." unique_id=1992534830] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." unique_id=646343961 instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="." unique_id=616650133] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 48, 656, 1192) + +[node name="Floor" type="Node2D" parent="PetNavigation" unique_id=449547698] +position = Vector2(40, 1240) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="AdvertisementWindow" type="Node2D" parent="PetNavigation" unique_id=1891603462] +position = Vector2(144, 827) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"advertisement_window" +metadata/exchanger_pet_surface_visibility_binding_id = "home.scroll.content.advertisement_panel" +metadata/exchanger_pet_surface_from_x = 144.0 +metadata/exchanger_pet_surface_to_x = 576.0 +metadata/exchanger_pet_surface_y = 827.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="PaymentWindow" type="Node2D" parent="PetNavigation" unique_id=836670345] +position = Vector2(40, 490) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"payment_window" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 490.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="StockWindow" type="Node2D" parent="PetNavigation" unique_id=826893497] +position = Vector2(40, 337) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"stock_window" +metadata/exchanger_pet_surface_visibility_binding_id = "home.scroll.content.stock_status" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 337.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="CashButton" type="Node2D" parent="PetNavigation" unique_id=761084871] +position = Vector2(76, 550) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"cash_button" +metadata/exchanger_pet_surface_from_x = 76.0 +metadata/exchanger_pet_surface_to_x = 346.0 +metadata/exchanger_pet_surface_y = 550.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(211) + +[node name="CardButton" type="Node2D" parent="PetNavigation" unique_id=1171221989] +position = Vector2(375, 550) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"card_button" +metadata/exchanger_pet_surface_from_x = 375.0 +metadata/exchanger_pet_surface_to_x = 645.0 +metadata/exchanger_pet_surface_y = 550.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(510) + +[node name="PriceWindow" type="Node2D" parent="PetNavigation" unique_id=600648955] +position = Vector2(153, 60) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"price_window" +metadata/exchanger_pet_surface_from_x = 153.0 +metadata/exchanger_pet_surface_to_x = 397.0 +metadata/exchanger_pet_surface_y = 60.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(275) + +[node name="SpeechWindow" type="Node2D" parent="PetNavigation" unique_id=1263112927] +position = Vector2(406, 61) +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"speech_window" +metadata/exchanger_pet_surface_from_x = 406.0 +metadata/exchanger_pet_surface_to_x = 578.0 +metadata/exchanger_pet_surface_y = 61.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(492) + +[node name="LeftFloorToPayment" type="Node2D" parent="PetNavigation" unique_id=668670166] +position = Vector2(40, 1240) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"left_floor_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 490.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="RightFloorToPayment" type="Node2D" parent="PetNavigation" unique_id=1777127755] +position = Vector2(680, 1240) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"right_floor_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 680.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 490.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="LeftPaymentToStock" type="Node2D" parent="PetNavigation" unique_id=324222546] +position = Vector2(40, 490) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"left_payment_to_stock" +metadata/exchanger_pet_climb_from_surface_id = &"payment_window" +metadata/exchanger_pet_climb_to_surface_id = &"stock_window" +metadata/exchanger_pet_climb_x = 40.0 +metadata/exchanger_pet_climb_from_y = 490.0 +metadata/exchanger_pet_climb_to_y = 337.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="RightPaymentToStock" type="Node2D" parent="PetNavigation" unique_id=294741352] +position = Vector2(680, 490) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"right_payment_to_stock" +metadata/exchanger_pet_climb_from_surface_id = &"payment_window" +metadata/exchanger_pet_climb_to_surface_id = &"stock_window" +metadata/exchanger_pet_climb_x = 680.0 +metadata/exchanger_pet_climb_from_y = 490.0 +metadata/exchanger_pet_climb_to_y = 337.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="AdvertisementToFloor" type="Node2D" parent="PetNavigation" unique_id=867083212] +position = Vector2(576, 827) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"advertisement_to_floor" +metadata/exchanger_pet_climb_from_surface_id = &"advertisement_window" +metadata/exchanger_pet_climb_to_surface_id = &"floor" +metadata/exchanger_pet_climb_x = 576.0 +metadata/exchanger_pet_climb_from_y = 827.0 +metadata/exchanger_pet_climb_to_y = 1240.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="AdvertisementToPayment" type="Node2D" parent="PetNavigation" unique_id=1856161019] +position = Vector2(576, 827) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"advertisement_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"advertisement_window" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 576.0 +metadata/exchanger_pet_climb_from_y = 827.0 +metadata/exchanger_pet_climb_to_y = 490.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="CashButtonToPayment" type="Node2D" parent="PetNavigation" unique_id=1999912169] +position = Vector2(76, 550) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"cash_button_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"cash_button" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 76.0 +metadata/exchanger_pet_climb_from_y = 550.0 +metadata/exchanger_pet_climb_to_y = 490.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="CardButtonToPayment" type="Node2D" parent="PetNavigation" unique_id=738124591] +position = Vector2(645, 550) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"card_button_to_payment" +metadata/exchanger_pet_climb_from_surface_id = &"card_button" +metadata/exchanger_pet_climb_to_surface_id = &"payment_window" +metadata/exchanger_pet_climb_x = 645.0 +metadata/exchanger_pet_climb_from_y = 550.0 +metadata/exchanger_pet_climb_to_y = 490.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="PriceToStock" type="Node2D" parent="PetNavigation" unique_id=1593757411] +position = Vector2(397, 337) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"price_to_stock" +metadata/exchanger_pet_climb_from_surface_id = &"stock_window" +metadata/exchanger_pet_climb_to_surface_id = &"price_window" +metadata/exchanger_pet_climb_x = 397.0 +metadata/exchanger_pet_climb_from_y = 337.0 +metadata/exchanger_pet_climb_to_y = 60.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="SpeechToStock" type="Node2D" parent="PetNavigation" unique_id=291349586] +position = Vector2(578, 337) +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"speech_to_stock" +metadata/exchanger_pet_climb_from_surface_id = &"stock_window" +metadata/exchanger_pet_climb_to_surface_id = &"speech_window" +metadata/exchanger_pet_climb_x = 578.0 +metadata/exchanger_pet_climb_from_y = 337.0 +metadata/exchanger_pet_climb_to_y = 61.0 +metadata/exchanger_pet_climb_side = &"right" + +[node name="SafeMargin" type="Control" parent="." unique_id=690477283] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Scroll" type="Control" parent="SafeMargin" unique_id=1061057886] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll" unique_id=1159952639] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ThemeTop" type="Control" parent="SafeMargin/Scroll/Content" unique_id=796161356] +anchors_preset = 0 +offset_right = 720.0 +offset_bottom = 300.0 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Scroll/Content/ThemeTop" unique_id=637818246 instance=ExtResource("6_theme_top")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PricePanel" type="Control" parent="SafeMargin/Scroll/Content" unique_id=928304235] +anchors_preset = 0 +offset_right = 720.0 +offset_bottom = 280.0 +mouse_filter = 2 + +[node name="Bubble" type="TextureRect" parent="SafeMargin/Scroll/Content/PricePanel" unique_id=1751255244] +texture_filter = 1 +layout_mode = 0 +offset_left = 99.0 +offset_top = 58.0 +offset_right = 440.0 +offset_bottom = 228.0 +mouse_filter = 2 +texture = ExtResource("8_price_bubble") +expand_mode = 1 + +[node name="Margin" type="Control" parent="SafeMargin/Scroll/Content/PricePanel" unique_id=1737799399] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/PricePanel/Margin" unique_id=1995513691] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Caption" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=1162785127] +layout_mode = 0 +offset_left = 180.0 +offset_top = 67.0 +offset_right = 375.0 +offset_bottom = 126.0 +scale = Vector2(1.08, 0.891) +pivot_offset = Vector2(97.5, 29.5) +theme_type_variation = &"PanelTitle" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 60 +text = "ЦЕНА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TokenCaption" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=854323000] +layout_mode = 0 +offset_left = 178.0 +offset_top = 116.0 +offset_right = 373.0 +offset_bottom = 159.0 +scale = Vector2(1, 0.85) +pivot_offset = Vector2(97.5, 21.5) +theme_type_variation = &"PanelTitle" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 40 +text = "ЖЕТОНА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Price" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=501765176] +layout_mode = 0 +offset_left = 181.0 +offset_top = 163.0 +offset_right = 379.0 +offset_bottom = 214.0 +scale = Vector2(1.183, 1) +pivot_offset = Vector2(99, 25.5) +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 36 +text = "10 руб." +horizontal_alignment = 1 +vertical_alignment = 1 +script = ExtResource("13_reference_label") +metadata/exchanger_binding_id = "home.scroll.content.price_panel.margin.content.price" + +[node name="SpeechText" type="Label" parent="SafeMargin/Scroll/Content" unique_id=329585995] +layout_mode = 0 +offset_left = 408.0 +offset_top = 62.0 +offset_right = 590.0 +offset_bottom = 135.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_constants/line_spacing = -2 +theme_override_font_sizes/font_size = 16 +text = "ТЕКСТ КЛИЕНТА" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 +clip_text = true +max_lines_visible = 3 +metadata/exchanger_binding_id = "home.scroll.content.speech_text" + +[node name="StockStatus" type="Control" parent="SafeMargin/Scroll/Content" unique_id=479011076] +anchors_preset = 0 +offset_left = 19.0 +offset_top = 315.0 +offset_right = 702.0 +offset_bottom = 486.0 +metadata/exchanger_binding_id = "home.scroll.content.stock_status" + +[node name="StockPanel" type="Control" parent="SafeMargin/Scroll/Content/StockStatus" unique_id=2048238646] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Background" type="TextureRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel" unique_id=1713879349] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -4.0 +offset_right = -1.0 +offset_bottom = 2.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("9_panel_wide") +expand_mode = 1 + +[node name="Margin" type="Control" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel" unique_id=1964468884] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin" unique_id=920573597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content" unique_id=893970727] +layout_mode = 0 +offset_left = 43.0 +offset_top = 21.0 +offset_right = 651.0 +offset_bottom = 64.0 +scale = Vector2(1.047, 0.88) +pivot_offset = Vector2(0, 21.5) +theme_type_variation = &"PanelTitle" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 32 +text = "ДОСТУПНО К ВЫДАЧЕ" +vertical_alignment = 1 + +[node name="StatusRow" type="CenterContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content" unique_id=883118960] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_top = 81.0 +offset_bottom = 129.0 +grow_horizontal = 2 +mouse_filter = 2 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow" unique_id=2091302252] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="State" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row" unique_id=966054930] +custom_minimum_size = Vector2(134, 48) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 30 +text = "МНОГО" +horizontal_alignment = 2 +vertical_alignment = 1 +metadata/exchanger_binding_id = "home.scroll.content.stock_status.state" + +[node name="Meter" type="Control" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row" unique_id=700812114] +custom_minimum_size = Vector2(172, 43) +layout_mode = 2 +mouse_filter = 2 + +[node name="Empty" type="TextureRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter" unique_id=45362449] +visible = false +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("10_stock_low") +expand_mode = 1 +stretch_mode = 5 +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.empty" + +[node name="Low" type="TextureRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter" unique_id=1953397082] +visible = false +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("10_stock_low") +expand_mode = 1 +stretch_mode = 5 +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.low" + +[node name="Enough" type="TextureRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter" unique_id=1501487737] +visible = false +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("10_stock_many") +expand_mode = 1 +stretch_mode = 5 +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.enough" + +[node name="Much" type="TextureRect" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row/Meter" unique_id=1697165866] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("10_stock_many") +expand_mode = 1 +stretch_mode = 5 +metadata/exchanger_binding_id = "home.scroll.content.stock_status.meter.much" + +[node name="ApproximateCount" type="Label" parent="SafeMargin/Scroll/Content/StockStatus/StockPanel/Margin/Content/StatusRow/Row" unique_id=1920944711] +custom_minimum_size = Vector2(150, 48) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 27 +text = "<100" +vertical_alignment = 1 +clip_text = true +metadata/exchanger_binding_id = "home.scroll.content.stock_status.approximate_count" + +[node name="PaymentPanel" type="Control" parent="SafeMargin/Scroll/Content" unique_id=1345480221] +anchors_preset = 0 +offset_left = 19.0 +offset_top = 467.0 +offset_right = 702.0 +offset_bottom = 638.0 +mouse_filter = 2 + +[node name="Background" type="TextureRect" parent="SafeMargin/Scroll/Content/PaymentPanel" unique_id=1295094144] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -2.0 +offset_right = -1.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("9_panel_wide") +expand_mode = 1 +stretch_mode = 5 + +[node name="Margin" type="Control" parent="SafeMargin/Scroll/Content/PaymentPanel" unique_id=991417353] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin" unique_id=1724603325] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content" unique_id=587555161] +layout_mode = 0 +offset_left = 42.0 +offset_top = 22.0 +offset_right = 650.0 +offset_bottom = 66.0 +scale = Vector2(1.05, 0.88) +pivot_offset = Vector2(0, 22) +theme_type_variation = &"PanelTitle" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 32 +text = "ВЫБЕРИТЕ СПОСОБ ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Buttons" type="Control" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content" unique_id=2136563870] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="CashButton" type="Button" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons" unique_id=391197948] +layout_mode = 0 +offset_left = 57.0 +offset_top = 82.0 +offset_right = 327.0 +offset_bottom = 127.0 +theme_override_styles/normal = SubResource("StyleBoxTexture_home_button_normal") +theme_override_styles/pressed = SubResource("StyleBoxTexture_home_button_pressed") +theme_override_styles/hover = SubResource("StyleBoxTexture_home_button_hover") +theme_override_styles/disabled = SubResource("StyleBoxTexture_home_button_disabled") +theme_override_styles/focus = SubResource("StyleBoxTexture_home_button_normal") +metadata/exchanger_binding_id = "home.scroll.content.payment_panel.margin.content.buttons.cash_button" + +[node name="Caption" type="Label" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CashButton" unique_id=1403095620] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 1.0 +offset_top = -2.0 +offset_right = 1.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(1.02, 0.83) +pivot_offset = Vector2(135, 22.5) +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 32 +text = "НАЛИЧНЫЕ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CardButton" type="Button" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons" unique_id=1364251695] +layout_mode = 0 +offset_left = 356.0 +offset_top = 82.0 +offset_right = 626.0 +offset_bottom = 127.0 +theme_override_styles/normal = SubResource("StyleBoxTexture_home_button_normal") +theme_override_styles/pressed = SubResource("StyleBoxTexture_home_button_pressed") +theme_override_styles/hover = SubResource("StyleBoxTexture_home_button_hover") +theme_override_styles/disabled = SubResource("StyleBoxTexture_home_button_disabled") +theme_override_styles/focus = SubResource("StyleBoxTexture_home_button_normal") +metadata/exchanger_binding_id = "home.scroll.content.payment_panel.margin.content.buttons.card_button" + +[node name="Caption" type="Label" parent="SafeMargin/Scroll/Content/PaymentPanel/Margin/Content/Buttons/CardButton" unique_id=1993220316] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 1.0 +offset_top = -2.0 +offset_right = 1.0 +offset_bottom = -2.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(1.02, 0.83) +pivot_offset = Vector2(135, 22.5) +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 32 +text = "БЕЗНАЛИЧНЫЕ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AdvertisementPanel" type="Control" parent="SafeMargin/Scroll/Content" unique_id=1981193011] +anchors_preset = 0 +offset_top = 744.0 +offset_right = 720.0 +offset_bottom = 1086.0 +mouse_filter = 2 +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel" + +[node name="Layer" type="Control" parent="SafeMargin/Scroll/Content/AdvertisementPanel" unique_id=1438117421] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="ThemeFrame" type="Control" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer" unique_id=1074573756] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/ThemeFrame" unique_id=696829693 instance=ExtResource("7_theme_promo")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer" unique_id=333120086] +anchors_preset = 0 +offset_left = 154.0 +offset_top = 92.0 +offset_right = 567.0 +offset_bottom = 306.0 +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content" + +[node name="Poster" type="TextureRect" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" unique_id=123745090] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.0050000004 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -0.07000005 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 6 +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.poster" + +[node name="VideoPlayer" type="VideoStreamPlayer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" unique_id=1918075027] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.0050000004 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -0.07000005 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand = true +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.video_player" + +[node name="FallbackLabel" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" unique_id=746293611] +layout_mode = 1 +anchors_preset = -1 +anchor_left = -0.0050000004 +anchor_top = 0.010000001 +anchor_right = 1.0070001 +anchor_bottom = 1.029 +offset_left = 50.428005 +offset_top = -0.09000015 +offset_right = -31.273163 +offset_bottom = -0.06100464 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(1.247, 1) +pivot_offset = Vector2(204, 104.5) +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 20 +text = "(ВИДЕОРЕКЛАМА)" +horizontal_alignment = 1 +vertical_alignment = 1 +metadata/exchanger_binding_id = "home.scroll.content.advertisement_panel.layer.content.fallback_label" + +[node name="Footer" type="Control" parent="SafeMargin/Scroll/Content" unique_id=1745688783] +anchors_preset = 0 +offset_top = 1128.0 +offset_right = 720.0 +offset_bottom = 1280.0 + +[node name="Margin" type="Control" parent="SafeMargin/Scroll/Content/Footer" unique_id=2069983039] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin/Scroll/Content/Footer/Margin" unique_id=781378825] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Logo" type="TextureRect" parent="SafeMargin/Scroll/Content/Footer/Margin/Content" unique_id=1609648852] +texture_filter = 1 +layout_mode = 0 +offset_left = -18.0 +offset_top = 24.0 +offset_right = 323.0 +offset_bottom = 109.0 +mouse_filter = 2 +texture = ExtResource("11_logo") +expand_mode = 1 +stretch_mode = 5 + +[node name="Brand" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content" unique_id=334741666] +visible = false +layout_mode = 0 +offset_right = 1.0 +offset_bottom = 1.0 +theme_type_variation = &"SupportText" +text = "РАЗМЕН +ЖЕТОНОВ" +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.brand" + +[node name="Support" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content" unique_id=1638210773] +layout_mode = 0 +offset_left = 341.0 +offset_top = 19.0 +offset_right = 677.0 +offset_bottom = 105.0 +scale = Vector2(1.35, 1) +pivot_offset = Vector2(0, 43) +theme_type_variation = &"SupportText" +theme_override_constants/line_spacing = 10 +theme_override_font_sizes/font_size = 24 +text = "ТЕХ ПОДДЕРЖКА: ++7-XXX-XXX-XX-XX" +vertical_alignment = 1 +script = ExtResource("13_reference_label") +format_mode = "support" +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.support" + +[node name="ConnectionStatus" type="Control" parent="SafeMargin/Scroll/Content/Footer/Margin/Content" unique_id=1740402169] +visible = false +anchors_preset = 0 +offset_left = 110.0 +offset_top = -68.0 +offset_right = 610.0 +offset_bottom = -8.0 +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.connection_status" + +[node name="Panel" type="PanelContainer" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus" unique_id=1920745621] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"StatusPanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel" unique_id=1995352139] +layout_mode = 2 +theme_override_constants/margin_left = 18 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 18 +theme_override_constants/margin_bottom = 10 + +[node name="Label" type="Label" parent="SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin" unique_id=1995483906] +layout_mode = 2 +theme_type_variation = &"StatusText" +theme_override_font_sizes/font_size = 18 +text = "СЕРВИС: НЕТ СВЯЗИ С КОНТРОЛЛЕРОМ" +horizontal_alignment = 1 +vertical_alignment = 1 +metadata/exchanger_binding_id = "home.scroll.content.footer.margin.content.connection_status.label" diff --git a/themes/space-pixel/package/scenes/screen_service_access.tscn b/themes/space-pixel/package/scenes/screen_service_access.tscn new file mode 100644 index 0000000..16465fb --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_service_access.tscn @@ -0,0 +1,408 @@ +[gd_scene load_steps=6 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="2_footer"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="4_home_icon"] + +[node name="ThemeScreen_ServiceAccess" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.service_access" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="AccessWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"access_window" +metadata/exchanger_pet_surface_from_x = 60.0 +metadata/exchanger_pet_surface_to_x = 660.0 +metadata/exchanger_pet_surface_y = 152.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="KeypadRow1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_1" +metadata/exchanger_pet_surface_from_x = 180.0 +metadata/exchanger_pet_surface_to_x = 540.0 +metadata/exchanger_pet_surface_y = 318.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(236, 360, 484) + +[node name="KeypadRow2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_2" +metadata/exchanger_pet_surface_from_x = 180.0 +metadata/exchanger_pet_surface_to_x = 540.0 +metadata/exchanger_pet_surface_y = 442.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(236, 360, 484) + +[node name="KeypadRow3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_3" +metadata/exchanger_pet_surface_from_x = 180.0 +metadata/exchanger_pet_surface_to_x = 540.0 +metadata/exchanger_pet_surface_y = 566.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(236, 360, 484) + +[node name="KeypadRow4" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"keypad_row_4" +metadata/exchanger_pet_surface_from_x = 180.0 +metadata/exchanger_pet_surface_to_x = 540.0 +metadata/exchanger_pet_surface_y = 690.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(236, 360, 484) + +[node name="EnterButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"enter_button" +metadata/exchanger_pet_surface_from_x = 82.0 +metadata/exchanger_pet_surface_to_x = 638.0 +metadata/exchanger_pet_surface_y = 822.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="CancelButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"cancel_button" +metadata/exchanger_pet_surface_from_x = 110.0 +metadata/exchanger_pet_surface_to_x = 610.0 +metadata/exchanger_pet_surface_y = 940.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="HomeNavigationButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"home_navigation_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 101.0 +metadata/exchanger_pet_surface_y = 42.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(75) + +[node name="FloorToHomeNavigation" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_home_navigation" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"home_navigation_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 42.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToAccess" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_access" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"access_window" +metadata/exchanger_pet_climb_x = 60.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 152.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow1" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_1" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_1" +metadata/exchanger_pet_climb_x = 180.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 318.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow2" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_2" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_2" +metadata/exchanger_pet_climb_x = 180.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 442.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow3" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_3" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_3" +metadata/exchanger_pet_climb_x = 180.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 566.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToRow4" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_row_4" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"keypad_row_4" +metadata/exchanger_pet_climb_x = 180.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 690.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToEnter" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_enter" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"enter_button" +metadata/exchanger_pet_climb_x = 82.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 822.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToCancel" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_cancel" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"cancel_button" +metadata/exchanger_pet_climb_x = 110.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 940.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.home_navigation_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 42.0 +offset_right = 101.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("4_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="Header" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.header" +layout_mode = 0 +offset_left = 40.0 +offset_top = 18.0 +offset_right = 680.0 +offset_bottom = 72.0 +theme_type_variation = &"ScreenTitle" +theme_override_font_sizes/font_size = 30 +text = "ВХОД В НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.description" +layout_mode = 0 +offset_left = 52.0 +offset_top = 78.0 +offset_right = 668.0 +offset_bottom = 140.0 +theme_type_variation = &"ScreenDescription" +theme_override_font_sizes/font_size = 16 +text = "ВВЕДИТЕ PIN-КОД, ЧТОБЫ ОТКРЫТЬ НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="AccessPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 60.0 +offset_top = 152.0 +offset_right = 660.0 +offset_bottom = 916.0 +theme_type_variation = &"WhitePanel" + +[node name="Fields" type="VBoxContainer" parent="SafeMargin/Content/AccessPanel"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="PinLabel" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.pin_label" +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "PIN-КОД" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PinDisplay" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.pin_display" +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_type_variation = &"StatusText" +theme_override_font_sizes/font_size = 34 +text = "—" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Status" type="Label" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.status" +custom_minimum_size = Vector2(0, 38) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 17 +text = "ВВЕДИТЕ PIN-КОД" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="KeypadCenter" type="CenterContainer" parent="SafeMargin/Content/AccessPanel/Fields"] +custom_minimum_size = Vector2(0, 484) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Keypad" type="GridContainer" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter"] +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="Digit1" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit1" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "1" + +[node name="Digit2" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit2" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "2" + +[node name="Digit3" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit3" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "3" + +[node name="Digit4" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit4" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "4" + +[node name="Digit5" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit5" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "5" + +[node name="Digit6" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit6" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "6" + +[node name="Digit7" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit7" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "7" + +[node name="Digit8" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit8" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "8" + +[node name="Digit9" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit9" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "9" + +[node name="Clear" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.clear" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +theme_override_font_sizes/font_size = 16 +text = "СБРОС" + +[node name="Digit0" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.digit0" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "0" + +[node name="Erase" type="Button" parent="SafeMargin/Content/AccessPanel/Fields/KeypadCenter/Keypad"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.keypad.erase" +custom_minimum_size = Vector2(112, 112) +layout_mode = 2 +theme_type_variation = &"KeypadButton" +text = "⌫" + +[node name="EnterButton" type="Button" parent="SafeMargin/Content/AccessPanel/Fields"] +metadata/exchanger_binding_id = "service_access.content.access_panel.fields.enter_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 30 +text = "ВОЙТИ" + +[node name="CancelButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "service_access.content.cancel_button" +layout_mode = 0 +offset_left = 110.0 +offset_top = 940.0 +offset_right = 610.0 +offset_bottom = 1026.0 +theme_type_variation = &"CancelButton" +text = "ОТМЕНА" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("2_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scenes/screen_settings.tscn b/themes/space-pixel/package/scenes/screen_settings.tscn new file mode 100644 index 0000000..74a3919 --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_settings.tscn @@ -0,0 +1,3992 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/on_screen_keyboards.tscn" id="4_keyboards"] + +[node name="ThemeScreen_Settings" type="Control" unique_id=1004620256] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.settings" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="SafeMargin" type="MarginContainer" parent="." unique_id=1771276379] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 28.0 +offset_top = 28.0 +offset_right = -28.0 +offset_bottom = -28.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Scroll" type="ScrollContainer" parent="SafeMargin" unique_id=1730433592] +metadata/exchanger_binding_id = "settings.scroll" +custom_minimum_size = Vector2(0, 1100) +layout_mode = 2 +size_flags_vertical = 0 +horizontal_scroll_mode = 0 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll" unique_id=1670934776] +metadata/exchanger_binding_id = "settings.scroll.content" +custom_minimum_size = Vector2(0, 1173) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 19 + +[node name="Header" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=154820359] +metadata/exchanger_binding_id = "settings.scroll.content.header" +custom_minimum_size = Vector2(0, 107) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/Header" unique_id=2033082988] +layout_mode = 2 +theme_override_constants/margin_left = 24 +theme_override_constants/margin_top = 19 +theme_override_constants/margin_right = 24 +theme_override_constants/margin_bottom = 19 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/Header/Margin" unique_id=1892810197] +layout_mode = 2 +theme_override_constants/separation = 8 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/Header/Margin/Content" unique_id=1212756635] +metadata/exchanger_binding_id = "settings.scroll.content.header.margin.content.title" +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 31 +text = "НАСТРОЙКИ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SectionTabs" type="GridContainer" parent="SafeMargin/Scroll/Content" unique_id=1099846765] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs" +custom_minimum_size = Vector2(0, 157) +layout_mode = 2 +theme_override_constants/h_separation = 12 +theme_override_constants/v_separation = 12 +columns = 3 + +[node name="GeneralButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=390094413] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.general_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОБЩИЕ" + +[node name="AudioButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1209434198] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.audio_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ЗВУК" + +[node name="AdvertisementButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=931340907] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.advertisement_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ПРОМО" + +[node name="AppearanceButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1803958748] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.appearance_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ТЕМА" + +[node name="PricingButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=2043412965] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.pricing_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ТАРИФЫ" + +[node name="PaymentButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=750238068] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.payment_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОПЛАТА" + +[node name="ServiceButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs"] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.service_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "СЕРВИС" + +[node name="EquipmentButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=436932014] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.equipment_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ОБОРУД." + +[node name="DiagnosticsButton" type="Button" parent="SafeMargin/Scroll/Content/SectionTabs" unique_id=1314343470] +metadata/exchanger_binding_id = "settings.scroll.content.section_tabs.diagnostics_button" +visible = false +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "ДИАГНОСТ." + +[node name="BrandingPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2078006035] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel" +custom_minimum_size = Vector2(0, 439) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BrandingPanel" unique_id=1084754695] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin" unique_id=288780598] +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1441920640] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕКСТ НА ГЛАВНОМ ЭКРАНЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=314471939] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Здесь можно изменить свой текст для покупателей и контакты техподдержки." +autowrap_mode = 2 + +[node name="ApplicationNameLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1972340592] +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "НАЗВАНИЕ • ДО 48 ЗНАКОВ" + +[node name="ApplicationName" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=923442286] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.application_name" +visible = false +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "РАЗМЕН ЖЕТОНОВ" +max_length = 48 + +[node name="ApplicationNameError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=172647480] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.application_name_error" +visible = false +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="ShortTextLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ" + +[node name="ShortText" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.short_text" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "ТЕКСТ КЛИЕНТА" +max_length = 48 + +[node name="ShortTextError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.short_text_error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="SupportPhoneLabel" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1058802895] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ТЕЛЕФОН ПОДДЕРЖКИ • ДО 80 ЗНАКОВ" + +[node name="SupportPhone" type="LineEdit" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=1224448315] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.support_phone" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "+7 (000) 000-00-00" +max_length = 80 + +[node name="SupportPhoneError" type="Label" parent="SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" unique_id=939950598] +metadata/exchanger_binding_id = "settings.scroll.content.branding_panel.margin.content.support_phone_error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AnimatedBannerTextsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.animated_banner_texts_panel" +custom_minimum_size = Vector2(0, 560) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 42) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕКСТЫ НА БАННЕРАХ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Тексты отображаются на нижних анимированных плашках с НЛО. В шаблоне таймера используйте {seconds} для числа секунд." +autowrap_mode = 2 + +[node name="CashPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "НАЛИЧНЫЕ • ТЕКСТ НА БАННЕРЕ" + +[node name="CashPayment" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardAmountLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ВЫБОР СУММЫ" + +[node name="CardAmount" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardCustomAmountLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ВВОД СУММЫ" + +[node name="CardCustomAmount" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="CardTerminalCountdownLabel" type="Label" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "КАРТА • ТАЙМЕР • {seconds} = СЕКУНДЫ" + +[node name="CardTerminalCountdown" type="LineEdit" parent="SafeMargin/Scroll/Content/AnimatedBannerTextsPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +max_length = 120 + +[node name="BrandingPreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=378115165] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel" +visible = false +custom_minimum_size = Vector2(0, 273) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel" unique_id=253672003] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin" unique_id=1113826782] +layout_mode = 2 +theme_override_constants/separation = 12 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=160381550] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "КАК ЭТО УВИДИТ ПОКУПАТЕЛЬ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ApplicationName" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=808413130] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.application_name" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "РАЗМЕН ЖЕТОНОВ" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="ShortText" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.short_text" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ТЕКСТ КЛИЕНТА" +horizontal_alignment = 1 +autowrap_mode = 2 +clip_text = true +max_lines_visible = 3 + +[node name="SupportPhone" type="Label" parent="SafeMargin/Scroll/Content/BrandingPreviewPanel/Margin/Content" unique_id=85872323] +metadata/exchanger_binding_id = "settings.scroll.content.branding_preview_panel.margin.content.support_phone" +visible = false +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ТЕХПОДДЕРЖКА • Телефон поддержки уточняется" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="SecurityPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1879849850] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel" +custom_minimum_size = Vector2(0, 313) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/SecurityPanel" unique_id=962456073] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin" unique_id=607567481] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=830468842] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЗАЩИТА НАСТРОЕК" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=1393678109] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Включите защиту, если хотите открывать настройки только по PIN-коду. Приложение предложит придумать его при следующем входе." +autowrap_mode = 2 + +[node name="Enabled" type="CheckButton" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=558474112] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.enabled" +custom_minimum_size = Vector2(0, 55) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ЗАЩИТИТЬ НАСТРОЙКИ PIN-КОДОМ" + +[node name="ResetPinButton" type="Button" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=1063988680] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.reset_pin_button" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ПРИДУМАТЬ НОВЫЙ PIN" + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/SecurityPanel/Margin/Content" unique_id=419034981] +metadata/exchanger_binding_id = "settings.scroll.content.security_panel.margin.content.status" +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Защита выключена." +autowrap_mode = 2 + +[node name="MasterPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1198367056] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel" +custom_minimum_size = Vector2(0, 273) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/MasterPanel" unique_id=1657463854] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/MasterPanel/Margin" unique_id=1222038005] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=2077123349] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ОБЩАЯ ГРОМКОСТЬ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=1560394233] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Громкость всех звуков автомата." +autowrap_mode = 2 + +[node name="VolumeRow" type="HBoxContainer" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=150712937] +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Slider" type="HSlider" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow" unique_id=2060895330] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.volume_row.slider" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +size_flags_horizontal = 3 +value = 100.0 + +[node name="Value" type="Label" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content/VolumeRow" unique_id=2057703712] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.volume_row.value" +custom_minimum_size = Vector2(87, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Mute" type="CheckButton" parent="SafeMargin/Scroll/Content/MasterPanel/Margin/Content" unique_id=1848500350] +metadata/exchanger_binding_id = "settings.scroll.content.master_panel.margin.content.mute" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ОТКЛЮЧИТЬ ВСЕ ЗВУКИ" + +[node name="AdvertisementPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1140295799] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel" +custom_minimum_size = Vector2(0, 220) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel" unique_id=746826493] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin" unique_id=652964597] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=912048069] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ГРОМКОСТЬ ПРОМО-РОЛИКА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=1736411184] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Громкость звука в промо-роликах." +autowrap_mode = 2 + +[node name="VolumeRow" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content" unique_id=405566535] +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Slider" type="HSlider" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow" unique_id=530125674] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel.margin.content.volume_row.slider" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +size_flags_horizontal = 3 +value = 100.0 + +[node name="Value" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPanel/Margin/Content/VolumeRow" unique_id=2101989997] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_panel.margin.content.volume_row.value" +custom_minimum_size = Vector2(87, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "100%" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="TestPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1383634412] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel" +custom_minimum_size = Vector2(0, 207) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/TestPanel" unique_id=130409172] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/TestPanel/Margin" unique_id=1257657298] +layout_mode = 2 +theme_override_constants/separation = 15 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=1433324321] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОВЕРКА" +vertical_alignment = 1 + +[node name="TestSoundButton" type="Button" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=1609783017] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel.margin.content.test_sound_button" +custom_minimum_size = Vector2(0, 75) +layout_mode = 2 +text = "ПРОВЕРИТЬ ЗВУК" + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/TestPanel/Margin/Content" unique_id=2061523529] +metadata/exchanger_binding_id = "settings.scroll.content.test_panel.margin.content.status" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Настройки сохраняются автоматически." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="AdvertisementSettingsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=21455015] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel" +custom_minimum_size = Vector2(0, 440) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel" unique_id=1405250504] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin" unique_id=1013830763] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1786577231] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОМО НА ГЛАВНОМ ЭКРАНЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=336744550] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Во время оплаты и выдачи жетонов промо скрывается." +autowrap_mode = 2 + +[node name="Enabled" type="CheckButton" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1616831303] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПОКАЗЫВАТЬ ПРОМО" + +[node name="Muted" type="CheckButton" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=672717699] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.muted" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПРОМО-РОЛИК БЕЗ ЗВУКА" + +[node name="FallbackLabel" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1641720039] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ТЕКСТ ВМЕСТО ПРОМО • ДО 120 ЗНАКОВ" + +[node name="FallbackText" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=228850090] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_text" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +placeholder_text = "ПРОМО-БЛОК" +max_length = 120 + +[node name="FallbackError" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementSettingsPanel/Margin/Content" unique_id=1143025908] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_settings_panel.margin.content.fallback_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPosterPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=455807788] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel" +custom_minimum_size = Vector2(0, 370) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel" unique_id=1508974411] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin" unique_id=245064043] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=816209396] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "КАРТИНКА ВМЕСТО ПРОМО-РОЛИКА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=1218265445] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Укажите путь к картинке на этом компьютере. Подойдут PNG, JPG и WEBP." +autowrap_mode = 2 + +[node name="PosterPath" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=732541286] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.poster_path" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +placeholder_text = "Например: D:/Промо/постер.png" +max_length = 512 + +[node name="SelectButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.select_button" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ВЫБРАТЬ КАРТИНКУ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPosterPanel/Margin/Content" unique_id=2129938351] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_poster_panel.margin.content.error" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPlaylistPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1828835854] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel" +custom_minimum_size = Vector2(0, 287) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel" unique_id=1696350498] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin" unique_id=50006063] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=483709700] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРОМО-РОЛИКИ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1727337488] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Добавьте до 12 промо-роликов в нужном порядке. Поддерживаются файлы OGV." +autowrap_mode = 2 + +[node name="Rows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1297952818] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(1, 1, 1, 1) +text = "Промо-ролики пока не добавлены. Будет показана картинка или текст вместо промо." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_00.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_01.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_02.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_03.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_04.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_05.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_06.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_07.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_08.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_09.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_10.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Path" type="LineEdit" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.path" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 23 +placeholder_text = "user://advertisement/video.ogv" +max_length = 260 + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_11.error" +custom_minimum_size = Vector2(0, 28) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddButton" type="Button" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1496917419] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.add_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ВЫБРАТЬ И ДОБАВИТЬ ПРОМО-РОЛИК" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content" unique_id=1649782226] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_playlist_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="AdvertisementPreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=193189850] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_preview_panel" +visible = false +custom_minimum_size = Vector2(0, 167) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel" unique_id=923292165] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 20 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin" unique_id=617595689] +layout_mode = 2 +theme_override_constants/separation = 11 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content" unique_id=572843131] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "ПРЕДВАРИТЕЛЬНЫЙ ИТОГ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Summary" type="Label" parent="SafeMargin/Scroll/Content/AdvertisementPreviewPanel/Margin/Content" unique_id=1780700717] +metadata/exchanger_binding_id = "settings.scroll.content.advertisement_preview_panel.margin.content.summary" +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Промо включено • картинка не выбрана • промо-роликов: 0 +Текст вместо промо: ПРОМО-БЛОК" +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="AppearanceThemePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1626819618] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel" +visible = false +custom_minimum_size = Vector2(0, 460) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceThemePanel" unique_id=1429095905] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin" unique_id=1782922611] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1789600456] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ВНЕШНЯЯ ТЕМА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1804153132] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Приложение всегда имеет одну встроенную тему. Единственный внешний DLC полностью заменит её после перезапуска, если пакет пройдёт проверку." +autowrap_mode = 2 + +[node name="ExternalEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1434776624] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.external_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ИСПОЛЬЗОВАТЬ ВНЕШНИЙ DLC" + +[node name="PathLabel" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1039205902] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "ПУТЬ К ПАКЕТУ .PCK" + +[node name="ExternalPath" type="LineEdit" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=435170720] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.external_path" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +placeholder_text = "user://theme_dlc/active_theme.pck" +max_length = 512 + +[node name="PathError" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=538466093] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.path_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 13 +autowrap_mode = 2 + +[node name="PackageStatus" type="Label" parent="SafeMargin/Scroll/Content/AppearanceThemePanel/Margin/Content" unique_id=1243517659] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_theme_panel.margin.content.package_status" +custom_minimum_size = Vector2(0, 52) +layout_mode = 2 +theme_override_font_sizes/font_size = 14 +text = "Пакет будет проверен при запуске." +autowrap_mode = 2 + +[node name="AppearanceEffectsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2118148985] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_effects_panel" +visible = false +custom_minimum_size = Vector2(0, 260) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel" unique_id=1463853577] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin" unique_id=460821403] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=1219490666] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЭФФЕКТЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=1195218204] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Облегчённый режим отключает необязательные анимированные спрайты, но сохраняет статический фон и весь интерфейс." +autowrap_mode = 2 + +[node name="ReducedEffects" type="CheckButton" parent="SafeMargin/Scroll/Content/AppearanceEffectsPanel/Margin/Content" unique_id=336415120] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_effects_panel.margin.content.reduced_effects" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ОБЛЕГЧЁННЫЙ РЕЖИМ" + +[node name="AppearanceNoticePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=391044970] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_notice_panel" +visible = false +custom_minimum_size = Vector2(0, 220) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel" unique_id=716854481] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 20 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin" unique_id=400003096] +layout_mode = 2 +theme_override_constants/separation = 12 +alignment = 1 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=1138899540] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 19 +text = "ПРИМЕНЕНИЕ ИЗМЕНЕНИЙ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Immediate" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=263463990] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Облегчённый режим применяется сразу." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="Restart" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=1044968640] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.78, 0.25, 1) +theme_override_font_sizes/font_size = 15 +text = "Включение DLC и путь к нему применятся только после перезапуска приложения." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="CurrentTheme" type="Label" parent="SafeMargin/Scroll/Content/AppearanceNoticePanel/Margin/Content" unique_id=869113996] +metadata/exchanger_binding_id = "settings.scroll.content.appearance_notice_panel.margin.content.current_theme" +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Сейчас активна встроенная тема." +horizontal_alignment = 1 +autowrap_mode = 2 + +[node name="PricePanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1175190762] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel" +visible = false +custom_minimum_size = Vector2(0, 247) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PricePanel" unique_id=1252255186] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PricePanel/Margin" unique_id=37103992] +layout_mode = 2 +theme_override_constants/separation = 13 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=1223521084] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СТОИМОСТЬ ОДНОГО ЖЕТОНА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=442890264] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "По этой цене автомат рассчитывает, сколько жетонов получит покупатель." +autowrap_mode = 2 + +[node name="Price" type="SpinBox" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=906569844] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel.margin.content.price" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +max_value = 100000.0 +value = 10.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/PricePanel/Margin/Content" unique_id=1786171896] +metadata/exchanger_binding_id = "settings.scroll.content.price_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="BonusPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1271515153] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel" +visible = false +custom_minimum_size = Vector2(0, 347) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/BonusPanel" unique_id=1639657177] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin" unique_id=452757233] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=176636309] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ДОПОЛНИТЕЛЬНЫЕ ЖЕТОНЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=2054989766] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Например: при оплате от 500 ₽ подарить 5 жетонов. Если подходят несколько правил, сработает самое выгодное." +autowrap_mode = 2 + +[node name="ColumnHeaders" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1779316545] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +theme_override_constants/separation = 11 + +[node name="Threshold" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=1516500981] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 13 +text = "СУММА ОПЛАТЫ ОТ" + +[node name="Bonus" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=730440012] +custom_minimum_size = Vector2(160, 0) +layout_mode = 2 +theme_override_font_sizes/font_size = 13 +text = "ЖЕТОНОВ В ПОДАРОК" + +[node name="Spacer" type="Control" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/ColumnHeaders" unique_id=293311810] +custom_minimum_size = Vector2(103, 0) +layout_mode = 2 + +[node name="Rows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1591524546] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows" +layout_mode = 2 +theme_override_constants/separation = 9 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.empty_state" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +text = "Бонусы пока не настроены." +vertical_alignment = 1 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_00.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_01.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_02.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_03.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_04.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_05.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_06.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_07.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_08.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_09.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_10.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_11.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot12" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot12"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_12.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot13" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot13"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_13.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot14" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot14"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_14.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot15" type="VBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Threshold" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.threshold" +custom_minimum_size = Vector2(200, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="Arrow" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +custom_minimum_size = Vector2(32, 67) +layout_mode = 2 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 28 +text = "→" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Bonus" type="SpinBox" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.bonus" +custom_minimum_size = Vector2(160, 67) +layout_mode = 2 +max_value = 100000.0 +step = 1.0 +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.remove_button" +custom_minimum_size = Vector2(103, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot15"] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_15.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddRuleButton" type="Button" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=1425772859] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.add_rule_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +text = "+ ДОБАВИТЬ БОНУС" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/BonusPanel/Margin/Content" unique_id=397393203] +metadata/exchanger_binding_id = "settings.scroll.content.bonus_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="PreviewPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1550161471] +metadata/exchanger_binding_id = "settings.scroll.content.preview_panel" +visible = false +custom_minimum_size = Vector2(0, 247) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PreviewPanel" unique_id=1017412349] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin" unique_id=1259875287] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1565228186] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПРИМЕР РАСЧЁТА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1558111681] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Столько жетонов получит покупатель при разных суммах оплаты." +autowrap_mode = 2 + +[node name="Values" type="Label" parent="SafeMargin/Scroll/Content/PreviewPanel/Margin/Content" unique_id=1890400642] +metadata/exchanger_binding_id = "settings.scroll.content.preview_panel.margin.content.values" +custom_minimum_size = Vector2(0, 140) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "10 ₽ → 1 + 0 = 1 жет." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="PaymentMethodsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1014677861] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel" +visible = false +custom_minimum_size = Vector2(0, 260) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel" unique_id=1681526059] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin" unique_id=1821598693] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=1268252060] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СПОСОБЫ ОПЛАТЫ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=71570643] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Оставьте хотя бы один доступный способ оплаты." +autowrap_mode = 2 + +[node name="CashEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=1651424955] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.cash_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "НАЛИЧНАЯ ОПЛАТА" + +[node name="CardEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=60921604] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.card_enabled" +custom_minimum_size = Vector2(0, 61) +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "ОПЛАТА КАРТОЙ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/PaymentMethodsPanel/Margin/Content" unique_id=614267083] +metadata/exchanger_binding_id = "settings.scroll.content.payment_methods_panel.margin.content.error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="CardOptionsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1947991433] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel" +visible = false +custom_minimum_size = Vector2(0, 393) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel" unique_id=1880854225] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin" unique_id=1861346620] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1252395405] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СУММЫ ДЛЯ ОПЛАТЫ КАРТОЙ" +vertical_alignment = 1 + +[node name="Limits" type="GridContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=796782793] +layout_mode = 2 +theme_override_constants/h_separation = 13 +theme_override_constants/v_separation = 9 +columns = 2 + +[node name="MaxLabel" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=1157864144] +custom_minimum_size = Vector2(240, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "МАКСИМАЛЬНАЯ СУММА" +vertical_alignment = 1 + +[node name="MaxAmount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=945870327] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits.max_amount" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +value = 5000.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="StepLabel" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=117453909] +custom_minimum_size = Vector2(240, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ШАГ ВЫБОРА СУММЫ" +vertical_alignment = 1 + +[node name="CustomStep" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/Limits" unique_id=2056772758] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits.custom_step" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +value = 10.0 +update_on_text_changed = true +suffix = " ₽" + +[node name="LimitsError" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1784116878] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.limits_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="PresetsTitle" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=3400869] +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "ГОТОВЫЕ СУММЫ" + +[node name="PresetRows" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=783857380] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows" +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="EmptyState" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state" +visible = false +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_type_variation = &"PanelText" +text = "Готовые суммы пока не добавлены. Покупатель сможет ввести сумму сам." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Slot00" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 10.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot00"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_00.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot01" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 50.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot01"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_01.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot02" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 100.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot02"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_02.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot03" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 150.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot03"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_03.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot04" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 200.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot04"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_04.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot05" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 300.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot05"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_05.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot06" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 400.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot06"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_06.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot07" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07" +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 500.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot07"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_07.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot08" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot08"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_08.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot09" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot09"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_09.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot10" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot10"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_10.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot11" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot11"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_11.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot12" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot12"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_12.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot13" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot13"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_13.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot14" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot14"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_14.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + +[node name="Slot15" type="VBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15" +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 4 + +[node name="Row" type="HBoxContainer" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15"] +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 16 + +[node name="Amount" type="SpinBox" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.amount" +custom_minimum_size = Vector2(0, 67) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 1000000.0 +step = 1.0 +value = 0.0 +suffix = " ₽" +update_on_text_changed = true + +[node name="RemoveButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15/Row"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.remove_button" +custom_minimum_size = Vector2(127, 67) +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "УДАЛИТЬ" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot15"] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_15.error" +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_type_variation = &"ErrorText" +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 20 +autowrap_mode = 2 + + +[node name="AddPresetButton" type="Button" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1011694991] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.add_preset_button" +custom_minimum_size = Vector2(0, 70) +layout_mode = 2 +text = "+ ДОБАВИТЬ СУММУ" + +[node name="PresetsError" type="Label" parent="SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content" unique_id=1336764151] +metadata/exchanger_binding_id = "settings.scroll.content.card_options_panel.margin.content.presets_error" +custom_minimum_size = Vector2(0, 35) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="TimeoutsPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=225381422] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel" +visible = false +custom_minimum_size = Vector2(0, 380) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel" unique_id=1678816813] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin" unique_id=2108046571] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=423508686] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ВРЕМЯ ОЖИДАНИЯ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=844982832] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Настройте, сколько времени автомат ждёт действий покупателя." +autowrap_mode = 2 + +[node name="Grid" type="GridContainer" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=987524088] +layout_mode = 2 +theme_override_constants/h_separation = 13 +theme_override_constants/v_separation = 9 +columns = 2 + +[node name="IdleLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1311503414] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ВОЗВРАТ НА ГЛАВНЫЙ (15–600 С)" +vertical_alignment = 1 + +[node name="Idle" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=396087782] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.idle" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 45.0 +update_on_text_changed = true +suffix = " с" + +[node name="CashPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=254111291] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ОПЛАТА НАЛИЧНЫМИ (15–600 С)" +vertical_alignment = 1 + +[node name="CashPayment" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=800168430] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.cash_payment" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 45.0 +update_on_text_changed = true +suffix = " с" + +[node name="CashlessPaymentLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid"] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "БЕЗНАЛИЧНАЯ ОПЛАТА (30–600 С)" +vertical_alignment = 1 + +[node name="CashlessPayment" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid"] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.cashless_payment" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 600.0 +value = 120.0 +update_on_text_changed = true +suffix = " с" + +[node name="SuccessLabel" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1606719904] +custom_minimum_size = Vector2(273, 63) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "ПОКАЗЫВАТЬ РЕЗУЛЬТАТ (3–60 С)" +vertical_alignment = 1 + +[node name="Success" type="SpinBox" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content/Grid" unique_id=1946483701] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.grid.success" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 60.0 +value = 10.0 +update_on_text_changed = true +suffix = " с" + +[node name="Error" type="Label" parent="SafeMargin/Scroll/Content/TimeoutsPanel/Margin/Content" unique_id=53635746] +metadata/exchanger_binding_id = "settings.scroll.content.timeouts_panel.margin.content.error" +custom_minimum_size = Vector2(0, 53) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="EquipmentConnectionPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=12227059] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel" +visible = false +custom_minimum_size = Vector2(0, 607) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel" unique_id=1058768579] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin" unique_id=1950970524] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=608936661] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ПОДКЛЮЧЕНИЕ К КОНТРОЛЛЕРУ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=735739671] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Только для инженера. Изменения применяются после перезапуска и никогда не выполняют reconnect во время открытой операции." +autowrap_mode = 2 + +[node name="UseMock" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1144904040] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.use_mock" +custom_minimum_size = Vector2(0, 63) +layout_mode = 2 +text = "ИСПОЛЬЗОВАТЬ ИМИТАЦИЮ ОБОРУДОВАНИЯ" + +[node name="PortLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1595492564] +layout_mode = 2 +text = "COM-ПОРТ" + +[node name="PortName" type="LineEdit" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1760832797] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.port_name" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +placeholder_text = "COM3" +max_length = 16 + +[node name="PortError" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=993828178] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.port_error" +custom_minimum_size = Vector2(0, 37) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="BaudLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1392931961] +layout_mode = 2 +text = "СКОРОСТЬ ПОРТА" + +[node name="BaudRate" type="OptionButton" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=810177550] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.baud_rate" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="ReconnectLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=1591920916] +layout_mode = 2 +text = "ПОВТОР ПОДКЛЮЧЕНИЯ (1–60 С)" + +[node name="ReconnectSeconds" type="SpinBox" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=175154894] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.reconnect_seconds" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +max_value = 60.0 +value = 5.0 +update_on_text_changed = true +suffix = " с" + +[node name="ConnectionError" type="Label" parent="SafeMargin/Scroll/Content/EquipmentConnectionPanel/Margin/Content" unique_id=242906874] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_connection_panel.margin.content.connection_error" +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="EquipmentWindowPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=1569238897] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel" +visible = false +custom_minimum_size = Vector2(0, 433) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel" unique_id=1468236776] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin" unique_id=660658614] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1729915087] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ОКНО И ПРОИЗВОДИТЕЛЬНОСТЬ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1381667443] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Инженерные restart-only параметры. Размер debug-окна и низкоуровневые параметры протокола намеренно не редактируются здесь." +autowrap_mode = 2 + +[node name="Fullscreen" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=859230815] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.fullscreen" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "ПОЛНОЭКРАННЫЙ РЕЖИМ" + +[node name="Borderless" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=445076357] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.borderless" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "ОКНО БЕЗ РАМКИ" + +[node name="DebugWindow" type="CheckButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1119698600] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.debug_window" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +text = "DEBUG-СБОРКА ЗАПУСКАЕТСЯ В ОКНЕ" + +[node name="FpsLabel" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=67242259] +layout_mode = 2 +text = "ЦЕЛЕВОЙ FPS" + +[node name="TargetFps" type="OptionButton" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=48472713] +metadata/exchanger_binding_id = "settings.scroll.content.equipment_window_panel.margin.content.target_fps" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="EquipmentNotice" type="Label" parent="SafeMargin/Scroll/Content/EquipmentWindowPanel/Margin/Content" unique_id=1717442777] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.72, 0.2, 1) +theme_override_font_sizes/font_size = 15 +text = "AES-ключ, режим шифрования, команды выдачи, framing и параметры датчика не показываются и не сохраняются через этот экран." +autowrap_mode = 2 + +[node name="DiagnosticsStatusPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=63855322] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel" +visible = false +custom_minimum_size = Vector2(0, 400) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel" unique_id=363101112] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin" unique_id=1447109247] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1149194245] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СОСТОЯНИЕ ПРИЛОЖЕНИЯ" +vertical_alignment = 1 + +[node name="RuntimeSummary" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1086182449] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel.margin.content.runtime_summary" +custom_minimum_size = Vector2(0, 120) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Версия и состояние загружаются при открытии." +autowrap_mode = 2 + +[node name="RecentErrorsTitle" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=1121096725] +layout_mode = 2 +text = "ПОСЛЕДНИЕ БЕЗОПАСНЫЕ ПРЕДУПРЕЖДЕНИЯ" + +[node name="RecentErrors" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsStatusPanel/Margin/Content" unique_id=601475052] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_status_panel.margin.content.recent_errors" +custom_minimum_size = Vector2(0, 147) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Нет предупреждений." +autowrap_mode = 2 + +[node name="DiagnosticsLoggingPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=246114907] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel" +visible = false +custom_minimum_size = Vector2(0, 467) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel" unique_id=618088528] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin" unique_id=1603972519] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=728718139] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ЖУРНАЛИРОВАНИЕ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1279998568] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Изменения применяются сразу. Общий объём архивов автоматически ограничен десятью максимальными файлами. Сырые кадры протокола недоступны." +autowrap_mode = 2 + +[node name="LevelLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1684427359] +layout_mode = 2 +text = "МИНИМАЛЬНЫЙ УРОВЕНЬ" + +[node name="MinimumLevel" type="OptionButton" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1516855564] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.minimum_level" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 + +[node name="SizeLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1036811316] +layout_mode = 2 +text = "МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛА (1–100 МБ)" + +[node name="MaxFileSize" type="SpinBox" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=379652985] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.max_file_size" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +value = 5.0 +update_on_text_changed = true +suffix = " МБ" + +[node name="RetentionLabel" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1113473421] +layout_mode = 2 +text = "СРОК ХРАНЕНИЯ (1–365 ДНЕЙ)" + +[node name="RetentionDays" type="SpinBox" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=1996036056] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.retention_days" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +min_value = 1.0 +max_value = 365.0 +value = 14.0 +update_on_text_changed = true +suffix = " дн." + +[node name="LoggingError" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsLoggingPanel/Margin/Content" unique_id=722071223] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_logging_panel.margin.content.logging_error" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 0.4, 0.35, 1) +theme_override_font_sizes/font_size = 15 +autowrap_mode = 2 + +[node name="ServiceInventoryPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel" +visible = false +custom_minimum_size = Vector2(0, 772) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "УЧЁТ ЖЕТОНОВ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.description" +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Здесь можно пересчитать жетоны в хоппере или добавить уже пересчитанные вручную." +autowrap_mode = 2 + +[node name="InventoryAccountingEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ" + +[node name="PurchaseLimitEnabled" type="CheckButton" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА" + +[node name="Count" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.count" +custom_minimum_size = Vector2(0, 68) +layout_mode = 2 +theme_override_font_sizes/font_size = 25 +text = "УЧТЁННЫЙ ОСТАТОК: 0 ЖЕТОНОВ" +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Hopper1Label" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label" +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "ХОППЕР 1 — ОСТАТОК: 0 ЖЕТОНОВ" + +[node name="Hopper1" type="HBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +layout_mode = 2 +theme_override_constants/separation = 14 + +[node name="RecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1.recount_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ПЕРЕСЧИТАТЬ" + +[node name="ManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper1"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper1.manual_add_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ДОБАВИТЬ" + +[node name="Hopper2Label" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label" +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "ХОППЕР 2 — ОСТАТОК: 0 ЖЕТОНОВ" + +[node name="Hopper2" type="HBoxContainer" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +layout_mode = 2 +theme_override_constants/separation = 14 + +[node name="RecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2.recount_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ПЕРЕСЧИТАТЬ" + +[node name="ManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Hopper2"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.hopper2.manual_add_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +size_flags_horizontal = 3 +text = "ДОБАВИТЬ" + +[node name="LegacyRecountButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +visible = false +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.recount_button" +layout_mode = 2 + +[node name="LegacyManualAddButton" type="Button" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +visible = false +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button" +layout_mode = 2 + +[node name="Status" type="Label" parent="SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.service_inventory_panel.margin.content.status" +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Остаток ещё не заполнен." +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="MenuVisibilityPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel" +visible = false +custom_minimum_size = Vector2(0, 360) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "СКРЫТИЕ ЭЛЕМЕНТОВ МЕНЮ" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Выберите, какие необязательные элементы показывать на главном экране." +autowrap_mode = 2 + +[node name="ShowStockStatus" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ОСТАТОК ЖЕТОНОВ" + +[node name="ShowRightCharacter" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ ТЕКСТ" + +[node name="ShowPromotionBlock" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ПОКАЗЫВАТЬ ПРОМО-БЛОК" + +[node name="ShowInteractivePet" type="CheckButton" parent="SafeMargin/Scroll/Content/MenuVisibilityPanel/Margin/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet" +custom_minimum_size = Vector2(0, 60) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +button_pressed = true +text = "ИНТЕРАКТИВНЫЙ ПИТОМЕЦ" + +[node name="DiagnosticsTestPanel" type="PanelContainer" parent="SafeMargin/Scroll/Content" unique_id=2121165678] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel" +visible = false +custom_minimum_size = Vector2(0, 287) +layout_mode = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel" unique_id=1592965841] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 23 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 23 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin" unique_id=1036673328] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=1717665009] +custom_minimum_size = Vector2(0, 46) +layout_mode = 2 +theme_override_font_sizes/font_size = 23 +text = "ТЕСТОВАЯ ВЫДАЧА" +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=537707851] +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Выдаёт один жетон без оплаты. Требует готового контроллера и повторного подтверждения кнопкой." +autowrap_mode = 2 + +[node name="TestDispenseButton" type="Button" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=263785982] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_button" +custom_minimum_size = Vector2(0, 73) +layout_mode = 2 +text = "ТЕСТ: ВЫДАТЬ 1 ЖЕТОН" + +[node name="TestDispenseStatus" type="Label" parent="SafeMargin/Scroll/Content/DiagnosticsTestPanel/Margin/Content" unique_id=2115719528] +metadata/exchanger_binding_id = "settings.scroll.content.diagnostics_test_panel.margin.content.test_dispense_status" +custom_minimum_size = Vector2(0, 47) +layout_mode = 2 +theme_override_font_sizes/font_size = 15 +text = "Тест не запущен." +autowrap_mode = 2 + +[node name="FooterClearance" type="Control" parent="SafeMargin/Scroll/Content"] +metadata/exchanger_binding_id = "settings.scroll.content.footer_clearance" +custom_minimum_size = Vector2(0, 124) +layout_mode = 2 +mouse_filter = 2 + +[node name="ServiceDialogOverlay" type="ColorRect" parent="SafeMargin"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay" +visible = false +z_index = 20 +layout_mode = 2 +mouse_filter = 0 +color = Color(0, 0, 0, 0.72) + +[node name="Dialog" type="PanelContainer" parent="SafeMargin/ServiceDialogOverlay"] +custom_minimum_size = Vector2(600, 460) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -300.0 +offset_top = -230.0 +offset_right = 300.0 +offset_bottom = 230.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Margin" type="MarginContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog"] +layout_mode = 2 +theme_override_constants/margin_left = 28 +theme_override_constants/margin_top = 28 +theme_override_constants/margin_right = 28 +theme_override_constants/margin_bottom = 28 + +[node name="Content" type="VBoxContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="Title" type="Label" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.title" +custom_minimum_size = Vector2(0, 58) +layout_mode = 2 +theme_override_font_sizes/font_size = 27 +text = "ДОБАВИТЬ ЖЕТОНЫ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Description" type="Label" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.description" +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +theme_override_font_sizes/font_size = 17 +text = "Введите количество жетонов. Перед добавлением приложение попросит подтвердить число." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="Amount" type="SpinBox" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.amount" +custom_minimum_size = Vector2(0, 72) +layout_mode = 2 +max_value = 999999.0 +update_on_text_changed = true + +[node name="Buttons" type="HBoxContainer" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content"] +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="CancelButton" type="Button" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"CancelButton" +theme_override_font_sizes/font_size = 17 +text = "ОТМЕНА" + +[node name="ConfirmButton" type="Button" parent="SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons"] +metadata/exchanger_binding_id = "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button" +custom_minimum_size = Vector2(0, 76) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 17 +text = "ПОДТВЕРДИТЬ" + +[node name="Footer" type="PanelContainer" parent="."] +metadata/exchanger_binding_id = "settings.footer" +z_index = 5 +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 28.0 +offset_top = -132.0 +offset_right = -28.0 +offset_bottom = -28.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_type_variation = &"FooterPanel" + +[node name="SaveAndExitButton" type="Button" parent="Footer"] +metadata/exchanger_binding_id = "settings.footer.save_and_exit_button" +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 14.0 +offset_top = 10.0 +offset_right = -14.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"PrimaryButton" +theme_override_font_sizes/font_size = 25 +text = "СОХРАНИТЬ И ВЫЙТИ" + +[node name="OnScreenKeyboardOverlay" parent="." instance=ExtResource("4_keyboards")] diff --git a/themes/space-pixel/package/scenes/screen_success.tscn b/themes/space-pixel/package/scenes/screen_success.tscn new file mode 100644 index 0000000..3c533e0 --- /dev/null +++ b/themes/space-pixel/package/scenes/screen_success.tscn @@ -0,0 +1,210 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Theme" path="../ui_theme.tres" id="1_screen_theme"] +[ext_resource type="Texture2D" path="../assets/background/background.png" id="2_screen_background"] +[ext_resource type="PackedScene" path="../background_decoration.tscn" id="3_screen_decoration"] +[ext_resource type="PackedScene" path="../components/footer.tscn" id="3_footer"] +[ext_resource type="PackedScene" path="../visuals/result_success.tscn" id="4_result_visual"] +[ext_resource type="Texture2D" path="../assets/ui/interactive_pet/home.png" id="5_home_icon"] + +[node name="ThemeScreen_Success" type="Control"] +texture_filter = 1 +metadata/exchanger_screen_binding_id = "screen.success" +metadata/exchanger_self_contained_visuals = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_screen_theme") + +[node name="ThemeBackground" type="TextureRect" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("2_screen_background") +expand_mode = 1 +stretch_mode = 6 + +[node name="BackgroundDecoration" parent="." instance=ExtResource("3_screen_decoration")] +scale = Vector2(0.666667, 0.666667) + +[node name="PetNavigation" type="Node2D" parent="."] +metadata/exchanger_pet_navigation_root = true +metadata/exchanger_pet_navigation_version = 1 +metadata/exchanger_pet_default_surface_id = &"floor" +metadata/exchanger_pet_roaming_bounds = Rect2(32, 32, 656, 1208) + +[node name="Floor" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"floor" +metadata/exchanger_pet_surface_from_x = 40.0 +metadata/exchanger_pet_surface_to_x = 680.0 +metadata/exchanger_pet_surface_y = 1240.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(96, 360, 624) + +[node name="ResultWindow" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"result_window" +metadata/exchanger_pet_surface_from_x = 96.0 +metadata/exchanger_pet_surface_to_x = 624.0 +metadata/exchanger_pet_surface_y = 176.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="HomeButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"home_button" +metadata/exchanger_pet_surface_from_x = 84.0 +metadata/exchanger_pet_surface_to_x = 636.0 +metadata/exchanger_pet_surface_y = 862.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(360) + +[node name="HomeNavigationButton" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_surface = true +metadata/exchanger_pet_surface_id = &"home_navigation_button" +metadata/exchanger_pet_surface_from_x = 49.0 +metadata/exchanger_pet_surface_to_x = 101.0 +metadata/exchanger_pet_surface_y = 42.0 +metadata/exchanger_pet_surface_sit_points = PackedFloat32Array(75) + +[node name="FloorToHomeNavigation" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_home_navigation" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"home_navigation_button" +metadata/exchanger_pet_climb_x = 49.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 42.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToResult" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_result" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"result_window" +metadata/exchanger_pet_climb_x = 96.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 176.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="FloorToHome" type="Node2D" parent="PetNavigation"] +metadata/exchanger_pet_climb_edge = true +metadata/exchanger_pet_climb_edge_id = &"floor_to_home" +metadata/exchanger_pet_climb_from_surface_id = &"floor" +metadata/exchanger_pet_climb_to_surface_id = &"home_button" +metadata/exchanger_pet_climb_x = 84.0 +metadata/exchanger_pet_climb_from_y = 1240.0 +metadata/exchanger_pet_climb_to_y = 862.0 +metadata/exchanger_pet_climb_side = &"left" + +[node name="SafeMargin" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="Control" parent="SafeMargin"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HomeNavigationButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.home_navigation_button" +layout_mode = 0 +offset_left = 49.0 +offset_top = 42.0 +offset_right = 101.0 +offset_bottom = 94.0 +tooltip_text = "ГЛАВНАЯ" +theme_type_variation = &"KeypadButton" +icon = ExtResource("5_home_icon") +expand_icon = true +icon_max_width = 30 + +[node name="ScreenTitle" type="Label" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 40.0 +offset_top = 44.0 +offset_right = 680.0 +offset_bottom = 112.0 +theme_type_variation = &"ScreenTitle" +text = "ОПЛАТА ПРОШЛА" +horizontal_alignment = 1 + +[node name="ResultPanel" type="PanelContainer" parent="SafeMargin/Content"] +layout_mode = 0 +offset_left = 96.0 +offset_top = 176.0 +offset_right = 624.0 +offset_bottom = 826.0 +theme_type_variation = &"WhitePanel" + +[node name="Margin" type="MarginContainer" parent="SafeMargin/Content/ResultPanel"] +layout_mode = 2 + +[node name="Values" type="VBoxContainer" parent="SafeMargin/Content/ResultPanel/Margin"] +layout_mode = 2 +theme_override_constants/separation = 28 + +[node name="Title" type="Label" parent="SafeMargin/Content/ResultPanel/Margin/Values"] +metadata/exchanger_binding_id = "success.content.result_panel.margin.values.title" +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_type_variation = &"PanelTitle" +text = "ВЫДАЧА ЖЕТОНОВ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Body" type="Control" parent="SafeMargin/Content/ResultPanel/Margin/Values"] +custom_minimum_size = Vector2(0, 538) +layout_mode = 2 +mouse_filter = 2 + +[node name="SpacePixelVisual" parent="SafeMargin/Content/ResultPanel/Margin/Values/Body" instance=ExtResource("4_result_visual")] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Message" type="Label" parent="SafeMargin/Content/ResultPanel/Margin/Values/Body"] +metadata/exchanger_binding_id = "success.content.result_panel.margin.values.body.message" +layout_mode = 0 +offset_left = 28.0 +offset_top = 418.0 +offset_right = 456.0 +offset_bottom = 504.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 23 +text = "ЗАБЕРИТЕ ЖЕТОНЫ\nСПАСИБО ЗА ПОКУПКУ!" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Countdown" type="Label" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.countdown" +visible = false + +[node name="HomeButton" type="Button" parent="SafeMargin/Content"] +metadata/exchanger_binding_id = "success.content.home_button" +layout_mode = 0 +offset_left = 84.0 +offset_top = 862.0 +offset_right = 636.0 +offset_bottom = 956.0 +theme_type_variation = &"PrimaryButton" +text = "НА ГЛАВНЫЙ ЭКРАН" + +[node name="Footer" parent="SafeMargin/Content" instance=ExtResource("3_footer")] +layout_mode = 1 diff --git a/themes/space-pixel/package/scripts/home_reference_label.gd b/themes/space-pixel/package/scripts/home_reference_label.gd new file mode 100644 index 0000000..771f7df --- /dev/null +++ b/themes/space-pixel/package/scripts/home_reference_label.gd @@ -0,0 +1,31 @@ +@tool +extends Label + +@export_enum("price", "support") var format_mode := "price" + + +func _process(_delta: float) -> void: + var formatted := _format_text(text) + if formatted != text: + text = formatted + + +func _format_text(value: String) -> String: + if format_mode == "support": + var lines := value.split("\n") + if lines.size() < 2: + return value + var heading := lines[0].replace(" ", "").trim_suffix(":").to_upper() + if heading != "ТЕХПОДДЕРЖКА": + return value + return "ТЕХ ПОДДЕРЖКА:\n" + "\n".join(lines.slice(1)) + + var upper := value.strip_edges().to_upper() + var amount := value.strip_edges() + for suffix in [" РУБ.", " ₽", " Р"]: + if upper.ends_with(suffix): + amount = amount.left(amount.length() - suffix.length()).strip_edges() + break + if amount.is_valid_int(): + return "%s руб." % amount + return value diff --git a/themes/space-pixel/package/scripts/home_reference_label.gd.uid b/themes/space-pixel/package/scripts/home_reference_label.gd.uid new file mode 100644 index 0000000..736d709 --- /dev/null +++ b/themes/space-pixel/package/scripts/home_reference_label.gd.uid @@ -0,0 +1 @@ +uid://dqgrwkru1akc1 diff --git a/themes/space-pixel/package/scripts/home_stock_presenter.gd b/themes/space-pixel/package/scripts/home_stock_presenter.gd new file mode 100644 index 0000000..a46a027 --- /dev/null +++ b/themes/space-pixel/package/scripts/home_stock_presenter.gd @@ -0,0 +1,30 @@ +@tool +extends Control + +const STOCK_MANY := preload("../assets/ui/stock_many.png") +const STOCK_LOW := preload("../assets/ui/stock_low.png") + +@onready var _state: Label = $StockPanel/Margin/Content/State +@onready var _meter: TextureRect = $StockPanel/Margin/Content/Meter + + +func _process(_delta: float) -> void: + if not is_instance_valid(_state) or not is_instance_valid(_meter): + return + + var raw := _state.text.strip_edges().to_upper() + if raw.begins_with("МНОГО"): + _apply_state("МНОГО", STOCK_MANY, true) + elif raw.begins_with("МАЛО"): + _apply_state("МАЛО", STOCK_LOW, true) + elif raw.contains("НЕТ ДАННЫХ"): + _apply_state("НЕТ ДАННЫХ", null, false) + + +func _apply_state(caption: String, texture: Texture2D, show_meter: bool) -> void: + if _state.text != caption: + _state.text = caption + if _meter.texture != texture: + _meter.texture = texture + if _meter.visible != show_meter: + _meter.visible = show_meter diff --git a/themes/space-pixel/package/scripts/home_stock_presenter.gd.uid b/themes/space-pixel/package/scripts/home_stock_presenter.gd.uid new file mode 100644 index 0000000..de292b5 --- /dev/null +++ b/themes/space-pixel/package/scripts/home_stock_presenter.gd.uid @@ -0,0 +1 @@ +uid://bjig3xvfbd8f3 diff --git a/themes/space-pixel/package/scripts/home_ufo_bobbing.gd b/themes/space-pixel/package/scripts/home_ufo_bobbing.gd new file mode 100644 index 0000000..a1db412 --- /dev/null +++ b/themes/space-pixel/package/scripts/home_ufo_bobbing.gd @@ -0,0 +1,37 @@ +extends Control + +@export_range(0.0, 20.0, 1.0) var left_amplitude := 4.0 +@export_range(0.0, 20.0, 1.0) var right_amplitude := 5.0 +@export_range(0.5, 10.0, 0.1) var left_period := 3.2 +@export_range(0.5, 10.0, 0.1) var right_period := 3.8 + +@onready var _left: TextureRect = $AlienLeft +@onready var _right: TextureRect = $CustomTextBlock/AlienRight + +var _left_base_position := Vector2.ZERO +var _right_base_position := Vector2.ZERO +var _elapsed := 0.0 + + +func _ready() -> void: + _left_base_position = _left.position + _right_base_position = _right.position + + +func _process(delta: float) -> void: + _elapsed = fmod(_elapsed + delta, maxf(left_period, right_period) * 10.0) + _apply_bob(_left, _left_base_position, left_amplitude, left_period, 0.0) + _apply_bob(_right, _right_base_position, right_amplitude, right_period, PI) + + +func _apply_bob( + sprite: TextureRect, + base_position: Vector2, + amplitude: float, + period: float, + phase: float +) -> void: + # Округление сохраняет чёткие пиксельные края при Nearest-фильтрации. + var offset_y := roundf(sin(_elapsed * TAU / period + phase) * amplitude) + sprite.position = base_position + Vector2(0.0, offset_y) + sprite.set_meta("bob_offset_y", offset_y) diff --git a/themes/space-pixel/package/scripts/home_ufo_bobbing.gd.uid b/themes/space-pixel/package/scripts/home_ufo_bobbing.gd.uid new file mode 100644 index 0000000..6679867 --- /dev/null +++ b/themes/space-pixel/package/scripts/home_ufo_bobbing.gd.uid @@ -0,0 +1 @@ +uid://nccpj07e6yaa diff --git a/themes/space-pixel/package/scripts/interactive_pet.gd b/themes/space-pixel/package/scripts/interactive_pet.gd new file mode 100644 index 0000000..b9c3c0d --- /dev/null +++ b/themes/space-pixel/package/scripts/interactive_pet.gd @@ -0,0 +1,743 @@ +@tool +extends Node2D + +signal pet_animation_started(animation_name: StringName) +signal pet_animation_completed(animation_name: StringName) +signal pet_composite_action_started(action_name: StringName, run_id: int) +signal pet_composite_action_finished(action_name: StringName, run_id: int, completed: bool) + +const FRAME_SIZE := Vector2i(128, 128) +const ANIMATION_NAMES := [ + &"climbing_down", + &"climbing_start", + &"climbing_up", + &"dancing", + &"come_closer", + &"falling", + &"hanging", + &"sitting", + &"idle", + &"landing", + &"turn_left", + &"turn_right", + &"walking_left_stop", + &"walking_right_stop", + &"walking_left", + &"walking_right", + &"walking_left_start", + &"walking_start_right", + &"action", + &"climbing_action_start", + &"climbing_action_stop", + &"climbing_action", +] +const ANIMATION_FRAME_COUNTS := { + &"climbing_down": 16, + &"climbing_start": 19, + &"climbing_up": 16, + &"dancing": 95, + &"come_closer": 36, + &"falling": 30, + &"hanging": 23, + &"sitting": 30, + &"idle": 19, + &"landing": 11, + &"turn_left": 10, + &"turn_right": 10, + &"walking_left_stop": 4, + &"walking_right_stop": 4, + &"walking_left": 19, + &"walking_right": 19, + &"walking_left_start": 5, + &"walking_start_right": 5, + &"action": 11, + &"climbing_action_start": 11, + &"climbing_action_stop": 11, + &"climbing_action": 10, +} +const ANIMATION_SPEEDS := { + &"climbing_down": 24.0, + &"climbing_start": 24.0, + &"climbing_up": 24.0, + &"dancing": 24.0, + &"come_closer": 24.0, + &"falling": 24.0, + &"hanging": 12.0, + &"sitting": 24.0, + &"idle": 24.0, + &"landing": 24.0, + &"turn_left": 24.0, + &"turn_right": 24.0, + &"walking_left_stop": 24.0, + &"walking_right_stop": 24.0, + &"walking_left": 24.0, + &"walking_right": 24.0, + &"walking_left_start": 24.0, + &"walking_start_right": 24.0, + &"action": 24.0, + &"climbing_action_start": 24.0, + &"climbing_action_stop": 24.0, + &"climbing_action": 24.0, +} +const ONE_SHOT_ANIMATIONS := { + &"climbing_start": true, + &"come_closer": true, + &"landing": true, + &"turn_left": true, + &"turn_right": true, + &"walking_left_stop": true, + &"walking_right_stop": true, + &"walking_left_start": true, + &"walking_start_right": true, + &"climbing_action_start": true, + &"climbing_action_stop": true, +} +const ACTION_ANIMATIONS := { + &"idle": &"idle", + &"sit": &"sitting", + &"interact": &"action", + &"celebrate": &"dancing", + &"walk_left": &"walking_left", + &"walk_right": &"walking_right", + &"walk_start_left": &"walking_left_start", + &"walk_start_right": &"walking_start_right", + &"walk_finish_left": &"walking_left_stop", + &"walk_finish_right": &"walking_right_stop", + &"climb_start": &"climbing_start", + &"climb_up": &"climbing_up", + &"climb_down": &"climbing_down", + &"climb_finish": &"idle", + &"drag": &"hanging", + &"drop": &"falling", + &"come_closer": &"come_closer", + &"landing": &"landing", + &"turn_left": &"turn_left", + &"turn_right": &"turn_right", + &"action": &"action", + &"climbing_action_start": &"climbing_action_start", + &"climbing_action": &"climbing_action", + &"climbing_action_stop": &"climbing_action_stop", +} +const RUNTIME_SCALE := 0.845 +const WALK_SPEED := 88.0 +const CLIMB_SPEED := 72.0 +const HIT_SIZE := Vector2(128.0, 128.0) +const GROUND_OFFSET := Vector2(64.0, 96.0) +const SITTING_VISUAL_OFFSET := Vector2(0.0, 24.0) +const NON_SITTING_VISUAL_OFFSET := Vector2.ZERO +const COMPOSITE_INTERACT := &"interact" +const FACING_FRONT := &"front" +const FACING_LEFT := &"left" +const FACING_RIGHT := &"right" +const LEFT_FACING_ANIMATIONS := { + &"walking_left": true, + &"walking_left_start": true, + &"walking_left_stop": true, +} +const RIGHT_FACING_ANIMATIONS := { + &"walking_right": true, + &"walking_start_right": true, + &"walking_right_stop": true, +} +const FRONT_FACING_ANIMATIONS := { + &"idle": true, + &"sitting": true, + &"turn_left": true, + &"turn_right": true, + &"come_closer": true, + &"action": true, + &"falling": true, + &"landing": true, + &"dancing": true, +} + +@export_category("Sprite Sheets") +@export var climbing_down_texture: Texture2D +@export var climbing_start_texture: Texture2D +@export var climbing_up_texture: Texture2D +@export var dancing_texture: Texture2D +@export var come_closer_texture: Texture2D +@export var falling_texture: Texture2D +@export var hanging_texture: Texture2D +@export var sitting_texture: Texture2D +@export var idle_texture: Texture2D +@export var landing_texture: Texture2D +@export var turn_left_texture: Texture2D +@export var turn_right_texture: Texture2D +@export var walking_left_stop_texture: Texture2D +@export var walking_right_stop_texture: Texture2D +@export var walking_left_texture: Texture2D +@export var walking_right_texture: Texture2D +@export var walking_left_start_texture: Texture2D +@export var walking_start_right_texture: Texture2D +@export var action_texture: Texture2D +@export var climbing_action_start_texture: Texture2D +@export var climbing_action_stop_texture: Texture2D +@export var climbing_action_texture: Texture2D + +@export_category("Playback") +@export_enum( + "climbing_down", + "climbing_start", + "climbing_up", + "dancing", + "come_closer", + "falling", + "hanging", + "sitting", + "idle", + "landing", + "turn_left", + "turn_right", + "walking_left_stop", + "walking_right_stop", + "walking_left", + "walking_right", + "walking_left_start", + "walking_start_right", + "action", + "climbing_action_start", + "climbing_action_stop", + "climbing_action" +) var initial_animation := "idle" +@export var autoplay_on_ready := true +@export_range(0.1, 4.0, 0.05) var playback_speed_scale := 1.0 +@export var return_to_sitting_after_one_shot := false + +@export_category("Composite Action") +@export_range(1.0, 4.0, 0.05) var approach_visual_scale := 2.0 +@export_range(0.1, 1.0, 0.05) var approach_scale_completion_ratio := 0.75 +@export_range(0.0, 1.0, 0.01) var approach_hold_seconds := 0.15 +@export_range(32.0, 1024.0, 1.0) var falling_distance_per_cycle := 320.0 +@export_range(0.0, 512.0, 1.0) var vertical_wrap_margin := 192.0 + +@onready var _visual_root: Node2D = $VisualRoot +@onready var _sprite: AnimatedSprite2D = $VisualRoot/Sprite + +var _sprite_base_position := Vector2.ZERO +var _facing: StringName = FACING_FRONT +var _composite_run_id := 0 +var _composite_action: StringName = &"" +var _composite_runtime: Object + + +func _ready() -> void: + _sprite_base_position = _sprite.position + _build_sprite_frames() + if not _sprite.animation_finished.is_connected(_on_animation_finished): + _sprite.animation_finished.connect(_on_animation_finished) + if autoplay_on_ready: + play_pet_animation(StringName(initial_animation)) + + +func get_pet_animation_names() -> Array[StringName]: + var result: Array[StringName] = [] + for animation_name in ANIMATION_NAMES: + result.append(animation_name) + return result + + +func get_pet_action_animation(action_name: StringName) -> StringName: + return StringName(ACTION_ANIMATIONS.get(action_name, &"")) + + +func get_pet_animation_frame_count(animation_name: StringName) -> int: + return int(ANIMATION_FRAME_COUNTS.get(animation_name, 0)) + + +func has_pet_animation(animation_name: StringName) -> bool: + return ( + is_instance_valid(_sprite) + and _sprite.sprite_frames != null + and _sprite.sprite_frames.has_animation(animation_name) + ) + + +func play_pet_animation(animation_name: StringName, restart := true) -> bool: + if not has_pet_animation(animation_name): + push_warning("Unknown interactive pet animation: %s" % animation_name) + return false + _apply_animation_visual_offset(animation_name) + if restart: + _sprite.set_frame_and_progress(0, 0.0) + _sprite.speed_scale = playback_speed_scale + _sprite.play(animation_name) + _remember_animation_facing(animation_name) + pet_animation_started.emit(animation_name) + return true + + +func pause_pet_animation() -> void: + if is_instance_valid(_sprite): + _sprite.pause() + + +func stop_pet_animation() -> void: + if is_instance_valid(_sprite): + _sprite.stop() + + +func get_current_pet_animation() -> StringName: + if not is_instance_valid(_sprite): + return &"" + return _sprite.animation + + +func get_current_pet_frame() -> int: + if not is_instance_valid(_sprite): + return -1 + return _sprite.frame + + +func is_pet_animation_looping(animation_name: StringName) -> bool: + return ( + is_instance_valid(_sprite) + and _sprite.sprite_frames != null + and _sprite.sprite_frames.has_animation(animation_name) + and _sprite.sprite_frames.get_animation_loop(animation_name) + ) + + +func get_pet_animation_frames_per_second(animation_name: StringName) -> float: + if not has_pet_animation(animation_name): + return 0.0 + return _sprite.sprite_frames.get_animation_speed(animation_name) * playback_speed_scale + + +func get_pet_preview_size() -> Vector2: + return Vector2(FRAME_SIZE) + + +func has_pet_composite_action(action_name: StringName) -> bool: + return action_name == COMPOSITE_INTERACT + + +func start_pet_composite_action( + action_name: StringName, + runtime: Object, + parameters: Dictionary +) -> int: + if not has_pet_composite_action(action_name) or not _is_valid_runtime(runtime): + return 0 + if _composite_run_id != 0: + cancel_pet_composite_action(_composite_run_id, &"replaced") + + var run_id := int(runtime.call(&"GetRunId")) + if run_id <= 0: + return 0 + _composite_run_id = run_id + _composite_action = action_name + _composite_runtime = runtime + pet_composite_action_started.emit(action_name, run_id) + call_deferred(&"_run_interact_composite", run_id, runtime, parameters.duplicate(true)) + return run_id + + +func cancel_pet_composite_action(run_id: int, _reason: StringName) -> void: + if run_id != _composite_run_id: + return + _finish_composite_action(run_id, false, false) + + +func get_pet_runtime_scale() -> float: + return RUNTIME_SCALE + + +func get_pet_walk_speed() -> float: + return WALK_SPEED + + +func get_pet_climb_speed() -> float: + return CLIMB_SPEED + + +func get_pet_hit_size() -> Vector2: + return HIT_SIZE + + +func get_pet_ground_offset() -> Vector2: + return GROUND_OFFSET + + +func get_pet_animation_visual_offset(animation_name: StringName) -> Vector2: + if not ANIMATION_NAMES.has(animation_name): + return Vector2.ZERO + if animation_name == &"sitting": + return SITTING_VISUAL_OFFSET + return NON_SITTING_VISUAL_OFFSET + + +func get_pet_visual_offset() -> Vector2: + if not is_instance_valid(_sprite): + return Vector2.ZERO + return _sprite.position - _sprite_base_position + + +func _apply_animation_visual_offset(animation_name: StringName) -> void: + _sprite.position = _sprite_base_position + get_pet_animation_visual_offset(animation_name) + + +func _run_interact_composite(run_id: int, runtime: Object, parameters: Dictionary) -> void: + var suspended_policy := { + "navigation": "suspended", + "support_contacts": "ignore", + "screen_bounds": "allow", + "input_enabled": false, + } + if not bool(runtime.call(&"SetMotionPolicy", suspended_policy)): + _finish_composite_action(run_id, false) + return + + var turn_animation := _turn_animation_for_facing() + if turn_animation != &"" and not await _play_animation_cycles( + turn_animation, + 1, + run_id, + runtime + ): + return + + var reduced_effects := bool(parameters.get("reduced_effects", false)) + if not reduced_effects and not await _play_animation_with_visual_scale( + &"come_closer", + 1.0, + approach_visual_scale, + run_id, + runtime + ): + return + + var action_repetitions := clampi(int(parameters.get("action_repetitions", 3)), 1, 16) + if not await _play_animation_cycles(&"action", action_repetitions, run_id, runtime): + return + + if not reduced_effects and not await _play_wrapped_fall(run_id, runtime): + return + if not await _play_animation_cycles(&"landing", 1, run_id, runtime): + return + if not _is_composite_active(run_id, runtime): + return + play_pet_animation(&"idle") + _finish_composite_action(run_id, true) + + +func _play_wrapped_fall(run_id: int, runtime: Object) -> bool: + var support_value: Variant = runtime.call(&"GetHighestSupport") + if not support_value is Dictionary: + _finish_composite_action(run_id, false) + return false + var support := support_value as Dictionary + if not bool(support.get("accepted", false)) or not bool(support.get("valid", false)): + _finish_composite_action(run_id, false) + return false + + var viewport := runtime.call(&"GetViewportRect") as Rect2 + var start_anchor := runtime.call(&"GetAnchor") as Vector2 + var target_anchor := support.get("anchor", Vector2.ZERO) as Vector2 + var target_surface_id := String(support.get("surface_id", "")) + if viewport.size.x <= 0.0 or viewport.size.y <= 0.0 or target_surface_id.is_empty(): + _finish_composite_action(run_id, false) + return false + + var first_leg := maxf(0.0, viewport.end.y + vertical_wrap_margin - start_anchor.y) + var second_leg := maxf(0.0, target_anchor.y - (viewport.position.y - vertical_wrap_margin)) + var total_distance := maxf(1.0, first_leg + second_leg) + var calculated_cycles := maxi(1, ceili(total_distance / falling_distance_per_cycle)) + var cycle_seconds := _animation_cycle_seconds(&"falling") + if cycle_seconds <= 0.0: + _finish_composite_action(run_id, false) + return false + var total_seconds := float(calculated_cycles) * cycle_seconds + var fall_speed := total_distance / total_seconds + var falling_policy := { + "navigation": "theme_driven", + "support_contacts": "after_vertical_wrap", + "screen_bounds": "wrap_vertical_once", + "input_enabled": false, + "landing_surface_id": target_surface_id, + "wrap_margin": vertical_wrap_margin, + } + if not bool(runtime.call(&"SetMotionPolicy", falling_policy)): + _finish_composite_action(run_id, false) + return false + if not play_pet_animation(&"falling"): + _finish_composite_action(run_id, false) + return false + + var elapsed := 0.0 + var wrapped := false + var landed := false + while elapsed < total_seconds and not landed: + await get_tree().process_frame + if not _is_composite_active(run_id, runtime): + return false + var delta := minf(get_process_delta_time(), total_seconds - elapsed) + elapsed += delta + var move_value: Variant = runtime.call(&"MoveAnchor", Vector2.DOWN * fall_speed * delta) + if not move_value is Dictionary: + _finish_composite_action(run_id, false) + return false + var move_result := move_value as Dictionary + if not bool(move_result.get("accepted", false)): + _finish_composite_action(run_id, false) + return false + if bool(move_result.get("wrapped", false)): + wrapped = true + var wrapped_anchor := move_result.get("anchor", Vector2.ZERO) as Vector2 + wrapped_anchor.x = target_anchor.x + runtime.call(&"SetAnchor", wrapped_anchor) + _visual_root.scale = Vector2.ONE + landed = bool(move_result.get("landed", false)) + + if not wrapped: + _finish_composite_action(run_id, false) + return false + if not landed: + var landing_value: Variant = runtime.call(&"LandOnSupport", target_surface_id) + if not landing_value is Dictionary or not bool( + (landing_value as Dictionary).get("landed", false) + ): + _finish_composite_action(run_id, false) + return false + return true + + +func _play_animation_with_visual_scale( + animation_name: StringName, + from_scale: float, + to_scale: float, + run_id: int, + runtime: Object +) -> bool: + if not play_pet_animation(animation_name): + _finish_composite_action(run_id, false) + return false + var duration := _animation_cycle_seconds(animation_name) + if duration <= 0.0: + _finish_composite_action(run_id, false) + return false + var frames_per_second := get_pet_animation_frames_per_second(animation_name) + var final_frame_duration := 1.0 / frames_per_second + var scale_duration := clampf( + duration * approach_scale_completion_ratio, + final_frame_duration, + duration + ) + var elapsed := 0.0 + _visual_root.scale = Vector2.ONE * from_scale + while elapsed < duration: + await get_tree().process_frame + if not _is_composite_active(run_id, runtime): + return false + elapsed = minf(duration, elapsed + get_process_delta_time()) + # Finish the zoom before the clip ends. Its closing frames therefore + # establish the final size instead of changing size at the action cut. + var weight := minf(1.0, elapsed / scale_duration) + _visual_root.scale = Vector2.ONE * lerpf(from_scale, to_scale, weight) + _visual_root.scale = Vector2.ONE * to_scale + var hold_elapsed := 0.0 + while hold_elapsed < approach_hold_seconds: + await get_tree().process_frame + if not _is_composite_active(run_id, runtime): + return false + hold_elapsed += get_process_delta_time() + return true + + +func _play_animation_cycles( + animation_name: StringName, + cycles: int, + run_id: int, + runtime: Object +) -> bool: + var cycle_seconds := _animation_cycle_seconds(animation_name) + if cycle_seconds <= 0.0: + _finish_composite_action(run_id, false) + return false + for _cycle in maxi(1, cycles): + if not play_pet_animation(animation_name): + _finish_composite_action(run_id, false) + return false + var elapsed := 0.0 + while elapsed < cycle_seconds: + await get_tree().process_frame + if not _is_composite_active(run_id, runtime): + return false + elapsed += get_process_delta_time() + return true + + +func _animation_cycle_seconds(animation_name: StringName) -> float: + var frame_count := get_pet_animation_frame_count(animation_name) + var frames_per_second := get_pet_animation_frames_per_second(animation_name) + if frame_count <= 0 or frames_per_second <= 0.0: + return 0.0 + return float(frame_count) / frames_per_second + + +func _turn_animation_for_facing() -> StringName: + match _facing: + FACING_LEFT: + return &"turn_left" + FACING_RIGHT: + return &"turn_right" + return &"" + + +func _remember_animation_facing(animation_name: StringName) -> void: + if LEFT_FACING_ANIMATIONS.has(animation_name): + _facing = FACING_LEFT + elif RIGHT_FACING_ANIMATIONS.has(animation_name): + _facing = FACING_RIGHT + elif FRONT_FACING_ANIMATIONS.has(animation_name): + _facing = FACING_FRONT + + +func _is_valid_runtime(runtime: Object) -> bool: + if runtime == null: + return false + for method_name in [ + &"GetRunId", + &"IsActive", + &"GetViewportRect", + &"GetAnchor", + &"GetHighestSupport", + &"SetMotionPolicy", + &"SetAnchor", + &"MoveAnchor", + &"LandOnSupport", + ]: + if not runtime.has_method(method_name): + return false + return true + + +func _is_composite_active(run_id: int, runtime: Object) -> bool: + return ( + run_id == _composite_run_id + and runtime == _composite_runtime + and is_instance_valid(runtime) + and bool(runtime.call(&"IsActive")) + ) + + +func _finish_composite_action(run_id: int, completed: bool, emit_finished := true) -> void: + if run_id != _composite_run_id: + return + var action_name := _composite_action + _composite_run_id = 0 + _composite_action = &"" + _composite_runtime = null + if is_instance_valid(_visual_root): + _visual_root.scale = Vector2.ONE + if emit_finished: + pet_composite_action_finished.emit(action_name, run_id, completed) + + +func _build_sprite_frames() -> void: + var generated_frames := SpriteFrames.new() + generated_frames.remove_animation(&"default") + + for animation_name in ANIMATION_NAMES: + var texture := _texture_for(animation_name) + if texture == null: + continue + var columns := floori(float(texture.get_width()) / float(FRAME_SIZE.x)) + var frame_count := int(ANIMATION_FRAME_COUNTS[animation_name]) + generated_frames.add_animation(animation_name) + generated_frames.set_animation_speed( + animation_name, + float(ANIMATION_SPEEDS[animation_name]) + ) + generated_frames.set_animation_loop( + animation_name, + not ONE_SHOT_ANIMATIONS.has(animation_name) + ) + + for frame_index in frame_count: + var atlas_frame := AtlasTexture.new() + atlas_frame.atlas = texture + atlas_frame.region = Rect2( + float(frame_index % columns) * FRAME_SIZE.x, + float(floori(float(frame_index) / float(columns))) * FRAME_SIZE.y, + FRAME_SIZE.x, + FRAME_SIZE.y + ) + atlas_frame.filter_clip = true + generated_frames.add_frame(animation_name, atlas_frame) + + _sprite.sprite_frames = generated_frames + + +func _texture_for(animation_name: StringName) -> Texture2D: + match animation_name: + &"climbing_down": + return climbing_down_texture + &"climbing_start": + return climbing_start_texture + &"climbing_up": + return climbing_up_texture + &"dancing": + return dancing_texture + &"come_closer": + return come_closer_texture + &"falling": + return falling_texture + &"hanging": + return hanging_texture + &"sitting": + return sitting_texture + &"idle": + return idle_texture + &"landing": + return landing_texture + &"turn_left": + return turn_left_texture + &"turn_right": + return turn_right_texture + &"walking_left_stop": + return walking_left_stop_texture + &"walking_right_stop": + return walking_right_stop_texture + &"walking_left": + return walking_left_texture + &"walking_right": + return walking_right_texture + &"walking_left_start": + return walking_left_start_texture + &"walking_start_right": + return walking_start_right_texture + &"action": + return action_texture + &"climbing_action_start": + return climbing_action_start_texture + &"climbing_action_stop": + return climbing_action_stop_texture + &"climbing_action": + return climbing_action_texture + return null + + +func _on_animation_finished() -> void: + var completed_animation := _sprite.animation + pet_animation_completed.emit(completed_animation) + if return_to_sitting_after_one_shot and ONE_SHOT_ANIMATIONS.has(completed_animation): + play_pet_animation(&"sitting") + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings := PackedStringArray() + for animation_name in ANIMATION_NAMES: + var texture := _texture_for(animation_name) + if texture == null: + warnings.append("Missing sprite sheet for %s." % animation_name) + continue + if texture.get_width() % FRAME_SIZE.x != 0 or texture.get_height() % FRAME_SIZE.y != 0: + warnings.append("Sprite sheet %s is not aligned to 128x128 cells." % animation_name) + continue + var available_frames := floori(float(texture.get_width()) / float(FRAME_SIZE.x)) * floori( + float(texture.get_height()) / float(FRAME_SIZE.y) + ) + if int(ANIMATION_FRAME_COUNTS[animation_name]) > available_frames: + warnings.append("Sprite sheet %s does not contain all declared frames." % animation_name) + return warnings diff --git a/themes/space-pixel/package/scripts/interactive_pet.gd.uid b/themes/space-pixel/package/scripts/interactive_pet.gd.uid new file mode 100644 index 0000000..1a5a99b --- /dev/null +++ b/themes/space-pixel/package/scripts/interactive_pet.gd.uid @@ -0,0 +1 @@ +uid://k2f6x5chdh01 diff --git a/themes/space-pixel/package/scripts/stable_banner_animation.gd b/themes/space-pixel/package/scripts/stable_banner_animation.gd new file mode 100644 index 0000000..42325a9 --- /dev/null +++ b/themes/space-pixel/package/scripts/stable_banner_animation.gd @@ -0,0 +1,30 @@ +extends AnimatedSprite2D + +# Непрозрачная цветная область исходных кадров: +# frame_01: Rect2(0, 28, 263, 167) +# frame_02: Rect2(0, 39, 257, 163) +# Второй кадр масштабируется и сдвигается относительно центра 1024x256 так, +# чтобы обе области занимали одинаковые экранные границы. +@export var second_frame_scale_factor := Vector2(263.0 / 257.0, 167.0 / 163.0) +@export var second_frame_local_offset := Vector2(11.953307, -8.815951) + +var _base_position := Vector2.ZERO +var _base_scale := Vector2.ONE + + +func _ready() -> void: + _base_position = position + _base_scale = scale + frame_changed.connect(_apply_frame_compensation) + _apply_frame_compensation() + + +func _apply_frame_compensation() -> void: + if frame == 1: + scale = _base_scale * second_frame_scale_factor + position = _base_position + second_frame_local_offset * _base_scale + else: + scale = _base_scale + position = _base_position + + set_meta("normalized_frame", frame) diff --git a/themes/space-pixel/package/scripts/stable_banner_animation.gd.uid b/themes/space-pixel/package/scripts/stable_banner_animation.gd.uid new file mode 100644 index 0000000..4943907 --- /dev/null +++ b/themes/space-pixel/package/scripts/stable_banner_animation.gd.uid @@ -0,0 +1 @@ +uid://bdt0nqmx75ng8 diff --git a/themes/space-pixel/package/scripts/ufo_flight_controller.gd b/themes/space-pixel/package/scripts/ufo_flight_controller.gd new file mode 100644 index 0000000..a0e6e36 --- /dev/null +++ b/themes/space-pixel/package/scripts/ufo_flight_controller.gd @@ -0,0 +1,67 @@ +extends Node2D + +@export_range(0.0, 1920.0, 1.0) var min_flight_height := 260.0 +@export_range(0.0, 1920.0, 1.0) var max_flight_height := 1660.0 +@export_range(0.0, 10.0, 0.1) var min_edge_pause := 1.0 +@export_range(0.0, 10.0, 0.1) var max_edge_pause := 3.0 +@export_range(1.0, 1000.0, 1.0) var large_speed := 470.0 +@export_range(1.0, 1000.0, 1.0) var small_speed := 437.0 +@export_range(0.0, 30.0, 0.1) var small_initial_delay := 5.5 + +@onready var _large: AnimatedSprite2D = $UfoLarge +@onready var _small: AnimatedSprite2D = $UfoSmall + +var _random := RandomNumberGenerator.new() + + +func _ready() -> void: + _random.randomize() + _fly_forever(_large, -380.0, 1500.0, large_speed, 0.0) + _fly_forever(_small, -160.0, 1260.0, small_speed, small_initial_delay) + + +func _fly_forever( + sprite: AnimatedSprite2D, + left_edge: float, + right_edge: float, + speed: float, + initial_delay: float +) -> void: + var direction := 1 + _place_for_next_pass(sprite, left_edge, direction) + + if initial_delay > 0.0: + await get_tree().create_timer(initial_delay).timeout + + while is_inside_tree() and is_instance_valid(sprite): + var target_x := right_edge if direction > 0 else left_edge + var duration := absf(target_x - sprite.position.x) / speed + var flight := create_tween().set_trans(Tween.TRANS_LINEAR) + flight.tween_property(sprite, "position:x", target_x, duration) + await flight.finished + + if not is_inside_tree() or not is_instance_valid(sprite): + return + + await get_tree().create_timer( + _random.randf_range(min_edge_pause, max_edge_pause) + ).timeout + + direction *= -1 + _place_for_next_pass(sprite, target_x, direction) + + +func _place_for_next_pass( + sprite: AnimatedSprite2D, + edge_x: float, + direction: int +) -> void: + # Шаг 3 px сохраняет целочисленную высоту после масштаба production-сцен 2/3. + var random_height := snappedf( + _random.randf_range(min_flight_height, max_flight_height), + 3.0 + ) + sprite.position = Vector2(edge_x, random_height) + sprite.flip_h = direction < 0 + sprite.set_meta("flight_direction", direction) + sprite.set_meta("flight_height", random_height) diff --git a/themes/space-pixel/package/scripts/ufo_flight_controller.gd.uid b/themes/space-pixel/package/scripts/ufo_flight_controller.gd.uid new file mode 100644 index 0000000..8520abd --- /dev/null +++ b/themes/space-pixel/package/scripts/ufo_flight_controller.gd.uid @@ -0,0 +1 @@ +uid://cifbft5lk7prl diff --git a/themes/space-pixel/package/ui_theme.tres b/themes/space-pixel/package/ui_theme.tres new file mode 100644 index 0000000..c06b1b2 --- /dev/null +++ b/themes/space-pixel/package/ui_theme.tres @@ -0,0 +1,755 @@ +[gd_resource type="Theme" format=3 uid="uid://dfq25gg23x0xh"] + +[ext_resource type="FontFile" uid="uid://culveonyhkpru" path="res://themes/space-pixel/package/assets/fonts/vcr_osd_mono_cyr.ttf" id="1_font"] +[ext_resource type="Texture2D" uid="uid://bxw1d5ftc3jpp" path="res://themes/space-pixel/package/assets/ui/button_big.png" id="2_button_big"] +[ext_resource type="Texture2D" uid="uid://b4gr7gwf5jyy6" path="res://themes/space-pixel/package/assets/ui/button_long.png" id="3_button_long"] +[ext_resource type="Texture2D" uid="uid://sntindr0yqtc" path="res://themes/space-pixel/package/assets/ui/back_button.png" id="4_back_button"] +[ext_resource type="Texture2D" uid="uid://cp2gv8jrxb1is" path="res://themes/space-pixel/package/assets/ui/panel_medium.png" id="5_panel"] +[ext_resource type="Texture2D" uid="uid://od3ytfnm6es0" path="res://themes/space-pixel/package/assets/ui/tumbler_on.png" id="6_check_on"] +[ext_resource type="Texture2D" uid="uid://dioycex1x3g62" path="res://themes/space-pixel/package/assets/ui/tumbler_off.png" id="7_check_off"] +[ext_resource type="Texture2D" uid="uid://jcpf3lum8v3x" path="res://themes/space-pixel/package/assets/ui/button_square.png" id="8_button_square"] +[ext_resource type="Texture2D" uid="uid://kir5pffovdmv" path="res://themes/space-pixel/package/assets/ui/button_up.png" id="9_button_up"] +[ext_resource type="Texture2D" uid="uid://bfietocvvkfrd" path="res://themes/space-pixel/package/assets/ui/button_down.png" id="10_button_down"] +[ext_resource type="Texture2D" uid="uid://dbnw5b84pre6y" path="res://themes/space-pixel/package/assets/ui/sum_bar.png" id="11_sum_bar"] +[ext_resource type="Texture2D" uid="uid://str14omahot0" path="res://themes/space-pixel/package/assets/ui/button_cancel.png" id="12_button_cancel"] + +[sub_resource type="StyleBoxFlat" id="StyleBox_advertisement"] +content_margin_left = 18.0 +content_margin_top = 18.0 +content_margin_right = 18.0 +content_margin_bottom = 18.0 +bg_color = Color(0.005, 0.03, 0.09, 0.72) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.42, 0.86, 0.31, 0.84) +corner_radius_top_left = 18 +corner_radius_top_right = 18 +corner_radius_bottom_right = 18 +corner_radius_bottom_left = 18 + +[sub_resource type="StyleBoxFlat" id="StyleBox_focus"] +bg_color = Color(0, 0, 0, 0) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.88, 0.48, 1, 0.95) +corner_radius_top_left = 14 +corner_radius_top_right = 14 +corner_radius_bottom_right = 14 +corner_radius_bottom_left = 14 +expand_margin_left = 3.0 +expand_margin_top = 3.0 +expand_margin_right = 3.0 +expand_margin_bottom = 3.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_back"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +texture = ExtResource("4_back_button") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_button_disabled"] +content_margin_left = 30.0 +content_margin_top = 18.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("2_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(0.36, 0.42, 0.5, 0.7) + +[sub_resource type="StyleBoxTexture" id="StyleBox_button_hover"] +content_margin_left = 30.0 +content_margin_top = 18.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("2_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_button_normal"] +content_margin_left = 30.0 +content_margin_top = 18.0 +content_margin_right = 30.0 +content_margin_bottom = 18.0 +texture = ExtResource("2_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_button_pressed"] +content_margin_left = 30.0 +content_margin_top = 20.0 +content_margin_right = 30.0 +content_margin_bottom = 16.0 +texture = ExtResource("2_button_big") +texture_margin_left = 28.0 +texture_margin_top = 24.0 +texture_margin_right = 28.0 +texture_margin_bottom = 24.0 +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="AtlasTexture" id="AtlasTexture_button_cancel"] +atlas = ExtResource("12_button_cancel") +region = Rect2(82, 0, 349, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_danger_disabled"] +content_margin_left = 20.0 +content_margin_top = 10.0 +content_margin_right = 20.0 +content_margin_bottom = 10.0 +texture = SubResource("AtlasTexture_button_cancel") +texture_margin_left = 24.0 +texture_margin_top = 20.0 +texture_margin_right = 24.0 +texture_margin_bottom = 20.0 +modulate_color = Color(0.52, 0.52, 0.52, 0.7) + +[sub_resource type="StyleBoxTexture" id="StyleBox_danger_hover"] +content_margin_left = 20.0 +content_margin_top = 10.0 +content_margin_right = 20.0 +content_margin_bottom = 10.0 +texture = SubResource("AtlasTexture_button_cancel") +texture_margin_left = 24.0 +texture_margin_top = 20.0 +texture_margin_right = 24.0 +texture_margin_bottom = 20.0 +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_danger_normal"] +content_margin_left = 20.0 +content_margin_top = 10.0 +content_margin_right = 20.0 +content_margin_bottom = 10.0 +texture = SubResource("AtlasTexture_button_cancel") +texture_margin_left = 24.0 +texture_margin_top = 20.0 +texture_margin_right = 24.0 +texture_margin_bottom = 20.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_danger_pressed"] +content_margin_left = 20.0 +content_margin_top = 12.0 +content_margin_right = 20.0 +content_margin_bottom = 8.0 +texture = SubResource("AtlasTexture_button_cancel") +texture_margin_left = 24.0 +texture_margin_top = 20.0 +texture_margin_right = 24.0 +texture_margin_bottom = 20.0 +modulate_color = Color(0.78, 0.78, 0.78, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBox_check_disabled"] +content_margin_left = 24.0 +content_margin_top = 12.0 +content_margin_right = 24.0 +content_margin_bottom = 12.0 +bg_color = Color(0.46, 0.58, 0.45, 0.72) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.65, 0.72, 0.66, 0.72) +corner_radius_top_left = 12 +corner_radius_top_right = 12 +corner_radius_bottom_right = 12 +corner_radius_bottom_left = 12 + +[sub_resource type="StyleBoxFlat" id="StyleBox_check_hover"] +content_margin_left = 24.0 +content_margin_top = 12.0 +content_margin_right = 24.0 +content_margin_bottom = 12.0 +bg_color = Color(0.38, 0.88, 0.29, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.84, 1, 0.72, 1) +corner_radius_top_left = 12 +corner_radius_top_right = 12 +corner_radius_bottom_right = 12 +corner_radius_bottom_left = 12 + +[sub_resource type="StyleBoxFlat" id="StyleBox_check_pressed"] +content_margin_left = 24.0 +content_margin_top = 14.0 +content_margin_right = 24.0 +content_margin_bottom = 10.0 +bg_color = Color(0.19, 0.63, 0.17, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.72, 1, 0.58, 1) +corner_radius_top_left = 12 +corner_radius_top_right = 12 +corner_radius_bottom_right = 12 +corner_radius_bottom_left = 12 + +[sub_resource type="StyleBoxFlat" id="StyleBox_check_normal"] +content_margin_left = 24.0 +content_margin_top = 12.0 +content_margin_right = 24.0 +content_margin_bottom = 12.0 +bg_color = Color(0.28, 0.8, 0.22, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.72, 1, 0.58, 1) +corner_radius_top_left = 12 +corner_radius_top_right = 12 +corner_radius_bottom_right = 12 +corner_radius_bottom_left = 12 + +[sub_resource type="StyleBoxTexture" id="StyleBox_compact_normal"] +content_margin_left = 20.0 +content_margin_top = 10.0 +content_margin_right = 20.0 +content_margin_bottom = 10.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_compact_pressed"] +content_margin_left = 20.0 +content_margin_top = 12.0 +content_margin_right = 20.0 +content_margin_bottom = 8.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBox_footer"] +content_margin_left = 20.0 +content_margin_top = 8.0 +content_margin_right = 20.0 +content_margin_bottom = 8.0 +bg_color = Color(0.005, 0.03, 0.09, 0.78) +border_width_top = 2 +border_color = Color(0.42, 0.86, 0.31, 0.9) + +[sub_resource type="StyleBoxFlat" id="StyleBox_scroll_grabber"] +bg_color = Color(0.25, 0.78, 0.2, 0.94) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.72, 1, 0.58, 1) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="StyleBoxFlat" id="StyleBox_scroll_track"] +bg_color = Color(0.005, 0.03, 0.09, 0.72) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="Gradient" id="Gradient_slider_grabber_transparent"] +colors = PackedColorArray(0, 0, 0, 0, 0, 0, 0, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture_slider_grabber_transparent"] +gradient = SubResource("Gradient_slider_grabber_transparent") +width = 1 + +[sub_resource type="StyleBoxFlat" id="StyleBox_slider_fill"] +content_margin_top = 18.0 +content_margin_bottom = 18.0 +bg_color = Color(0.25, 0.78, 0.2, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.72, 1, 0.58, 1) +corner_radius_top_left = 18 +corner_radius_top_right = 18 +corner_radius_bottom_right = 18 +corner_radius_bottom_left = 18 + +[sub_resource type="StyleBoxFlat" id="StyleBox_slider_track"] +content_margin_top = 18.0 +content_margin_bottom = 18.0 +bg_color = Color(0.025, 0.075, 0.16, 0.96) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.28, 0.73, 0.23, 1) +corner_radius_top_left = 18 +corner_radius_top_right = 18 +corner_radius_bottom_right = 18 +corner_radius_bottom_left = 18 + +[sub_resource type="StyleBoxTexture" id="StyleBox_keyboard_action_disabled"] +content_margin_left = 12.0 +content_margin_top = 10.0 +content_margin_right = 12.0 +content_margin_bottom = 10.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.36, 0.42, 0.5, 0.7) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keyboard_action_hover"] +content_margin_left = 12.0 +content_margin_top = 10.0 +content_margin_right = 12.0 +content_margin_bottom = 10.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keyboard_action_normal"] +content_margin_left = 12.0 +content_margin_top = 10.0 +content_margin_right = 12.0 +content_margin_bottom = 10.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keyboard_action_pressed"] +content_margin_left = 12.0 +content_margin_top = 12.0 +content_margin_right = 12.0 +content_margin_bottom = 8.0 +texture = ExtResource("3_button_long") +texture_margin_left = 20.0 +texture_margin_top = 16.0 +texture_margin_right = 20.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(55, 0, 402, 64) +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keypad_disabled"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +texture = ExtResource("8_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(0.36, 0.42, 0.5, 0.7) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keypad_hover"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +texture = ExtResource("8_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(1.12, 1.12, 1.12, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_keypad_normal"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +texture = ExtResource("8_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 + +[sub_resource type="StyleBoxTexture" id="StyleBox_keypad_pressed"] +content_margin_left = 8.0 +content_margin_top = 10.0 +content_margin_right = 8.0 +content_margin_bottom = 6.0 +texture = ExtResource("8_button_square") +texture_margin_left = 12.0 +texture_margin_top = 12.0 +texture_margin_right = 12.0 +texture_margin_bottom = 12.0 +modulate_color = Color(0.72, 0.8, 0.76, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBox_input_focus"] +content_margin_left = 18.0 +content_margin_top = 12.0 +content_margin_right = 18.0 +content_margin_bottom = 12.0 +texture = ExtResource("11_sum_bar") +texture_margin_left = 16.0 +texture_margin_top = 16.0 +texture_margin_right = 16.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(111, 0, 290, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_input_normal"] +content_margin_left = 18.0 +content_margin_top = 12.0 +content_margin_right = 18.0 +content_margin_bottom = 12.0 +texture = ExtResource("11_sum_bar") +texture_margin_left = 16.0 +texture_margin_top = 16.0 +texture_margin_right = 16.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(111, 0, 290, 64) + +[sub_resource type="StyleBoxTexture" id="StyleBox_input_read_only"] +content_margin_left = 18.0 +content_margin_top = 12.0 +content_margin_right = 18.0 +content_margin_bottom = 12.0 +texture = ExtResource("11_sum_bar") +texture_margin_left = 16.0 +texture_margin_top = 16.0 +texture_margin_right = 16.0 +texture_margin_bottom = 16.0 +region_rect = Rect2(111, 0, 290, 64) +modulate_color = Color(0.72, 0.78, 0.75, 0.86) + +[sub_resource type="StyleBoxFlat" id="StyleBox_panel_safe"] +content_margin_left = 28.0 +content_margin_top = 24.0 +content_margin_right = 28.0 +content_margin_bottom = 24.0 +bg_color = Color(0.008, 0.047, 0.145, 0.92) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.31, 0.75, 0.24, 0.96) +corner_radius_top_left = 16 +corner_radius_top_right = 16 +corner_radius_bottom_right = 16 +corner_radius_bottom_left = 16 +shadow_color = Color(0.015, 0, 0.12, 0.62) +shadow_size = 10 + +[sub_resource type="StyleBoxTexture" id="StyleBox_panel_reference_44"] +content_margin_left = 22.0 +content_margin_top = 10.0 +content_margin_right = 22.0 +content_margin_bottom = 18.0 +texture = ExtResource("5_panel") +texture_margin_left = 22.0 +texture_margin_top = 44.0 +texture_margin_right = 22.0 +texture_margin_bottom = 18.0 +region_rect = Rect2(4, 34, 504, 186) + +[sub_resource type="StyleBoxEmpty" id="StyleBox_tab_panel"] + +[sub_resource type="StyleBoxFlat" id="StyleBox_status"] +content_margin_left = 22.0 +content_margin_top = 10.0 +content_margin_right = 22.0 +content_margin_bottom = 18.0 +bg_color = Color(0.96, 0.98, 1, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.42, 0.86, 0.31, 1) +corner_radius_top_left = 18 +corner_radius_top_right = 18 +corner_radius_bottom_right = 18 +corner_radius_bottom_left = 18 + +[sub_resource type="StyleBoxFlat" id="StyleBox_tab_selected"] +content_margin_left = 10.0 +content_margin_top = 5.0 +content_margin_right = 10.0 +content_margin_bottom = 5.0 +bg_color = Color(0.45, 0.86, 0.31, 1) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color(0.72, 1, 0.58, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBox_tab_unselected"] +content_margin_left = 10.0 +content_margin_top = 5.0 +content_margin_right = 10.0 +content_margin_bottom = 5.0 +bg_color = Color(0.005, 0.03, 0.09, 0.94) + +[sub_resource type="StyleBoxTexture" id="StyleBox_panel_reference"] +content_margin_left = 22.0 +content_margin_top = 10.0 +content_margin_right = 22.0 +content_margin_bottom = 18.0 +texture = ExtResource("5_panel") +texture_margin_left = 22.0 +texture_margin_top = 66.0 +texture_margin_right = 22.0 +texture_margin_bottom = 18.0 +region_rect = Rect2(4, 34, 504, 186) + +[resource] +default_font = ExtResource("1_font") +default_font_size = 28 +AdvertisementPanel/base_type = &"PanelContainer" +AdvertisementPanel/styles/panel = SubResource("StyleBox_advertisement") +BackButton/base_type = &"Button" +BackButton/colors/font_color = Color(0.96, 0.98, 1, 1) +BackButton/font_sizes/font_size = 14 +BackButton/styles/focus = SubResource("StyleBox_focus") +BackButton/styles/hover = SubResource("StyleBox_back") +BackButton/styles/normal = SubResource("StyleBox_back") +BackButton/styles/pressed = SubResource("StyleBox_back") +Button/colors/font_color = Color(0.005, 0.03, 0.08, 1) +Button/colors/font_disabled_color = Color(0.72, 0.78, 0.82, 0.72) +Button/colors/font_hover_color = Color(0, 0.015, 0.05, 1) +Button/colors/font_outline_color = Color(0, 0, 0, 0) +Button/colors/font_pressed_color = Color(0.94, 1, 0.9, 1) +Button/constants/outline_size = 0 +Button/font_sizes/font_size = 32 +Button/styles/disabled = SubResource("StyleBox_button_disabled") +Button/styles/focus = SubResource("StyleBox_focus") +Button/styles/hover = SubResource("StyleBox_button_hover") +Button/styles/normal = SubResource("StyleBox_button_normal") +Button/styles/pressed = SubResource("StyleBox_button_pressed") +CancelButton/base_type = &"Button" +CancelButton/colors/font_color = Color(1, 0.96, 0.92, 1) +CancelButton/colors/font_hover_color = Color(1, 1, 1, 1) +CancelButton/colors/font_pressed_color = Color(1, 0.95, 0.9, 1) +CancelButton/font_sizes/font_size = 18 +CancelButton/styles/disabled = SubResource("StyleBox_danger_disabled") +CancelButton/styles/focus = SubResource("StyleBox_focus") +CancelButton/styles/hover = SubResource("StyleBox_danger_hover") +CancelButton/styles/normal = SubResource("StyleBox_danger_normal") +CancelButton/styles/pressed = SubResource("StyleBox_danger_pressed") +CheckButton/colors/font_color = Color(0.005, 0.03, 0.08, 1) +CheckButton/colors/font_disabled_color = Color(0.015, 0.08, 0.14, 0.62) +CheckButton/colors/font_hover_color = Color(0, 0.015, 0.05, 1) +CheckButton/colors/font_hover_pressed_color = Color(0, 0.015, 0.05, 1) +CheckButton/colors/font_pressed_color = Color(0, 0.015, 0.05, 1) +CheckButton/constants/check_v_offset = 0 +CheckButton/constants/h_separation = 0 +CheckButton/constants/icon_max_width = 128 +CheckButton/font_sizes/font_size = 18 +CheckButton/icons/checked = ExtResource("6_check_on") +CheckButton/icons/checked_disabled = ExtResource("6_check_on") +CheckButton/icons/unchecked = ExtResource("7_check_off") +CheckButton/icons/unchecked_disabled = ExtResource("7_check_off") +CheckButton/styles/disabled = SubResource("StyleBox_check_disabled") +CheckButton/styles/focus = SubResource("StyleBox_focus") +CheckButton/styles/hover = SubResource("StyleBox_check_hover") +CheckButton/styles/hover_pressed = SubResource("StyleBox_check_pressed") +CheckButton/styles/normal = SubResource("StyleBox_check_normal") +CheckButton/styles/pressed = SubResource("StyleBox_check_pressed") +CompactButton/base_type = &"Button" +CompactButton/font_sizes/font_size = 24 +CompactButton/styles/disabled = SubResource("StyleBox_button_disabled") +CompactButton/styles/focus = SubResource("StyleBox_focus") +CompactButton/styles/hover = SubResource("StyleBox_compact_normal") +CompactButton/styles/normal = SubResource("StyleBox_compact_normal") +CompactButton/styles/pressed = SubResource("StyleBox_compact_pressed") +DangerButton/base_type = &"Button" +DangerButton/colors/font_color = Color(1, 0.96, 0.92, 1) +DangerButton/colors/font_hover_color = Color(1, 1, 1, 1) +DangerButton/colors/font_pressed_color = Color(1, 0.95, 0.9, 1) +DangerButton/font_sizes/font_size = 18 +DangerButton/styles/disabled = SubResource("StyleBox_danger_disabled") +DangerButton/styles/focus = SubResource("StyleBox_focus") +DangerButton/styles/hover = SubResource("StyleBox_danger_hover") +DangerButton/styles/normal = SubResource("StyleBox_danger_normal") +DangerButton/styles/pressed = SubResource("StyleBox_danger_pressed") +ErrorText/base_type = &"Label" +ErrorText/colors/font_color = Color(0.56, 0.015, 0.045, 1) +ErrorText/colors/font_shadow_color = Color(0, 0, 0, 0) +ErrorText/font_sizes/font_size = 18 +FieldLabel/base_type = &"Label" +FieldLabel/colors/font_color = Color(0.01, 0.055, 0.3, 1) +FieldLabel/colors/font_shadow_color = Color(0, 0, 0, 0) +FieldLabel/font_sizes/font_size = 18 +FooterPanel/base_type = &"PanelContainer" +FooterPanel/styles/panel = SubResource("StyleBox_footer") +HScrollBar/styles/grabber = SubResource("StyleBox_scroll_grabber") +HScrollBar/styles/grabber_highlight = SubResource("StyleBox_scroll_grabber") +HScrollBar/styles/grabber_pressed = SubResource("StyleBox_scroll_grabber") +HScrollBar/styles/scroll = SubResource("StyleBox_scroll_track") +HScrollBar/styles/scroll_focus = SubResource("StyleBox_scroll_track") +HSlider/constants/center_grabber = 1 +HSlider/icons/grabber = SubResource("GradientTexture_slider_grabber_transparent") +HSlider/icons/grabber_disabled = SubResource("GradientTexture_slider_grabber_transparent") +HSlider/icons/grabber_highlight = SubResource("GradientTexture_slider_grabber_transparent") +HSlider/styles/grabber_area = SubResource("StyleBox_slider_fill") +HSlider/styles/grabber_area_highlight = SubResource("StyleBox_slider_fill") +HSlider/styles/slider = SubResource("StyleBox_slider_track") +KeyboardActionButton/base_type = &"Button" +KeyboardActionButton/font_sizes/font_size = 22 +KeyboardActionButton/styles/disabled = SubResource("StyleBox_keyboard_action_disabled") +KeyboardActionButton/styles/focus = SubResource("StyleBox_focus") +KeyboardActionButton/styles/hover = SubResource("StyleBox_keyboard_action_hover") +KeyboardActionButton/styles/normal = SubResource("StyleBox_keyboard_action_normal") +KeyboardActionButton/styles/pressed = SubResource("StyleBox_keyboard_action_pressed") +KeypadButton/base_type = &"Button" +KeypadButton/font_sizes/font_size = 24 +KeypadButton/styles/disabled = SubResource("StyleBox_keypad_disabled") +KeypadButton/styles/focus = SubResource("StyleBox_focus") +KeypadButton/styles/hover = SubResource("StyleBox_keypad_hover") +KeypadButton/styles/normal = SubResource("StyleBox_keypad_normal") +KeypadButton/styles/pressed = SubResource("StyleBox_keypad_pressed") +Label/colors/font_color = Color(1, 1, 1, 1) +Label/colors/font_shadow_color = Color(0, 0, 0, 0) +Label/constants/shadow_offset_x = 0 +Label/constants/shadow_offset_y = 0 +Label/font_sizes/font_size = 28 +LineEdit/colors/caret_color = Color(0.035, 0.13, 0.47, 1) +LineEdit/colors/font_color = Color(0.005, 0.012, 0.05, 1) +LineEdit/colors/font_placeholder_color = Color(0.22, 0.28, 0.38, 0.76) +LineEdit/colors/font_uneditable_color = Color(0.22, 0.28, 0.38, 0.8) +LineEdit/colors/selection_color = Color(0.25, 0.78, 0.2, 0.42) +LineEdit/font_sizes/font_size = 24 +LineEdit/styles/focus = SubResource("StyleBox_input_focus") +LineEdit/styles/normal = SubResource("StyleBox_input_normal") +LineEdit/styles/read_only = SubResource("StyleBox_input_read_only") +OptionButton/colors/font_color = Color(0.005, 0.03, 0.08, 1) +OptionButton/colors/font_hover_color = Color(0, 0.015, 0.05, 1) +OptionButton/colors/font_pressed_color = Color(0.94, 1, 0.9, 1) +OptionButton/font_sizes/font_size = 22 +OptionButton/styles/focus = SubResource("StyleBox_focus") +OptionButton/styles/hover = SubResource("StyleBox_input_normal") +OptionButton/styles/normal = SubResource("StyleBox_input_normal") +OptionButton/styles/pressed = SubResource("StyleBox_input_focus") +PanelContainer/styles/panel = SubResource("StyleBox_panel_safe") +PanelText/base_type = &"Label" +PanelText/colors/font_color = Color(0.005, 0.012, 0.05, 1) +PanelText/colors/font_shadow_color = Color(0, 0, 0, 0) +PanelText/font_sizes/font_size = 25 +PanelTitle/base_type = &"Label" +PanelTitle/colors/font_color = Color(0.01, 0.055, 0.3, 1) +PanelTitle/colors/font_shadow_color = Color(0, 0, 0, 0) +PanelTitle/font_sizes/font_size = 27 +PrimaryButton/base_type = &"Button" +PrimaryButton/font_sizes/font_size = 40 +PrimaryButton/styles/disabled = SubResource("StyleBox_button_disabled") +PrimaryButton/styles/focus = SubResource("StyleBox_focus") +PrimaryButton/styles/hover = SubResource("StyleBox_button_hover") +PrimaryButton/styles/normal = SubResource("StyleBox_button_normal") +PrimaryButton/styles/pressed = SubResource("StyleBox_button_pressed") +ReferencePanel/base_type = &"PanelContainer" +ReferencePanel/styles/panel = SubResource("StyleBox_panel_reference_44") +ScreenDescription/base_type = &"Label" +ScreenDescription/colors/font_color = Color(1, 1, 1, 1) +ScreenDescription/colors/font_shadow_color = Color(0, 0, 0, 0) +ScreenDescription/constants/shadow_offset_x = 0 +ScreenDescription/constants/shadow_offset_y = 0 +ScreenDescription/font_sizes/font_size = 18 +ScreenTitle/base_type = &"Label" +ScreenTitle/colors/font_color = Color(1, 1, 1, 1) +ScreenTitle/colors/font_shadow_color = Color(0, 0, 0, 0) +ScreenTitle/constants/shadow_offset_x = 0 +ScreenTitle/constants/shadow_offset_y = 0 +ScreenTitle/font_sizes/font_size = 36 +SecondaryButton/base_type = &"Button" +SecondaryButton/font_sizes/font_size = 22 +SecondaryButton/styles/disabled = SubResource("StyleBox_button_disabled") +SecondaryButton/styles/focus = SubResource("StyleBox_focus") +SecondaryButton/styles/hover = SubResource("StyleBox_compact_normal") +SecondaryButton/styles/normal = SubResource("StyleBox_compact_normal") +SecondaryButton/styles/pressed = SubResource("StyleBox_compact_pressed") +SectionTabButton/base_type = &"Button" +SectionTabButton/font_sizes/font_size = 18 +SectionTabButton/styles/disabled = SubResource("StyleBox_button_disabled") +SectionTabButton/styles/focus = SubResource("StyleBox_focus") +SectionTabButton/styles/hover = SubResource("StyleBox_compact_normal") +SectionTabButton/styles/normal = SubResource("StyleBox_compact_normal") +SectionTabButton/styles/pressed = SubResource("StyleBox_compact_pressed") +SpinBox/colors/down_disabled_icon_modulate = Color(1, 1, 1, 0.55) +SpinBox/colors/down_hover_icon_modulate = Color(1, 1, 1, 1) +SpinBox/colors/down_icon_modulate = Color(1, 1, 1, 1) +SpinBox/colors/down_pressed_icon_modulate = Color(1, 1, 1, 1) +SpinBox/colors/up_disabled_icon_modulate = Color(1, 1, 1, 0.55) +SpinBox/colors/up_hover_icon_modulate = Color(1, 1, 1, 1) +SpinBox/colors/up_icon_modulate = Color(1, 1, 1, 1) +SpinBox/colors/up_pressed_icon_modulate = Color(1, 1, 1, 1) +SpinBox/constants/buttons_vertical_separation = 0 +SpinBox/constants/buttons_width = 32 +SpinBox/constants/field_and_buttons_separation = 10 +SpinBox/constants/set_min_buttons_width_from_icons = 1 +SpinBox/icons/down = ExtResource("10_button_down") +SpinBox/icons/down_disabled = ExtResource("10_button_down") +SpinBox/icons/down_hover = ExtResource("10_button_down") +SpinBox/icons/down_pressed = ExtResource("10_button_down") +SpinBox/icons/up = ExtResource("9_button_up") +SpinBox/icons/up_disabled = ExtResource("9_button_up") +SpinBox/icons/up_hover = ExtResource("9_button_up") +SpinBox/icons/up_pressed = ExtResource("9_button_up") +SpinBox/styles/down_background = SubResource("StyleBox_tab_panel") +SpinBox/styles/down_background_disabled = SubResource("StyleBox_tab_panel") +SpinBox/styles/down_background_hovered = SubResource("StyleBox_tab_panel") +SpinBox/styles/down_background_pressed = SubResource("StyleBox_tab_panel") +SpinBox/styles/field_and_buttons_separator = SubResource("StyleBox_tab_panel") +SpinBox/styles/up_background = SubResource("StyleBox_tab_panel") +SpinBox/styles/up_background_disabled = SubResource("StyleBox_tab_panel") +SpinBox/styles/up_background_hovered = SubResource("StyleBox_tab_panel") +SpinBox/styles/up_background_pressed = SubResource("StyleBox_tab_panel") +SpinBox/styles/up_down_buttons_separator = SubResource("StyleBox_tab_panel") +SpinBoxInnerLineEdit/base_type = &"LineEdit" +SpinBoxInnerLineEdit/font_sizes/font_size = 18 +StatusPanel/base_type = &"PanelContainer" +StatusPanel/styles/panel = SubResource("StyleBox_status") +StatusText/base_type = &"Label" +StatusText/colors/font_color = Color(0.005, 0.012, 0.05, 1) +StatusText/colors/font_shadow_color = Color(0, 0, 0, 0) +StatusText/font_sizes/font_size = 18 +SupportText/base_type = &"Label" +SupportText/colors/font_color = Color(1, 1, 1, 1) +SupportText/colors/font_shadow_color = Color(0, 0, 0, 0) +SupportText/constants/shadow_offset_x = 0 +SupportText/constants/shadow_offset_y = 0 +SupportText/font_sizes/font_size = 18 +TabContainer/colors/font_hovered_color = Color(0.96, 1, 0.9, 1) +TabContainer/colors/font_selected_color = Color(0.02, 0.08, 0.18, 1) +TabContainer/colors/font_unselected_color = Color(0.92, 0.98, 1, 1) +TabContainer/font_sizes/font_size = 13 +TabContainer/styles/panel = SubResource("StyleBox_tab_panel") +TabContainer/styles/tab_hovered = SubResource("StyleBox_tab_selected") +TabContainer/styles/tab_selected = SubResource("StyleBox_tab_selected") +TabContainer/styles/tab_unselected = SubResource("StyleBox_tab_unselected") +VScrollBar/styles/grabber = SubResource("StyleBox_scroll_grabber") +VScrollBar/styles/grabber_highlight = SubResource("StyleBox_scroll_grabber") +VScrollBar/styles/grabber_pressed = SubResource("StyleBox_scroll_grabber") +VScrollBar/styles/scroll = SubResource("StyleBox_scroll_track") +VScrollBar/styles/scroll_focus = SubResource("StyleBox_scroll_track") +WarningText/base_type = &"Label" +WarningText/colors/font_color = Color(0.52, 0.3, 0.02, 1) +WarningText/colors/font_shadow_color = Color(0, 0, 0, 0) +WarningText/font_sizes/font_size = 18 +WhitePanel/base_type = &"PanelContainer" +WhitePanel/styles/panel = SubResource("StyleBox_panel_reference") diff --git a/themes/space-pixel/package/visuals/card_terminal.tscn b/themes/space-pixel/package/visuals/card_terminal.tscn new file mode 100644 index 0000000..f0a3712 --- /dev/null +++ b/themes/space-pixel/package/visuals/card_terminal.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3] + +[ext_resource type="Texture2D" path="../assets/animations/card/frame_01.png" id="1_card"] +[ext_resource type="Texture2D" path="../assets/animations/card/frame_02.png" id="2_card"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_card"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("1_card")}, {"duration": 1.0, "texture": ExtResource("2_card")}], "loop": true, "name": &"default", "speed": 1.0}] + +[node name="CardTerminal" type="Control"] +custom_minimum_size = Vector2(0, 0) +mouse_filter = 2 + +[node name="Animation" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(286, 183) +scale = Vector2(0.68, 0.68) +sprite_frames = SubResource("SpriteFrames_card") +autoplay = "default" diff --git a/themes/space-pixel/package/visuals/cash_instructions.tscn b/themes/space-pixel/package/visuals/cash_instructions.tscn new file mode 100644 index 0000000..af000d4 --- /dev/null +++ b/themes/space-pixel/package/visuals/cash_instructions.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=9 format=3] + +[ext_resource type="Texture2D" path="../assets/animations/bill/frame_01.png" id="1_bill_1"] +[ext_resource type="Texture2D" path="../assets/animations/bill/frame_02.png" id="2_bill_2"] +[ext_resource type="Texture2D" path="../assets/animations/bill/frame_03.png" id="3_bill_3"] +[ext_resource type="Texture2D" path="../assets/animations/bill/frame_04.png" id="4_bill_4"] +[ext_resource type="Texture2D" path="../assets/animations/coin/frame_01.png" id="5_coin_1"] +[ext_resource type="Texture2D" path="../assets/animations/coin/frame_02.png" id="6_coin_2"] +[ext_resource type="Texture2D" path="../assets/animations/coin/frame_03.png" id="7_coin_3"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_bill"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("1_bill_1")}, {"duration": 1.0, "texture": ExtResource("2_bill_2")}, {"duration": 1.0, "texture": ExtResource("3_bill_3")}, {"duration": 1.0, "texture": ExtResource("4_bill_4")}], "loop": true, "name": &"default", "speed": 4.0}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_coin"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("5_coin_1")}, {"duration": 1.0, "texture": ExtResource("6_coin_2")}, {"duration": 1.0, "texture": ExtResource("7_coin_3")}], "loop": true, "name": &"default", "speed": 3.0}] + +[node name="CashInstructions" type="Control"] +custom_minimum_size = Vector2(648, 322) +mouse_filter = 2 + +[node name="Bill" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(188, 93) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_bill") +autoplay = "default" + +[node name="Coin" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(184, 241) +scale = Vector2(0.667, 0.667) +sprite_frames = SubResource("SpriteFrames_coin") +autoplay = "default" diff --git a/themes/space-pixel/package/visuals/cash_tip.tscn b/themes/space-pixel/package/visuals/cash_tip.tscn new file mode 100644 index 0000000..610de3c --- /dev/null +++ b/themes/space-pixel/package/visuals/cash_tip.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=3 format=3] + +[ext_resource type="Texture2D" path="../assets/decorations/alien3.png" id="1_alien"] +[ext_resource type="Texture2D" path="../assets/ui/bubble_text.png" id="2_bubble"] + +[node name="CashTip" type="Control"] +custom_minimum_size = Vector2(303, 125) +mouse_filter = 2 + +[node name="Bubble" type="TextureRect" parent="."] +texture_filter = 1 +offset_left = -75.0 +offset_top = -1.0 +offset_right = 266.0 +offset_bottom = 84.0 +mouse_filter = 2 +texture = ExtResource("2_bubble") +expand_mode = 1 +stretch_mode = 0 + +[node name="Header" type="Label" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 12.0 +offset_right = 177.0 +offset_bottom = 35.0 +theme_type_variation = &"PanelText" +theme_override_font_sizes/font_size = 11 +text = "ОЙ, СОВСЕМ ЗАБЫЛ:" +vertical_alignment = 1 +pivot_offset = Vector2(0, 11.5) +scale = Vector2(1.31, 1) + +[node name="Message" type="Label" parent="."] +layout_mode = 0 +offset_left = 15.0 +offset_top = 37.0 +offset_right = 180.0 +offset_bottom = 75.0 +theme_type_variation = &"PanelText" +theme_override_colors/font_color = Color(0, 0.0627451, 0.552941, 1) +theme_override_font_sizes/font_size = 11 +text = "АВТОМАТ ВЕДЬ\nСДАЧИ НЕ ДАЁТ!" +vertical_alignment = 1 +pivot_offset = Vector2(0, 18) +scale = Vector2(1.2, 1) + +[node name="Alien" type="TextureRect" parent="."] +texture_filter = 1 +offset_left = 146.0 +offset_top = -17.0 +offset_right = 317.0 +offset_bottom = 154.0 +mouse_filter = 2 +texture = ExtResource("1_alien") +expand_mode = 1 +stretch_mode = 0 diff --git a/themes/space-pixel/package/visuals/home_advertisement.tscn b/themes/space-pixel/package/visuals/home_advertisement.tscn new file mode 100644 index 0000000..ae8cde7 --- /dev/null +++ b/themes/space-pixel/package/visuals/home_advertisement.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Texture2D" path="../assets/ui/billboard_ads.png" id="1_billboard"] + +[node name="HomeAdvertisement" type="Control"] +custom_minimum_size = Vector2(720, 342) +mouse_filter = 2 + +[node name="Billboard" type="TextureRect" parent="."] +texture_filter = 1 +offset_left = 18.0 +offset_top = 12.0 +offset_right = 701.0 +offset_bottom = 352.0 +mouse_filter = 2 +texture = ExtResource("1_billboard") +expand_mode = 1 +stretch_mode = 0 diff --git a/themes/space-pixel/package/visuals/home_top.tscn b/themes/space-pixel/package/visuals/home_top.tscn new file mode 100644 index 0000000..11577b7 --- /dev/null +++ b/themes/space-pixel/package/visuals/home_top.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Texture2D" path="../assets/decorations/alien1.png" id="1_left"] +[ext_resource type="Texture2D" path="../assets/decorations/alien2.png" id="2_right"] +[ext_resource type="Texture2D" path="../assets/ui/bubble_text.png" id="3_bubble"] +[ext_resource type="Script" path="../scripts/home_ufo_bobbing.gd" id="4_bobbing"] + +[node name="HomeTop" type="Control"] +custom_minimum_size = Vector2(720, 300) +mouse_filter = 2 +script = ExtResource("4_bobbing") + +[node name="AlienLeft" type="TextureRect" parent="."] +texture_filter = 1 +offset_left = 17.0 +offset_top = 130.0 +offset_right = 187.0 +offset_bottom = 300.0 +mouse_filter = 2 +texture = ExtResource("1_left") +expand_mode = 1 +stretch_mode = 5 + +[node name="CustomTextBlock" type="Control" parent="."] +metadata/exchanger_binding_id = "home.decoration.custom_text_block" +mouse_filter = 2 + +[node name="AlienRight" type="TextureRect" parent="CustomTextBlock"] +metadata/exchanger_binding_id = "home.decoration.right_character" +texture_filter = 1 +offset_left = 536.0 +offset_top = 83.0 +offset_right = 706.0 +offset_bottom = 253.0 +mouse_filter = 2 +texture = ExtResource("2_right") +expand_mode = 1 +stretch_mode = 5 + +[node name="Speech" type="TextureRect" parent="CustomTextBlock"] +texture_filter = 1 +offset_left = 331.0 +offset_top = 59.0 +offset_right = 667.0 +offset_bottom = 141.0 +mouse_filter = 2 +texture = ExtResource("3_bubble") +expand_mode = 1 +stretch_mode = 0 diff --git a/themes/space-pixel/package/visuals/result_error.tscn b/themes/space-pixel/package/visuals/result_error.tscn new file mode 100644 index 0000000..adc472f --- /dev/null +++ b/themes/space-pixel/package/visuals/result_error.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Texture2D" path="../assets/animations/payment_failed/frame_01.png" id="1"] +[ext_resource type="Texture2D" path="../assets/animations/payment_failed/frame_02.png" id="2"] +[ext_resource type="Texture2D" path="../assets/animations/payment_failed/frame_03.png" id="3"] + +[sub_resource type="SpriteFrames" id="Frames"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("1")}, {"duration": 1.0, "texture": ExtResource("2")}, {"duration": 1.0, "texture": ExtResource("3")}], "loop": true, "name": &"default", "speed": 3.0}] + +[node name="ResultError" type="Control"] +custom_minimum_size = Vector2(484, 538) +mouse_filter = 2 + +[node name="Animation" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(242, 220) +scale = Vector2(0.72, 0.72) +sprite_frames = SubResource("Frames") +autoplay = "default" diff --git a/themes/space-pixel/package/visuals/result_success.tscn b/themes/space-pixel/package/visuals/result_success.tscn new file mode 100644 index 0000000..1593258 --- /dev/null +++ b/themes/space-pixel/package/visuals/result_success.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=7 format=3] + +[ext_resource type="Texture2D" path="../assets/animations/payment_success/frame_01.png" id="1"] +[ext_resource type="Texture2D" path="../assets/animations/payment_success/frame_02.png" id="2"] +[ext_resource type="Texture2D" path="../assets/animations/payment_success/frame_03.png" id="3"] +[ext_resource type="Texture2D" path="../assets/animations/payment_success/frame_04.png" id="4"] +[ext_resource type="Texture2D" path="../assets/animations/payment_success/frame_05.png" id="5"] + +[sub_resource type="SpriteFrames" id="Frames"] +animations = [{"frames": [{"duration": 1.0, "texture": ExtResource("1")}, {"duration": 1.0, "texture": ExtResource("2")}, {"duration": 1.0, "texture": ExtResource("3")}, {"duration": 1.0, "texture": ExtResource("4")}, {"duration": 1.0, "texture": ExtResource("5")}], "loop": true, "name": &"default", "speed": 5.0}] + +[node name="ResultSuccess" type="Control"] +custom_minimum_size = Vector2(484, 538) +mouse_filter = 2 + +[node name="Animation" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +position = Vector2(242, 220) +scale = Vector2(0.72, 0.72) +sprite_frames = SubResource("Frames") +autoplay = "default" diff --git a/themes/space-pixel/source/Bubble_addtext.png b/themes/space-pixel/source/Bubble_addtext.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9736353576985af91620813544e6cce5a3374 GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0y~yU;;838aUX1WNr9GZXm^3;1OBOz`!jG!i)^F=12fl zUH5cx45^s&_U=WmmIMjci#?V9!_BywIE-eioy}igdewD;IrHw%{kzt@{>8$u#b$mj zBg27@dFp?B*B!QDIUaFtA48Q61A~AH1B1c|L5Jy;^6S1SGtd0H@Mn)TUxGQ%X)K%!3>-pGW5Bw0Gd%lnw*G)Da!N9PsqiG>9Jnd7z$sdSC4tt_Q<{q2H z^WK=a^PDwLdTVnwfnpn<-V@CY&prew95`Hm<1ENq=n?uvuVLmLK?d11&K!K}#>L?zd3bcefJ(>U^reI; zOA9w2i!OMOa_?y9Wp3n!kIt+Q87x+j|C!f=?v_~Sy4YOnKc9;mGrCGXo3;5%OX&3O z?6v1l=EBaAYKouDkM)h}x5%BB^!n{}H@VLX%IFp2kE1mlY~9>$8&GH8i_i_!3~NsW zI;sQhlKS-h~T}<-OUXkNVK8exQTvz|K|PtSbVhbj|!j z-iN*U5VUJmV8?!6Pu#B`KPPdYA8b*UqbFU{5k9a&N3QT_cLnx}Z+kJ_`MrcyWxs-s zGpRkj-9178bb`Z}EQ?1rjg%S;t~BhY4JMbG&zN)@Y`?}v*|DdDt7rGqI7528plnc& zb%tiA8$fG#JA0BD5RQWb?05}g*4Y4=hw{8uBX9jd;(J*dY@8jhI%{1{lDR!z) zE5CDpS4KeKmrN+aZ$;Q3a9zk1S}!R%98Wic+-Xn z5x`5({i{C69ACrt&x%)t!gqIvEdgxqrdAJ z$geKPcGug<>$-GUJY>3YIp-%*JE%k(k8*_vunlZ#7tz(6UsvSbTBCbeL<;ePJc4Ph zqM33lx=x!q3W~%R@%mbHq0d)iLQ|t*QwMmA8Yr5(f+L^xUhjo_p(uM9L0;oO5{`F9AVRq zo{&(EJ}$)?u$-L9(DW#_yHTgJh%EZKY+Il`EfnU9{&?Crm#W6$k;SfAQM;4FM;8uurCo%PjpDudd5X literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Window_k_vidache.png.import b/themes/space-pixel/source/Window_k_vidache.png.import new file mode 100644 index 0000000..8f038ce --- /dev/null +++ b/themes/space-pixel/source/Window_k_vidache.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm7uaxf8dnwwg" +path="res://.godot/imported/Window_k_vidache.png-d8dab70fb2e2b8a7d21eca79a8e6fd02.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Window_k_vidache.png" +dest_files=["res://.godot/imported/Window_k_vidache.png-d8dab70fb2e2b8a7d21eca79a8e6fd02.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Window_paycard.png b/themes/space-pixel/source/Window_paycard.png new file mode 100644 index 0000000000000000000000000000000000000000..7d585fbdd360e620751f9bd84f93b5618a6ec374 GIT binary patch literal 7111 zcmeHL>r-1r6h8?ugtP%1oWhVcp;C*L&|(#cLK8p)0yDHqD>_9IEf$nV_gocs=Nv^xl5BkA>0PlyKvpKu> zoZYj(``f*zZeL0QkL%9`0G=!{?o|L5YO;XCMoP6MxCSW?W#StJ02_Spj{!}m`~di6 zvbdQ2rKj#qKbw6Z%a52X_%+7&WXjI!)Zjwpcl)^^nR!`htx2ubsi!lai47WRyQ2>) z=x2+bNN(QDy(&}wrGF}UI=}Auyu^mmklSAtSXQEvN!D1)e7U8>HFDdwgyKR+&vS=_ zxFN1&V#VTM=^cP&G=U{B=nj+xIwdq1PzKi7`=KnJ@N&$z8-uE-`w14&0%gjNs$BZK z9y8Pit)}45DeI>6<%M&aD~uV+)1~F_H6}-HM4cjWONOCuH~%$qVuzP2i03@GODFw4 zkO4q;=BM|UnM}+5epW}TG=35qFB)x^G8p3ghtl_~5mq+<4L3${$=f>LbFx;?CS^5) zrx6DcZIdsCYR$uhb7`^HTXV-*lJhutQa`%as%oStWPA3UrEF2bX*|D$(O>|B(8Y5h zbH_oBp*fKy?lQTXf4-@-URL$2;1K4miV|j*W!#PYSXiufl(e|8wZ41%Zp+R+usQPq z4*AjaXFU+lLvDa;>5EB);sWh)Dr_I+wp=h5L-5kG|CciFK<#mr3uda>(lp+9Tya%+XDszqxBXW(t zGVVsqqUivWF*DS>a-nJ)YTxQZ9*_xd1#pz^Sg{OP5|4bW_55=J>#Sqc)5khtk=Iw^ zm5ReAeJ#90U90)S0C+glVE;{m52t}5wNS!8a}FP<>+KB)S9+weTE@b>FjMG(m3L?oi0=yE zEdG?%jLuP!fjVk%csNA4lX)Bk+49jxqaSnO*yi z5YOY9;T7Rwp@WPR!lpVX{}B5-lWl7ZS=_;+kjL6UQnpp0MwM_N8^h(cyUY5claGkt%ScJqaRzTu)Jm z)Z3#L&Srwxw0y69*RTW|_o&U17a}^oIjYHLK literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Window_paycard.png.import b/themes/space-pixel/source/Window_paycard.png.import new file mode 100644 index 0000000..e143815 --- /dev/null +++ b/themes/space-pixel/source/Window_paycard.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hvm0048q8gro" +path="res://.godot/imported/Window_paycard.png-1c46b5dff26a49966bfd3902cddb3771.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Window_paycard.png" +dest_files=["res://.godot/imported/Window_paycard.png-1c46b5dff26a49966bfd3902cddb3771.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Window_paynal_balance.png b/themes/space-pixel/source/Window_paynal_balance.png new file mode 100644 index 0000000000000000000000000000000000000000..a815c0a0e38afdfffac67f9200a668cd0bdc3e05 GIT binary patch literal 2310 zcmeAS@N?(olHy`uVBq!ia0y~yU;#22893O0l&&g^3XtL~@Q5sCVBi)8VMc~ob0ioT zICgltIEGZrd3)C|BQ#y2;bHMnNAc-?dQHLFB?YTOxO7u;)5Dj0EpG~5n4;yResJZB zE2hP}*mOj^=gM&1@+^3HMb-OmUZ+W}$K(p#XY-2R|F-cyz;b^6$Ljax|IR%7{1a#| z!;Js^*?E8epNrPqf9-cm`^WEF zs?5m1aNv;Mn;1*;J*?C1_8P1yW%#kb`Tx6Pmw#U3V+MMc``mKzvUO+LL<`DJHUIZ? z{(r6ez5iFIfL*1PxVvDy58*?-ZDA?@?enl0fBebWE>rT*~#0jgQ!BoJZ3 zQuF8SQ^l=}1(zP=zhGxzNO;9}ZryLgg!+B9dMr9s|L;bzG#uXl=HSEo5BP!3(Yp1k zdY-KW)3PG>11e?=-`eY&?SV$U7Go+?7h*i8^SiP7y@kx5FZbX61KCi`abxa*H@m+u ze0bD;SNZ?l<^MsVi`RCZ+3n5Gz#jP*XybyU@+Z0tfgt}dYhVS(Z^G6u3<*Dg&S`L9s3>^;Z<9PH zP_*(LSS2tA00Gk-FvW;$22=*w0S?GohP*_>=EE#C-+oU|mIry>@9eju)rW87fV}7c zN&t30p6uP&58~$EecXP&ZRG|?7!ApMI9$q;k>rm9niYRO+?>G2(ErYE=G)r4JO6*) zB+m;>kBe{3Z@q6{|MqImoZAdH{=DsmB-7+IS?_-}uymNf&G36YD5W3Rbz8FXZ@rK- zL;Foonoqcz>;J_6zpomDOsV7pIgl+4p<636mff9SdHi0>{IkzL8_u_n*_ z9~a|q7LbdV8GZ1t{1D&Cupxs7$ZgnYGwZ{J{gW6UYnNpxFijW^ib-`wadX0O0Y`ztED3>SZZaIuiZG0<*vPl6Yk>e7 z+=d~UP-?owID(+IbHPX*eHSwcuxu1;DU6kpZGfq5afMOJ=<5q{iT}+0Fn`>fb8ha< zJ?A;kea>fxGvDF`h6e)RrHfOK01VnC5WuF*_12rkwBg9bIb{HM$HpR{)`S72%968{6Uwu~A#2hT(<{i@{)YxL84tFFb6h*PGK zJU%W|I3Jk4X^^qW%MH}(Uu~vuw=<5%TpO|Z*4;DtojntK_z|W1F~{@Qh^WD0VRTJ2 z?Bi95ojX}Qzmas^>ROJ}vZ#&o@=n8=AJQAj;N~&f=}-adx$I(>fc@f$x-^m0#kMaQ zsO)CrwP4JbyrL7cf^5iW+6)H^_na3=f8m9N6K`voi>9hKYmL z$*f!RemU%qatbrGtAeB+C9HczeTdu^gyb?NX;7j%#=T8PK< zvPErtA}U?viX`44iKO(Q0OYVs@^ivM#RdYg)yzfzpj)=FJr;Sex_{Im`yWvBiE4XV z|L7?sS?e-2bU8Sx=Bh~kIqK2sy@~z1xUlvO1sN+>7iKyJme}@A;lS~`dZ;Q4%KI++ zL_e)An<{gXO2Xy?VUh2yM zmXr&ut(c6B45>v_mkRu8`6K7e4znoE+x)d@;f6$h*Ro9Im!I}DQ0r?yxz7l_I*=b; zy2?>5pY=^Kq+-_R90FEN&h3@7W-5h{$1~;{$@Va)%wJUuDLQ72azuv{AWv!r-uTFr z<$84&eoT>O1c98(Si4{=5?(fz;|8~mlMFZ_ypB)axiw6@7E9M*?)4Cg5}s9I^uqoq;Q-bNk~u2 KO#MDZTK_i>+R|SD literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Window_paynal_balance_money.png.import b/themes/space-pixel/source/Window_paynal_balance_money.png.import new file mode 100644 index 0000000..46426bd --- /dev/null +++ b/themes/space-pixel/source/Window_paynal_balance_money.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://evbkhli3wy0e" +path="res://.godot/imported/Window_paynal_balance_money.png-a9ed45398ea128d6ba67603c1dd65719.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Window_paynal_balance_money.png" +dest_files=["res://.godot/imported/Window_paynal_balance_money.png-a9ed45398ea128d6ba67603c1dd65719.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Window_paynal_instruction.png b/themes/space-pixel/source/Window_paynal_instruction.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb45b70772a7782b09c521922535a7fd5e90ba3 GIT binary patch literal 7111 zcmeHL|5H>|6hCiS5f(wD3}pGD0}3H*Vn`NWb|o4hMm7Ue%Z3e@<^L}{e-h1wO z_ndpqd7pRBRlSyy;L7vn0f1{#V*Kj>T-4=)lOt-BzPn3M<19@)mJi_a6n+S(uJHok z%aY;`q!rc}b>Z2EPk51c^Lq|>R;37vQ+J<|ew)S%%gQ}*MDwbqIQ7e{khq|(%lC%% z<+nJ7KAn8ghc}uey+5=wS(m4Z$W8pDFl_2lzR4P$OmPR)f6Gm0Y`s&KWuzDCuRWjX zk30Jn9Nci7Fm>OKsfffB2zCN_fprO+49ElQ_kq)ZMTW;26KmdHa8S|@mR0&r`bLz? zs<4$WPVe|SfB>L=7R(-h@rAYxRk7`R>QBQ`X9+X+%i!`&HwP3}mwt_BK|^opR%yX+ zB}~%G%pc_@@k}C`k=FC8^8BJ&I|Po=%>9ZRk?^i%x#-6uaGr0g@TOg9BvT*fel&tx zL>vFw(M(8h8cyEZ2q1ZI)vdR|8ZJ?G#0a>dXBpj_T(Y}!w(G9muo>ACGP)wa6ywFI zdq05+jD&?UWr+~2HS-LoAjpI054C=#94<*`=pHN9mZkgYlx6tO#ewwC!z|Y$?J^=vN%9bf znoieyPc)%XW%E2pmXJB52nwaswk!V5h%1}3O9Bc70B6kJ5bM`?G_&3S(fU`O_zCid zZf?!U+(&G}+!%frlq`6J-OXm$hp?dYr#E_Q-^zN8+Hd zheb9SP!_Psz~U831GZ+ukjP>pi-{-;SWILw5v9R@hl$j)g|zurr5jYt#eQZ~=&m!C zEB>y?gxXQ{IlWM69L}k^4I{L%eC@!k$*_*Mzr)+L1&IJTxDz)bDwr^QBZoG8S4q9p z$e2D_vN3*Zb=01-pxt2S+ngz5fPj&sI;YYFtd020PPN?LCRs|P&FZ1e%CW02D70*M^IWi^#u_1G`sPDU(RK6`}E8K~|lGMDJNH;Udq2AjesX&*jsPf#jn#!kxd?AHLSh?8Zy1izx%$%+QZT2QKB%7kE&A)ek zOc=B?*BU!~te80;-C~^_(-yyBFWR6y%Hk+=LHzn)d!6#H%29;)K>qJ5I(CCN&W~;j sM7Yn!oQvJSx`a&zFRDm?Z^3j|`p*jh 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

kqp-ABNu3W&66H*L)E?q%AF)Sub3 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien1.png.import b/themes/space-pixel/source/alien1.png.import new file mode 100644 index 0000000..ebb63f9 --- /dev/null +++ b/themes/space-pixel/source/alien1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btm80sapoawud" +path="res://.godot/imported/alien1.png-8fad6ca9040d6686523e1c03f8f0abd0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien1.png" +dest_files=["res://.godot/imported/alien1.png-8fad6ca9040d6686523e1c03f8f0abd0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien2.png b/themes/space-pixel/source/alien2.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeccb4746bd8ba834ae8327169f44164bab4f40 GIT binary patch literal 31086 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/climbing_action_stop.png.import b/themes/space-pixel/source/alien_animation/climbing_action_stop.png.import new file mode 100644 index 0000000..187b6e9 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/climbing_action_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://nm0y2hd18npx" +path="res://.godot/imported/climbing_action_stop.png-62e84f7aee7838daacd6b5af28f9adcc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/climbing_action_stop.png" +dest_files=["res://.godot/imported/climbing_action_stop.png-62e84f7aee7838daacd6b5af28f9adcc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/climbing_down.png b/themes/space-pixel/source/alien_animation/climbing_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e409091fecff540d8159017446e61525726094 GIT binary patch literal 30360 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 KOv;Ts;{FdT1BF8X literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/climbing_start.png.import b/themes/space-pixel/source/alien_animation/climbing_start.png.import new file mode 100644 index 0000000..a31ab1a --- /dev/null +++ b/themes/space-pixel/source/alien_animation/climbing_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://diyfb1ls1e5eo" +path="res://.godot/imported/climbing_start.png-a4ae48c7c0659a5edae55cfa41a56a77.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/climbing_start.png" +dest_files=["res://.godot/imported/climbing_start.png-a4ae48c7c0659a5edae55cfa41a56a77.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/climbing_up.png b/themes/space-pixel/source/alien_animation/climbing_up.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfb53e2df8c3ca5e0bc4e54106401a69796823f GIT binary patch literal 31496 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/climbing_up.png.import b/themes/space-pixel/source/alien_animation/climbing_up.png.import new file mode 100644 index 0000000..ae3d175 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/climbing_up.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1p7hg6oxb3b4" +path="res://.godot/imported/climbing_up.png-746e9c7765ab6eda7a269398ad7c1cfe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/climbing_up.png" +dest_files=["res://.godot/imported/climbing_up.png-746e9c7765ab6eda7a269398ad7c1cfe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/come_closer.png b/themes/space-pixel/source/alien_animation/come_closer.png new file mode 100644 index 0000000000000000000000000000000000000000..f3127ee4759e35998a7086f3e2d97338a328f674 GIT binary patch literal 104115 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/come_closer.png.import b/themes/space-pixel/source/alien_animation/come_closer.png.import new file mode 100644 index 0000000..3a77919 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/come_closer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://v8pbjw5d2kqw" +path="res://.godot/imported/come_closer.png-f62687926e3886371acc12f5ec13c0a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/come_closer.png" +dest_files=["res://.godot/imported/come_closer.png-f62687926e3886371acc12f5ec13c0a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/dancing.png b/themes/space-pixel/source/alien_animation/dancing.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2238a3d1e6a95bf61e1935f2fcb0604d041797 GIT binary patch literal 260710 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

hQkkZx3Ga0+Yn1W25F~fgYQrW5_oJ4LZQh&R4ad zN}kkQA`lhJSgcldt06Nc%Ea`M^O>A9)aD>3#aFzc3HYKvS^2}!=ztQ*-p(MEhft@Q zbMawJMs*6fHNiRTPZup+7k+gKi=d?+npr!$FN!VI(o0hdu4M@PlGpDlU_>w87bgmN zAe$}P7t<~j16RL4-H!ed9Mg-G$m4WjUHf1rYj6NH~v9+jC`2auO!cwece`hoqH6EZE^I<%CluXA^usu>ew%i! zVbi(;s!D*4SxCUki1tO2lH%NN!k;6O>|a+td6V|MC41&d5BHT45|ZxKl^@@f3*SM@ z)Ne!}B3g_=vfKXqzlN-zYoykKl(YP*{Afx9OZ-oqy|2DqgFFqX)LPo;!%hm%<{-iw zjA$$r9h1gFf8LTn5^N70N=VpOZ)4vO5_#h9FiGZ2Rm_%^r}#N5+!4*lCqy10FBp~? zNZZMN{;h3gmeH5$g`BffJVitfMESI;0vcBj_#deS=3@8Gt0C0ZY_utq<> z&HU3_!`D=rlpKdV8SFoAEf>>`YPB6^1_Jz!=}7dNN;P7Cabf+`Xgx8mmmzWVF!nLxs~_VRx^Z*P5(0dU>FpWNzgyYXB_1K*@2R5V&{ z_(SosZw}t9nA7Hah5c`B_P%mu1k?xuRU%&#+0gL@w4^>|*%-!O&Zx>!-f&V)9>q_ix9a(%Xf_Is22jS z<_z6j!R3ii4x;BF7A-6W-aJ>IzDQH%AoH~run^6(D(}%Qu4l^gA*$-$u1qeJwUw~i5$bq7~zWxrfuD^Q}+YKj(ze#wuE*R+Xf9RcJ}mgET3qqm*#6h z7UAb|aSMy|O4n(|2Z_1_w1NB7gi5zt%YDTe21I-OBT|fb@B)7y1S+-y_1h#u{JDig zdM1e??Zk-0-L(~Ne0!S+F|1MLDENC2!u}?5P-Xw?DmZDh)Lsl%9sM9r`^pTKf{mAA(taR)5%(TrzW#?JGtgiv?zHN}Q65Ti_j7 z81lx}Z@Q@LKVXaB_1saI^aTq_zPIPoOlS;LjD%79`KdvPOMcs$<@pbAfTR6nEU$kC z{%P!o#YVRE%JaFkX4tQT*q5)!pAi4SG=Mg0SRUl^`{vI-A+TS5S!BOp$XjgE2j$dE zfxrgm_8ns`#LSIpz$}l1UVq)~SJzC9RsAV?v9p2I-O$Vo*&Z(x2$gI4XTk;kI$3t7 zI~8+y`4Hv99P)}kWMYQ0A;`WZ%?mORp#KAWifbKM%H|6#@oaNf80ce=w-or*X!+@9 zi00tJdd8;s{Jo4e7p%Wkz7rba^kZTFH+) zyA09K9)4e>NTzprUHfnLi_bOO%lL6P@V88mG!bXWF z@p6!oLLigINJ8Fz^n7>( z*(t9`5`yeRnpC!8pH=4Yr@QJpm75yapEln)8ue_Luc~9XLcq>VHKrX?tDOVPgeJ61 zk~u5;leWyN2K;6Q)Fn|dY7)62J{OZ_S6dO?2lmdC101*X2XG~{v24O|_vlDDRn!At z?|UrJhTW*gq=A)zqL-22pO9xi+Ph+}XLXH|3yK7elRK`oE%o)c_3}rNKj>F@KW~Fsf!Jbz z=ihN)EzCz2cuk!~XHpXK0LXWl_L#plg_}@>hCk)QaL?Sy!>~1?C#Yho?&3PLOnS>@ zo>~b)u=yd>@K)~^EX|_JKyW(zSY<8ZiSw;KP|M5IVC9ba z;}?M|UOzge?DN_Pg$$+^(=JnN{Nm+$8P@whqgEne_2c=SdDvBF$>{z8yG&84H;3^~ zunvZ0{$wpt`dGYKHsf0pTPrHY68}}XB@$IdL1J6k@Q1mJEqZj$)GQzWwY;KDTdH}_ku{ePL12cL9vBbO5-`G0;b|W zX#FQ&&Nm>7sym>`o976HTu_V!K3X;tu*>&^X8I2w(!}o1fg>Ph%i>wjL_Sp|i>FnU zlKnrk6rMm3@PVJ;`Lhcu`t$gw4k7P|tQfgm_enylw-EzH_3)A0r-+t?sI<>!A4#zH z3>2{;Ea8Sf(fGpnWH7XBR2R#p45YSnvBY<-IvkwGE5=mMN4pE$NX1-oPQr`wyEj2G zwW}r_McU4b2NIxhAbe9QLaE5+1S*DwyaG4}%!kGL99Bs~=)@P7gX4|y`~T#zM$19y zHwh*AjBsQOV{B9q&NDduuePZrQdh50Rxh0YJ`Uu>qYcG!<8O-8AfVsa zq~nAcBs4kfzzY(6p-;>O7ZAW_{+Iio5^3sH6;cj`H2A;0UcO?!{fLs_mD-imi)@$Z$9eI_V1=BJ-+y|hOCXXT&?B-W>=;kY zk3d1BI}Y8#uhrb|w`Z%8OpeS6Q7M3&4=rBfhWEdjO=YQ5rrI(ZbZl6ml8vjrG$3Sk z0v*rFl#YiyXHJr|NOWg(FzYsFW*tw0Hq&muk6jGDd8yw&?qwV*5|%x_C-&xZk`c=) zbU&t1%iwn}yfxM^fr_gpQX1QUt=f)J8Cw26__E29AX3Z;rU>BHh1=iq`*mxT?fd+t z?zpe%I}gk$$WgeS7>$eW;%X~F53S$-uj{&2#2u{^=a?Q!>}!6qh?So9!6=5x^x?}3 zrY$ugrG`xzWZm5kQH_9|y#AydKBM`GK^!@43$(wux+!&+b|Ds;-v`~t-Z=l}fA(?< zsgv0#2@05W5cwsA`WwZe^s8ee@NY?*wkSX4DwRhkE?>zrv2!Z6MGdKl2v(EHP$bc4 zUWl;j9O@2;KlI0+K|aveDE2xr0Hn+U*u-8(FOomh>5GGSnyv%@mz2!^khiLz?>OF0 z)n8cjcoab!ZW3Kd0Ye1w0lv|-&=e?dysj|>u+5X@nFa4DYyyeH$8E}T&-}TjsxK;y zXT|>cMV& z7=G!eW!V3aM@xl5*LHnJKwq3O@@CE4^6%nHmQ-J%@1?1%;n4fPpb>Y`k!Mm=wq$Qj z_kD#_XtzdzfW>U>rFhPw7%k~@P0awAR+ja)%0}agUg!g9kIa3+deUQ43ZYq$YLs*N zdlAp3xS(SZlyxg$^SlTr^e{fy#U+a>R|e58o+V@@=*AcoCl1FQ;h~xsn;;~SW|SL` zc0VgrL9`jJ$Oi;57vqEi*pIn_#|0+f7;Fyx}w%I9uvBG^B_gj{yWAAxUD8J}TOMrH9ltr0Y- zp#{XUBFoj7h$ZZ4$;#K_0P#$^=LkpxzoWG3s|_$^`M?5cgrY&Go;?l5! zRuJvk=i{;Sh`Ph$31V`3p;Zul)xLX5jSrjZlE634;SGq(+wJMXRsF^2L`w#p1k#&B z9wEDCCO)XHE_!b=JoGT5x@SIcu@|09N)6-|D`Ox9d<2bi1RQCujH*V zc#F_i@({`3kLWZ9^f7YrB`ezZKRzW}v~*c{$&Y>EA2lh;eupBKoLZG~qz)H-5>_jS z+U&R1KpOpR?`F~3(Jr{br~S=qJimWr8do^|zyrM7hj;TK=7l+bK2!ALYdfVyve->P zO?Rh8uOZNcugY)pnonOplJpiLSpwDV4{{3Tqh(1|!v=RdMSz23nFcb0N_yV>t5r zD%Z~vq#VJ0EEk%kf_2j`LdJIQph;FzoK8K|o}=DvD4UvJ>+^F0R`v7+lL_y;lLBaY z;AuBQQ%xJdtw{UoHOsTPCDe;k<|8SoGr;u>Fynf+zhC@a=4AB7n}^2V-~wsGwlX`} z{2JdLMA!vx~{I>T&NfyA^RgG)>sWXTg6o~t0B*K0eZLBR;i zxj3fP54r5alhdc?tt4^eRr8<^0=|H%8iB@S@g=UJUJnsQVjdTLZ|h+&Go=I%u~!?a z!2PYc3x;T3fu@Wl1+z;ezP$8A$tnPUR5&}|qIljAtzGbP3>ShIUTWj`;%yCQ_Q6`= zytjzqR%i};(wbrU-QlGwPgLVJrcqXFEz$1=DrC|Nv)^jQ%g90{6-bso#ZA{(whOdX z?Da!r<4@Wyj9xhpesGoa=myZ}B2mY1p>$}*3tu8j>!pD2?DkjF?b+rMTb?fi8@@^aV)hN-M zGp?+ldB#fP$f7MiP(vTS;>E8DfR?J^gn=TU9Z1Z97W(RWkCiv)8SAy6`^PK97S9KF z`L03k!ElQ=;@`hg%jlFJfc}jzcS=4{Xc3fBQl>_YM@RGu>2@dGvKj_f52W;m+~W*r=PB&_td{KNbF?cb?GhBM@)UR#;?J4V4yimV z0jE7p^&RNGO2Kw~`~lC&{OFMYW*T+f*Pmz--;~FPcfxuWSzL6;S3g3d%__YiM%VXs zLO?+e2L8M`aN7L=cO>xaF`2-KMb0#q>Px{i|C$J?lZ`{c;Tr6$I%C+qBTp8{t`x98 zgGI}FWQTUb%C{Ai-nTucxEnj_HFJc_Ga^((t?)J)l*mSbb&I9xKPuw7Quj}7!IVJO zT(Z}cq*CVV_lI=w2fDe;FEsU^fQj|uSI#|_QAW=2xncEH-iRS5%*LXIPdlEW0oS$E zvw%tY0ciXMGFK4DKc7Hx%+a?Sn-O$1$w}VNTo@+s#M=ARnfd*zIj&qF&n@Xoz`2B@ z&PsTdYumd7=|hJ|%AdT;oxL}~GfxsK;{Raz^xin#kBM4fr?SoCLsC4%tna4)Wvb&k zEfCjtoDW~Guf407xm?B{sCELY52sdhwO4K^vfjmyOx!0$oEPM^aMGMl=xMJ)ST>w1 zH^k?y1I$ZUOZ;l`S?mUYqtmcfrA3BD)b_JCunX+k7@J{TcRte4q~14NKO98xc{ ze5*qfA5xdl?`*@S_4q*KZ{X5S2E?scd=~*B?&pwSYWEm7N!MY{y zTpTi(=DSW5ZA2Jli2ch5iK93Adj!W^JWkZ+Qgeq_Z6yh}{U~c=k#>r|?D5U>_4QZg zTV4+YUD($RoK_5e;lMQ%HMC?*ZRz#>ffk6e42LC?+3WGxSFLR4)2$~Yp5Ehk(0MTq zSIEWNGz#qwN1=|2b>P?=ULu=XtZT6v64l@|9@UHY%(gu7DE3nm3;vZ}0b5X(#fQH) zy4f8iUcI`vZz5~n8)o9+=MaxA9s)EdhvMtWw;vJUU+a%GUQ7?1rxxQxXZT1BHtM?G zjU@kMTp=*eOHI@0$KF!G9!%^+HRg85=MrNlr4)qjBMp80t~=d@t4{~(86(_&L&>yY=q zQL6U5pLji1)yuM;N95`^TRO{9q*u_SE`+_BhUWn5{5b>?T11gr}F1$2CZxHm!E-vwZJC{li_ACc#XE#wP=cE z=%EQ^(vM-iKrFjhQoYHCsPtI{L2;IPk4ho=HXGSGy!)fj9OcEk%At@rlq37wnC`05 zS9j!0mC03;{pdc+e0p{{&MtY9e?6z=P+pT3sY1dd!s-patG__}+l0bmM=RM?KV5}J(IxUMQlXm_M|v9MeA z9sfYeA3@rrhv)Nm?kNjuT>ic?gdpMKVLX7{ZI-{#+?mFk4_|9;!RVd10R+d{pFtxo^vd4e>Kg^bsVRpRxAm>Sg)HJcC_ zR2XC`UiO2E>#|8cc?9uZE0oH>kBp3KV(6u&-Yn%WotJs9)baqPpRlR2G*v?zriasi z>a$4AenwpJ2cT63&=s}GFF#Jd2{lFrfW+nI##c*Q_aw$^a_0He<^E!-zTb2IY zV@mXSRGz+l#y0u=)pcJx8j!G8f<)5s&+tXeO9|*BE)g>F{hhO?xhBuj`*>w?IHpm$ z5kXWoT(VREyVuOI^K!1v-`@wIz)J*?dg4vE?kH6jsE_n{T?So%bc;_~ z|K^g4w$6GSStr@#{O98Eiz^gavW54B(5gwa>rc%4KeDRdDD5PXlUR5$oKf9z3X%WQsy zl$)__=(>1@R#f%O+~s4@p;MQ*y+OF*;gjsEv}OzWAg3sHrHP$&M=&9O`oEKb14wSz zV(i3SlVebN3%5`}zSQDbmkc?=c+Q~r%@+kh-aqeF-trY)KRRJ-t-Tm#mfC{Xf4}bh zX0vwTnjp{gHSU>Au*r@2(vPveR>^?xwAuP%j6~UxxZ#!VDBl*N207~q$VG1YNx+SO z{Q6(fD`4KAzNh)~q>nN;`v*QnXN^JwbeDDqEksGkAsI-EDaoZwg^=t^jRcJ))*9`h zQ=)^<8w}qwoWKaAEyYfB>}BIvPtWj*_2Vp(?JCg@0i`ETFgrOr8H}k2jl7KR@S(WF zHB9S@0fNgcX%WP`C}9Z49OxjiOXrtrxqwDmDPi6=V*dG~f;jO<*UAOOIElYr;oEBv zcwG)0ZE4|tx9;*2FvXW9o*cJ*`nRALKk!s!_Xi|gaI3?)0INr%tHa&gg9oFcS{5#m{3&ML95=X;St5|`@7MFQwA5tVaZ&mH#h(ASi0IV;IV+!=17dx0h zvXtE^yS6z|?!Q3&dZ%y9Oj%gi3*s;l~ zqyg)r)zz5xsK*z8MSR~qOphKoV#>b}A+{L0hGJyrUSKR`U7E8O;h%uFYPltg7D)w> zd%Jt$1ty^PbAjGN&*#uN>yqeU%aywgo>-_vD%7cVR6Q2d_Bw5Wl_Ef!W_ z0!fAXG3U%NoL2w7>tu}@Lpx=kk57VXVDC@w~4Tg6x_paBXg83g=q7cg|8~L~bFyu#1zpkOGMh@2I08kw=U4F-Zpb?}9W`>rp)7O@(gdbdAjk zEE2P&*vg@Bl8vIGoxiZ}b=M|BRW2mRpNKbu^;E3bu~TobTQCSxM`j|j){xd&^tS=U z9lH23UN0<{icA>lrhA5^wv_B>OvMIMOw9G~yWel27Iu>PW~%kOX6*u>yLQbwD(pPL*}r~~P@nRNhQu-w z_1rFIQBkZI*i9R;Et#}v@!fTcOn%ezqSF+6)zcw7iyFnceukB(~N!ZUjkqP%^8_oL9}-ydobc;eI{(djQ-oN4LtNma|c7@3`qyi&w(+>bTx za-iA)4(jveqvV&yd~#ErP>SgGSG|z0WQcn^!4wURdb@_=eQCDo>=7eIkT*ZyJ4Pwk zvT}EYnP`c~GyR&hp@6Y5Qq}HAaAzv=2L>%u0NJ}!;%v5UUJ2G@X{my(cP_7$Z` z&mQejDI5MD&$P?NlcK+MMZeZQ-b(E;DyZqe9AA!ICX`W3; zlkwXMkmZN_Cf9O-?!|VTTjonJbF(?Qi_Ixwvr;Zk&)Dm$OPhB_{i^GD72Xw6X=y*YO~%XiJ?iCmo;?TeZixd`zMh!k*}sQ2Q8 z-;g}N(ldg8&q<0M%6;=;Ho>vKteX?2q zVlP#hXkSupp^lZ4IwLk`AXjR2e)7jin4%9sjsle7$Xd#6tAhGIG+_%1Lq7~E|8UTG z6hj+3-G~daB`vy3pv#U@y9~-%KuX&|4{mzbI6v@i z_n}Oa``j`Hzxt9f1?(8v#jkaw;OT60M*BtNv<2nQ;gBwfIEki&O#qGVjel93sG$rk zz=s>3e`yV#qCLH?TTZj3)v%(t4k(n>+hX}xV) ze>4NlZhu=)Eu;gU1#%e_h%vgmM3CrR9c}cG3?8J#wY9#r6S)QVzywlu@t%VHV~Xs^ zam6iLYD;DL4VC&+NPUm5rz%J!jGF0_)91 zMe0PK$;P;`l&uEU0cNSjU1301$yW&4AeVC>2P4(f0cYKfiaJ>CgffYxyrjR4roOFX z3%HC;D0GCrU*>>;qA~!l(3QAnI@14yY9z@^xx2a)o1_tuK7PGECMYE*y#vhZ`6P!o+8AT zWtc{US8zHK-IN6JE@W7cztL=?<39+g*=Lm#=`A`rIB@hy8o4tpiHVaAyDm$;OMk?% z`8b^wS!UpJRIDuKSGf9e7v(;(@oWJ=lT+MPtLak+n2!VemvAfZp?@Jq^Bc6V9L~WA zP;Z55x2rsZd$Z^Cqxq}zjQuJ?4+}s(w$uv^rfp2|L;Yvbr=Hs^t9&0e?WqvF?8VV1 zop9}}7yI4L)M1+Rb^4yh6v}m6l7#(pHuC>14x|$i^3(3l`qA!T&b}xW&7Dlkt+F4) zI3Ms2`sb6942u-werXeYgXhja^+wMC?0*dkw^pGAt1QsVBdPI}5eA-2l?Uw^Of7jY z&F~gJvsD5yX4zvq6x%-#x!L0*K2eS;3Ur?gF7ogSmC1xvAC{CFs1B|TbfGRrlWPZ1 zjP3?Y5RssT1!5JXUqJ(v|%Gqtf{S?f=Ls z|MnPxyo#&*O|vi!YMWJTI^3ESc^*YIeFcWc#X6(0yGO`FeO*}aTT9ju)A+R+As)=1 zt=9X?1h_0FT;+`Xp@c$tzXLp#0pWdWX-z>)o5f6&O1+infj(%DOmO{ca{NSZg|m=D z-m?jj-8+j+PkW9#K7wv0{2o{h9~H{#blFp(57sVT1EC;@GJvfm_(Z5j>}&I_Hy(*2 z62(#J5s7&WFiIW&!ykoBy=-ah_dY-BIPL6uMAcmF8*v#y*fz7 zYwj0?igg}az9o+qDN*cbV}7&6#lX3XCEjyxS4_GPaYl(yr=b@g7ZDL(_M|?%1)73$ z4AiIiC@b(6Pht5MoSQ}L{m?7U%Rf3`AWwU!4r%xHA6Wuc& zDOu9_36C3uD!!p(qnH?Y$E?(U4Pf^b0Kf{>7rI{)A|fZWN>o8!M%(8XkJ!%~s3@5s zXcmyUQSZMfKtQsu3_Tj#E0C{YTDU^dxpRLio^vsNuUjmbgkK83w{?E7g_8B3Nl`-d zz-8Lv3PfX0Y-c0w`{0ZbryW{{1U(^%-&nkA2qmJeV zmuHBZ(N_kOUNo5`9CCo4l) zJm9JCuZbg6uAo>|$J5nrGy6xj|B>~g{+pnP8h-4N1_p{;hH0Uk`+pm&`5Vq1<1V6K zynk^R?7mRI`qgvuv7fcmyZ-*3nAtvuuwLZ;8kS}J@I-a)qIS5VIN?ope3L?;^2=jo znP27mA-a~@F3!fPRzgGMTM`=YLnVh*%8Nk}`fu(retj}ezp+vA9MupQXY-ED?x@D> zNbNs|qc<6bD@pYnI(0y!#!1(Y0&%*y@z1LWEk45!fy!=__Ky?$ihhBm(ed}gv?n!B zZ@X!x4h=;mvn#bF0Ca`!^?B}d65Dfz65b5j8yhw;Fhn{^`A@jlD5hkP)VVkeFbG9Y zf)ij;>IB$f9HbS~7EQu-if!0Ie&2hx1mVhl<~$X^WX_%yY5rqM z1wKo9A${lCTGE9t&sjL5|Mq-z|CXI>A+vq|XHUt;E~FH!HadQ{Cw9!)mu?q=eaq(M za^%d@``OQttaXnPn^?w}{CH)g8r7gnFQS3`?3n*`%&?CZWD*!+#=4MUrU(oL(r*e?!_0qEt|9w zvn9jr${luBAXZsT5&CT^rbrW;%DcO!!D`2zGNHeCh?dHG@%tjk}pqV@LPmW_`zAn^9c-_O~K z?a?$91gIeLbK@bM+OWlDHC@{)Xe|Xtn%UZLjw1U>U31v&eYh*Z_a!_0{gL*w8+a+w zUWB?vn=SZQvy0+!mOOE;KpVNVRh_Ww@}8uI#}MW=2g*HS32!ct>=M{S^6Qj7?6*6T zu+6%F2zE}3j6@ztu8pC--+AD_rN3F)KWURn49kK-<^=qF)EZGm^;H}Hg%?T~96@di zJdD-tcugX9mc%`&+Y1q!x)uLnnoFt^}QV+qHkEP^ZF!(Hb(@Pf582{W4)2~$bprYs@|OVS|LxI1>| z0^S3~1K;9;dN|s-hg*}*=BDmMWU5KcA|@R3r}_dgH@K?tgs^4W4mJ&Kk|sS1>6T4v}YOJ4_8UVz(yr3=P?vX77t>3o;Lf?5 z5(gqpyCN?acG6K0W&H>K@?N0|iL$MLApL)PIM1z^f$y7?^{e;@nF?Ji;hSeU7+Pg{ zPF)2`WNo{E4tG(n6p!G#p0nQiO2Y0-rPV;==@*GJ8i{cU zT<#?Yh#k&N4CI-ywIJdRfZU?fJtJu0GToLzgfbtB)}sULmYW(cpl? zCo-WY#DEf{baai97h4bl$l$MhDdO`VAr7*weE~Xigy|aE!9QJv%>t+5(_1*xUgMDu z`qEH+p1I1+fPo$uzauDhkP^5}K3E3~QlO}wH+#BzgC3ltKfWLdboAsM>d~TQPMcoZ zF_iY@UF_gyD8W9qm;=kw0`5vlZPJXlRrkS#iN$*Z^TfLtwP2$iGx99p

OTx0&e=PA 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

&M2fQczI@mi`2G3Fww@;R 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

2-_We6ys6BBk&g@DLr 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

>?m4f`NwQRV~(^;GZg!I%?he- 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ⅈo^5?z;YVM_Q1Xj7BfvQ(F6j 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%0A;$-h;oniBkrt!IP4G+OFnh1 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 HI6V7*u1gLi literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/turn_left.png.import b/themes/space-pixel/source/alien_animation/turn_left.png.import new file mode 100644 index 0000000..49cabfe --- /dev/null +++ b/themes/space-pixel/source/alien_animation/turn_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jpg234fx3cs5" +path="res://.godot/imported/turn_left.png-0655137ceaa84c962c0a8ffcc991834e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/turn_left.png" +dest_files=["res://.godot/imported/turn_left.png-0655137ceaa84c962c0a8ffcc991834e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/turn_right.png b/themes/space-pixel/source/alien_animation/turn_right.png new file mode 100644 index 0000000000000000000000000000000000000000..69903a4f952262b4cc5db917d3f7926f1d1f0d4b GIT binary patch literal 32120 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/turn_right.png.import b/themes/space-pixel/source/alien_animation/turn_right.png.import new file mode 100644 index 0000000..811a7f7 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/turn_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcnjuicilmy7m" +path="res://.godot/imported/turn_right.png-9705b79633b7ac5c9bedda6eb18e3df7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/turn_right.png" +dest_files=["res://.godot/imported/turn_right.png-9705b79633b7ac5c9bedda6eb18e3df7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/walking_left.png b/themes/space-pixel/source/alien_animation/walking_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c0bb6d7ae685423e2289bc8cfa8a5ac0ddd92fa8 GIT binary patch literal 75838 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�z? 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/walking_left.png.import b/themes/space-pixel/source/alien_animation/walking_left.png.import new file mode 100644 index 0000000..fe3b5d5 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/walking_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8v6ly51w7yvt" +path="res://.godot/imported/walking_left.png-bb5370246f3991ba00a8ed4f250abb76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/walking_left.png" +dest_files=["res://.godot/imported/walking_left.png-bb5370246f3991ba00a8ed4f250abb76.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/walking_left_start.png b/themes/space-pixel/source/alien_animation/walking_left_start.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf299ac096b8f979163708489a8572560147712 GIT binary patch literal 21102 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 RcP2{$XYgjmZwwtH{|8)jNIw7o literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/walking_left_start.png.import b/themes/space-pixel/source/alien_animation/walking_left_start.png.import new file mode 100644 index 0000000..c2c017c --- /dev/null +++ b/themes/space-pixel/source/alien_animation/walking_left_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rvpwxiydmfgb" +path="res://.godot/imported/walking_left_start.png-202431d77dbe10cf10fb60da17efc868.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/walking_left_start.png" +dest_files=["res://.godot/imported/walking_left_start.png-202431d77dbe10cf10fb60da17efc868.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/walking_left_stop.png b/themes/space-pixel/source/alien_animation/walking_left_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e54ac9506b0ca9a9711499c00e68864916459ffe GIT binary patch literal 16114 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 CRCx>l literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/walking_right.png.import b/themes/space-pixel/source/alien_animation/walking_right.png.import new file mode 100644 index 0000000..d8fa5d0 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/walking_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://m0wvqcqx4tvm" +path="res://.godot/imported/walking_right.png-a2ff68cdcae8232bf9a800d9412f13b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/walking_right.png" +dest_files=["res://.godot/imported/walking_right.png-a2ff68cdcae8232bf9a800d9412f13b8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/walking_right_stop.png b/themes/space-pixel/source/alien_animation/walking_right_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..dd12060692d283991939f7ae2e73e6d9139bb576 GIT binary patch literal 16122 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 Bf5!j- literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/walking_right_stop.png.import b/themes/space-pixel/source/alien_animation/walking_right_stop.png.import new file mode 100644 index 0000000..8eb7395 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/walking_right_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctjvovb6pq8yd" +path="res://.godot/imported/walking_right_stop.png-eef5d4cd17d29d4d0b6072e0054d949b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/walking_right_stop.png" +dest_files=["res://.godot/imported/walking_right_stop.png-eef5d4cd17d29d4d0b6072e0054d949b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/walking_start_right.png b/themes/space-pixel/source/alien_animation/walking_start_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e561f75ab2e2243d5123a669b4beb68e4cb24d GIT binary patch literal 21122 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/walking_start_right.png.import b/themes/space-pixel/source/alien_animation/walking_start_right.png.import new file mode 100644 index 0000000..0ae57b3 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/walking_start_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4ug8xkx4q8k5" +path="res://.godot/imported/walking_start_right.png-6ab75aa37a777795e4c508ef7bcc9655.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/walking_start_right.png" +dest_files=["res://.godot/imported/walking_start_right.png-6ab75aa37a777795e4c508ef7bcc9655.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/back_button.png b/themes/space-pixel/source/back_button.png new file mode 100644 index 0000000000000000000000000000000000000000..efcc11db4d599628605ebb257b99c6b61b6281ab GIT binary patch literal 757 zcmV^!=%Wh3J;Jr6_sBjG|)jsmCAHf z;Wb=QrAWgAKt;s>6;E-@X3&ffTJ5gAIj>KAGxpx@o~2vuFWuQQ#%Y?s;@!_z_QVnL z`pJ9D&7ls!k``VQ4CDYTec`!45Cn%J?!H_zL2z*M<7K$rmk)t*$`#i_sF{eOHYLrr7Rg*&?q{ic;rbR+;puTq5A}fHAAGF~4kyVjugS8f`zpAaG z`gq&1Qd{=Du^RPND`0(pHkG1fsiIZ^T&YVtq3wJAOTIbiHMU6(aHM2kAM<=Io^8vQ z=fBpsrJkIBWCirV+8NHro|F{O;*-*wj;?HT$5v}m`b^1wi!aM>$qqiY0!lfW!@C=` z)PRF4z{1LDuLkJzO6W&k&kjLw@DM4mZ(;0S1Q{)_oQ!hkw_w>S`QO#PXB&GeU@nHe z4PG|f#=LXW0=-uawMB5X@Av7}&-eV@LGHA7+w}b5h$%2vG5se6G(E;!ZM3rQHR2&| zgT3gcfXEO8hafmB7?8*K4Iu|Xa0r4!7bjN`m5Y%db0FGMw&7{$PC@}Q#00000NkvXXu0mjf1l4dY literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/back_button.png.import b/themes/space-pixel/source/back_button.png.import new file mode 100644 index 0000000..eb11e18 --- /dev/null +++ b/themes/space-pixel/source/back_button.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmyjhei871wvy" +path="res://.godot/imported/back_button.png-158ab78332883ac5b6c51d113d83d3fd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/back_button.png" +dest_files=["res://.godot/imported/back_button.png-158ab78332883ac5b6c51d113d83d3fd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/background.png b/themes/space-pixel/source/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9893ea75af6fa338657dc9522d106ab9c8250 GIT binary patch literal 96063 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 KqC)>l)c*i>tv;0i literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/background.png.import b/themes/space-pixel/source/background.png.import new file mode 100644 index 0000000..174d336 --- /dev/null +++ b/themes/space-pixel/source/background.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ssud2yq3katv" +path="res://.godot/imported/background.png-d5c0d6c0e41051aed35853cca901fa60.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/background.png" +dest_files=["res://.godot/imported/background.png-d5c0d6c0e41051aed35853cca901fa60.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/billboard_ads.png b/themes/space-pixel/source/billboard_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..07e41fec4a29b9dd2702c15fa06aa0ebc812663e GIT binary patch literal 8086 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/billboard_ads.png.import b/themes/space-pixel/source/billboard_ads.png.import new file mode 100644 index 0000000..4f640ca --- /dev/null +++ b/themes/space-pixel/source/billboard_ads.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://de8f4ll2u4fob" +path="res://.godot/imported/billboard_ads.png-cfcd440b1e96a6a7f1048cadfb42309e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/billboard_ads.png" +dest_files=["res://.godot/imported/billboard_ads.png-cfcd440b1e96a6a7f1048cadfb42309e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/bubble1.png b/themes/space-pixel/source/bubble1.png new file mode 100644 index 0000000000000000000000000000000000000000..d964d46a303f2e596db3a277716741b8e8acaafb GIT binary patch literal 1401 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(t#9bfk$L90|U1(2s1Lwnj^u$ zz^d)(;uumf=k1+?d9wo;To3N}^uNAnh0@lp)mEDhN>t2|Tp1)5xj^U4%i0;IO?>4U z98Ry_tIxo2V;%!T!-CiM#1H74%Wjx-`kr_}nivBEhY$mUz!Q!K7H57le6|;t71l{% zWN1)eWMFXYW7wAdioN20`l`i^>^eYYDhvz?Cj<|eo%zS`yY`(G-;TpTCp!Xh6AJ?a z3n$F5XomNXPu4dif9P$nhH3L)U~rfKbO6|3WF4QB7L->0nQuBg5%sn8BaOwa# zcvJx-;wTG;UGHic)eYX(GBOxUXNAV1B~!$?FZ>5Kz#w= z{;&8s|CtR$7&rVmxPSfq;>YX>9%`?z|0~4|FD=Ebh>taHvhefB)__-lp-AD@@Zf+ZeU5rB~_ z<5<4f#c{C|@WlNqZpWtj#CC>l52YCyZhw06pBYvRfQqHfQx-Ee{Pg+D9SMs=<%W%E xI>%WYIxGM8BBj!ZGl>jq4j~mtHDCU)UHPtMU~F=J6|gL2@O1TaS?83{1OPF{BOU+% literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/bubble1.png.import b/themes/space-pixel/source/bubble1.png.import new file mode 100644 index 0000000..5327d04 --- /dev/null +++ b/themes/space-pixel/source/bubble1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by5n2p44bg626" +path="res://.godot/imported/bubble1.png-90d246763ddee167a8dba488f338cbd7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/bubble1.png" +dest_files=["res://.godot/imported/bubble1.png-90d246763ddee167a8dba488f338cbd7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/bubble2.png b/themes/space-pixel/source/bubble2.png new file mode 100644 index 0000000000000000000000000000000000000000..403939fb7454ac7cf231a86171748e1a219f5472 GIT binary patch literal 838 zcmeAS@N?(olHy`uVBq!ia0y~yU;;838aUX1WNr9GZXm^3;1OBOz`!jG!i)^F=12fl z{qS^g45^s&_U>)3!ww=2fy#gX$M=bdWPQA}O!eiNIBu4YnQ}S1ZPhzZ?^>5%a8#f5 zO}gbT29v$=wG0di^*~FS{M_Xm?n=HtT(RCWn`z!T7N8IivqUnUIlV&uS-ovE?}nM2 zKmj1;*u*rWd!v0x{O4c~@NQ&VDKuv%xoWxEf{j1~rl7gZ&;2M)xra2ybOo*=->Y|O~;VEf#C{69K@ z%H<*jYyRGGZEO}~V7T*WJAXxRlOss@q5glzog4yqf(q4dhyaI&CG8ZvDEY#8BW350 zI@=F22VU=YKhW<3jA^_UKXG(;{5e43!I{JLJGwyu3&ij=0@k^k;n|};hK$0e_OpS3 z4oME$4firGWHB5|zHn2j5Y~tza=d#Wz Gp$P!g3(ms; literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/bubble2.png.import b/themes/space-pixel/source/bubble2.png.import new file mode 100644 index 0000000..f4fdcae --- /dev/null +++ b/themes/space-pixel/source/bubble2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d31p4cftop1pi" +path="res://.godot/imported/bubble2.png-926af1f752ee0132b23db31bd0a272ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/bubble2.png" +dest_files=["res://.godot/imported/bubble2.png-926af1f752ee0132b23db31bd0a272ee.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/button_big.png b/themes/space-pixel/source/button_big.png new file mode 100644 index 0000000000000000000000000000000000000000..ad18865961f615830657eb8f67f649efbc6db315 GIT binary patch literal 6175 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 Pj-y9T9)AAaPe1=J6efQ$ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/button_big.png.import b/themes/space-pixel/source/button_big.png.import new file mode 100644 index 0000000..6f589ce --- /dev/null +++ b/themes/space-pixel/source/button_big.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyn4nwn46au56" +path="res://.godot/imported/button_big.png-15c38f7b46e234f9b3e749933b567d04.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/button_big.png" +dest_files=["res://.godot/imported/button_big.png-15c38f7b46e234f9b3e749933b567d04.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/button_down.png b/themes/space-pixel/source/button_down.png new file mode 100644 index 0000000000000000000000000000000000000000..13abcee98b202f3df1d9a899877ee6f0311c2893 GIT binary patch literal 679 zcmV;Y0$BZtP)J_$mElPcaqqi$M0c<1l4s77e}vW?g#&r+x-i2-6uN% zQwuzn2+|3ddf>i9FoeSrt8d245Drx@r{bz_!VnHaI1J%1gu@UHs~>mIm#v#a+GFmm zn12mIC|U_LD*$s3s390O4T(yiSpoRT#u($6d$$yzZd3=S&CQT~w>*SR_3-%X{h{#r z(|RWm8=E)G?1b!JPB`9A9lKW0o0!B{2=}N{DxaG1*!(_ef;e7#{YgI13c_BwoJt`~b&+6QC>uO>t`&t5OL0Db#_4IJpxk+Bl5 zM^Ycmvu$_#pdC1a4L9e}^-T0L=jdp@xqG>6HanxaVTv6iWj)t3*VxBiE}I&8CmnGMH@7f6p>*_mq$)0J)@Xa4WWg(j(9MVUiS3=VD$ToL=h}6E(Is$!;G3+Cd zvqp*!uH)$&X)Fa4ou2`lhMoPcb`10VE_1usR73%rRCB4In_i;_v9;6*33}hK>)aMa=LbPI@&95lq&;- zt^>d;qp1CII~-(zH*-4yzzcHV&0EIyg@HVBu`}>$K@I>8{K;xYz85>}-`ah3I%+7^ z_ybR}#yUgpSJ0k6e6er!)(Qv!PBchPtt9{U6D^><{LA~ZX)0R*;Ejd%=#hzpUh?ku z`rCQ4F5+NcFvAl&N;dWa?D(x6PQP;;D93c$2^fS9)#0NFQisIsJwH>mhOZslReo&G ziJxx8T{7GD)rmdZCSi9yS!U~$7pc!?^Vb6!z_Vn~=8rpG_D#&sQ5k}44|2pSD9*PG zOmbP&H7VcFmFd_p&f5yCj+j_4x~RX2N-&Z6C-ER#J_i5c+~tK%cjpWZ_f$-N-(oPW z8dcf8hwRhZiOJ?~w0(bgH{jva5ZhhtJh9A3i3Y((q)P9LcWeB-hm13DI>DqmjW5wPuj3B{Vp3x8A|`4ak`5IH^l|Frm~QXfN}layJC!YfFU|gO|HV{NA!Zaa$zP5 zBpviGAkx^&o$P0hIo`Q#_7@)n@2bn@4I2G7RYXZC2!~$Pp#V;QAJ3bPfnTjazm}tJhgyTOysSOa8f7z8#FL&NW z{0LDzq*M6!Z+FqdCxp+aU#1dl&NKvDp1IePgKLRIEJ9yDKI5~`xZk}zZ-4T zdm;P`?TBBL$@2Gtcm{kWCoF0ZIr{NoeO4`bth{TBCfhqMalBAUeXNEJ(ClKjs zYY-umWvO0*35U5Mxwxhjp>37;fh@=g60bL6#JojQgpz& zS;R8fbi@n6pi#2)#PM4_h5WNs!=ijb=}w^cukf24&Vy6$GetqCoiS-+$caxvvz8Y> zG-({;cV#daXo)`#F(8EI%w?2D*>2^wQKqG+cmm9jEDp-FtQjBvX6!yL>?%Lo=`8uhmfwJ9`gf zika^gdhUAk)N>UEy5XyXMSS|^jl6dq+|NJD3s79wN((IWoa+dL}Tg5hU>UzR5IL%0< z)KDCeC{UARe-id}s7uR&R5%_q$ifndnL4FROp7=nHfG<(VZ!ois$PHCyDcc68dkRS zHJwu!sT-bBvGu(?ywLNgtL@9KZKv1lt{YOzo$GUpbCV0=QL1j2UO#ynWZaZX;pJtW z>-Ikd2CXDrYuR}cncLnf5l+}vx1EJ~lVDotWD6SMjqGIZH)fQ*ZCy#zS$%qIhP$dI zOlkgIND^(dm=eMZMGYZFJ*4SIe4~erxg~vCRA|G6mhu)xL8StGn^UhRr7pmjv!!s= z{d04X)s?DK+z81AP4zbo;dwY)k$xe68q`$85kFn!sB)@DnX%E&bkjqnlli8w~W2dT@Fw)0I;%GA567# zM{d#~YWzHf6_D{M3z^CB&x4j~Gj+{T(QQx*5)CHXJG(n677^!jJk$QT8n^JoW8v@| zcGSPKty{;>_+R3OvUFH{snz9bH?2w^6fWmnU)EaaWI#hDa+zKLQ|bppmz&%=`=w+ z{d#n6@U441SMPZLtdeXN=bM=~C|Ego(`EFM_fRVK*}NlFQ(gHR`?i60UlhA_k=HSZG9weCrL>RqI9rDL3f`<5vC zM0PMPWvH#TEt7*-K{zCqrtEE0x8#?)n;IhRcMqecIM#VIv5hbR$RCZ!OsKn&t*2Hrk!WS6bFy!M~GR^qzh z5|3P5g}572D|n4Pqh3!W?-wj3e;iS+xRx6wj22(YJ>0u-+6+DD*?8MVYqd-0ygaN{ z|0iP{iDXn;>{9HoPyDDg7x9s4`PJlc>CS|q^>4WimKzJT3{=>xy1w`!?VWzBFdDJH zHmd3*!(1qTpWE$8HG0d#2B0aAQUp`S zRGEV|(G*j+!!aIhJAOTFbdtVW z-}+){tpKl!zusWdXVqZ%85Q;&OQki_k#r%eFsYUm7p8mG zUCK>~Y%N*M(5Q>eLoQ`Wv@LOx8~khj*(5t^=5=KhOet1{Yj8opoM+7VuVEv3Bbh$+ zrkSE1Chih0E@XEJ2-uVNQ?mEV0(yH)dS>PY6=~gt@nKN)C{%3r2fSAx0=ao>iG_h@ z*s`DXG!>QQuRRT9q6DcTYLi?fBVSHbgz}ilqHxB}rS(OdU8QOJKS(sdnt|!h<1&8q zR>P!kjv8eL)A^Y7*c#Vd z>?m9~`#O7o5CJwAk73Wo=F}bd+$djJrBd0S$`wu4IHH}sDf=Y)OpSJLtgD5Epcqy= z-F%^G?VpvLsCze=hrvf{{ORq{YVEv-YaiGx#7)ZP5b#^PbOP)WzqSH8<8whK!1Sih z4#vf&FxI+JnF!DwwcTq4H?OgnN8_%a#7y{Op4g%4Lm?BQTwXj zB+Lv93--+YrD#2%H8|u9k3Eb_hDTnj{kzTCgbS81IDUTBZCCI`=lgtY$FapVYC7tz z%~@|XguW&dq^Do2X4Xc^^L;>zVHe(wVwb1qJRn=wkef=RB;@P`x+`Ob)*;)q~hzKNafuU(ycBy#k-oCkgSZ)~FhO&#r|8sBO+`gr;6mTxE??_iP ze68G66o7GdKwGPs+fft%kFo=-?|=}E^V~V9D8M)j<1mcFFb=~w4CC-}zJ^tn^L0@G zl`lfZ;j#ma!!QoRIJ{l#$>JVxHE$PtGOqxVUyeR}+#FuK|GZ$zh}zxs0bmxpU}}ws tz0E27@w6yms>tM{4Zt5$YeZPM@Cz97O)OcSqN@M^002ovPDHLkV1hls{hI&) literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/button_square.png.import b/themes/space-pixel/source/button_square.png.import new file mode 100644 index 0000000..66c5233 --- /dev/null +++ b/themes/space-pixel/source/button_square.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u8at8npwq6ey" +path="res://.godot/imported/button_square.png-f825a85c6878ab4178c0381e83c82249.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/button_square.png" +dest_files=["res://.godot/imported/button_square.png-f825a85c6878ab4178c0381e83c82249.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/button_up.png b/themes/space-pixel/source/button_up.png new file mode 100644 index 0000000000000000000000000000000000000000..834e3ca1667f55fdea8d4ee9a423beedfa80b2ee GIT binary patch literal 668 zcmV;N0%QG&P)du_8`TiMwsZDz;c`8>}ik(QdKfeV*kx9*Mu#q;Ssx!TDN zz|b5I1%h+{hVHm85Dej9iP<-OW(Wt(KNsS%Z-OBl4B=o12SYd*!olie{qeBZSW>UK zx5D@sgivTE(8vIcHK2iDu&GF70@Y%``r`ag+x+#dZVgx$mM)aGfiweD!~ATqXGojw zGQ6$7CIi}hVY9)EPDr<9sNW@h#^#o7z7Sr}q-4H}?#j9kF>J_T8>eQzi=Kk6nT^%4 zWq_&!1tgA_(U+Q|uU>7M*K}I->#>1g^kyUa&U{3cV*=HejiheOGismNt~#!k{)7H> z7d1{5L{~l0x-C;|MGe}U zm+uFSGSaC0zV)1adaln=WB*j!^DyA5{|xoL7neHoK3Q@vm!xC{l+1bo8@N*q2q0y> zT6@#T0QjRD9razM_Wg~OvVPRq(9Iw` literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/button_up.png.import b/themes/space-pixel/source/button_up.png.import new file mode 100644 index 0000000..c69dfb7 --- /dev/null +++ b/themes/space-pixel/source/button_up.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdxc7yc8fcnh4" +path="res://.godot/imported/button_up.png-b36f4d3e87b96a4924a7e3c9e78d8649.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/button_up.png" +dest_files=["res://.godot/imported/button_up.png-b36f4d3e87b96a4924a7e3c9e78d8649.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/climbing_action.png b/themes/space-pixel/source/climbing_action.png new file mode 100644 index 0000000000000000000000000000000000000000..41a3425f86c7d31138358ef8dc9140431797e3ec GIT binary patch literal 18604 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 Cz%7>m literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/climbing_action_start.png.import b/themes/space-pixel/source/climbing_action_start.png.import new file mode 100644 index 0000000..cb0f480 --- /dev/null +++ b/themes/space-pixel/source/climbing_action_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1jxeahllexjb" +path="res://.godot/imported/climbing_action_start.png-33a0b18314dff7990dfb56bb22a7370b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/climbing_action_start.png" +dest_files=["res://.godot/imported/climbing_action_start.png-33a0b18314dff7990dfb56bb22a7370b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/climbing_action_stop.png b/themes/space-pixel/source/climbing_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..da6d719f12e53470d202b178e44ba31249b11199 GIT binary patch literal 24552 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/climbing_action_stop.png.import b/themes/space-pixel/source/climbing_action_stop.png.import new file mode 100644 index 0000000..e82e48a --- /dev/null +++ b/themes/space-pixel/source/climbing_action_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsnnpp4g1t1vo" +path="res://.godot/imported/climbing_action_stop.png-aeb95d5e87ca122119c6e3273a5a8f61.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/climbing_action_stop.png" +dest_files=["res://.godot/imported/climbing_action_stop.png-aeb95d5e87ca122119c6e3273a5a8f61.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/cross.png b/themes/space-pixel/source/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..20190828b4edcbd74acec2e4c3d3c8bc05c7921c GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoCO|{#S9GG!XV7ZFl&wkP;i>3 zi(^Pc>)RW*d0QNKoG(guGc5@Hbt8AGkP~x_3zvM_l*!p~ZEu9&tYc#ekHqshV|&sr=K^Qv#XnCpA@uHL|YJ(0e5kzGCN{hHXdrd6vRKTSMb zW*fTxZ?n$?PNS{M+UI|Lz53Rneb+)QPO!{0$a<0GdZ3CeF#Mr{aLOT$g{%2laxw)< zMfr>z)lP`Cf6ikvOKAmZU2LPDt-d{W^Zk;`Vf^oZb8ema)%5-)upuA17p|VEaFuQG yM|;(6Vku2N6K3WFD*;Uh8VTf_++P16*8Iw8>$KAsmhS_4fWgz%&t;ucLK6TMm1OV$ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/home.png.import b/themes/space-pixel/source/home.png.import new file mode 100644 index 0000000..7cbcf21 --- /dev/null +++ b/themes/space-pixel/source/home.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg4pv3nv2w61u" +path="res://.godot/imported/home.png-71e3bc795b00a9b2103bbdce3f1298f9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/home.png" +dest_files=["res://.godot/imported/home.png-71e3bc795b00a9b2103bbdce3f1298f9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/less_bar.png b/themes/space-pixel/source/less_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..944ef72b87081cb99f7ed0ff61d947073d9cc66a GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K595~p3={UqGc(HVo8c&N!($HoF5;YjgD}9cy>;?;_~DE3MpqS z%N;KNyUxu}=gy$ugB!is@awQeT&!G!z3Kev8$a#kWH`hEM$^tS*qy!n)>`}F+q(E$ zhcB9$%{w_0w>fyMAVw91O2%&FG Xr?rH9&o{r#1O=$4tDnm{r-UW|p15Ni literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/less_bar.png.import b/themes/space-pixel/source/less_bar.png.import new file mode 100644 index 0000000..f26d9cf --- /dev/null +++ b/themes/space-pixel/source/less_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dapmhcayre32d" +path="res://.godot/imported/less_bar.png-fba91e3a0829dcda8ec5ea427aacd57b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/less_bar.png" +dest_files=["res://.godot/imported/less_bar.png-fba91e3a0829dcda8ec5ea427aacd57b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/logo.png b/themes/space-pixel/source/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8754482f1c7b807b2d5783f5b6791b15ec9606e7 GIT binary patch literal 10030 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/logo.png.import b/themes/space-pixel/source/logo.png.import new file mode 100644 index 0000000..e773fe4 --- /dev/null +++ b/themes/space-pixel/source/logo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbtykaq6b685e" +path="res://.godot/imported/logo.png-6bad1e68a6fc9c05658db89a267ae103.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/logo.png" +dest_files=["res://.godot/imported/logo.png-6bad1e68a6fc9c05658db89a267ae103.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/many_bar.png b/themes/space-pixel/source/many_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..83449b520313454c0abe7278a979608d3375bd26 GIT binary patch literal 355 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/star_frame1.png.import b/themes/space-pixel/source/star_frame1.png.import new file mode 100644 index 0000000..26714ca --- /dev/null +++ b/themes/space-pixel/source/star_frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db3dtx0uev8wc" +path="res://.godot/imported/star_frame1.png-2306e77d71efca28c46e06fcc3adc5d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/star_frame1.png" +dest_files=["res://.godot/imported/star_frame1.png-2306e77d71efca28c46e06fcc3adc5d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/star_frame2.png b/themes/space-pixel/source/star_frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9359094143ba1ca1ee691c3b8ded31c3ae5d19 GIT binary patch literal 15935 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/summa_bar.png.import b/themes/space-pixel/source/summa_bar.png.import new file mode 100644 index 0000000..f7a4e76 --- /dev/null +++ b/themes/space-pixel/source/summa_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b63xwo4cxtylq" +path="res://.godot/imported/summa_bar.png-a6b117db03d9b4d85b599a474292865b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/summa_bar.png" +dest_files=["res://.godot/imported/summa_bar.png-a6b117db03d9b4d85b599a474292865b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/tumbler_off.png b/themes/space-pixel/source/tumbler_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6bfec8a4045efbaf90490373a42681bfe57f80 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zwWo_?NX4ADbJqqPF%W5uPBZ1|bv3kM$l`69d+;Mig$`5efk%}rGKZB6R#z~j@kW@i z#U;%2Q};1bxqI*SmfKI}oHx1rr*!h<;@f%4b;DPODklE>thm~NEp=OUfY+(_U&=L9 zSTz_5P6co*xSHI;X2oD3!eEiD*s!f%oKJ18^zME7$IktEmUO#)!hGf>1|RiA4%M>< za4H-5kIA1Vf4PpZHEpv5rf)63tsuXo5Z+44xdV0aLKfjU?}{QRNhmHmqU zqI@7%!v8l<@)cHZ*}H$ysm+(!cAs1J>(ZxL|2%l#votN{Vtl8y^|Iloxz75>tJ!}pge85< z{UzNktt!sM*MDv=b4=nT!%uhD`mXsmEua6co1U->f9p5Xhk5&Uzg@gP_4~%tP3Ov) ze(wmpZ05FoXQj$XXO)=(0=wzHVKsue<(b zze`cWj3cuan7zHgsASo&cYpT2-9=m9np!eQZe-@+lwHuq-_l^bNC>%$7hZlj(LjFT{`$K{%hoO{YkR{l+Qv{&AoH4Askz zyYfBxWX&di;QHt6iOf6y^hp@7G#nOS;FD#T)A{#Sz&>3W=C7-h#J5k6ypjIZ+Jo1b z!9w`#tC?z5np2yrkGg$5$f4YHWx?0)A5PAAc{SFs%;KZ2y+q<+?WR2s(jRw-b1}?G q;NUoT!65I)#|)(=CXEe0S#7RA{2yk?wGx;%89ZJ6T-G@yGywoAGB;2F literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/tumbler_off.png.import b/themes/space-pixel/source/tumbler_off.png.import new file mode 100644 index 0000000..9936a79 --- /dev/null +++ b/themes/space-pixel/source/tumbler_off.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cq0bphy2h3ocx" +path="res://.godot/imported/tumbler_off.png-98e98513064138f20ec469c6ea575330.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/tumbler_off.png" +dest_files=["res://.godot/imported/tumbler_off.png-98e98513064138f20ec469c6ea575330.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/tumbler_on.png b/themes/space-pixel/source/tumbler_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c915073a7c74af53e83a0afa5c597dc80ae67bed GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zy{C&~NX4ADb8UkT8;G>bpLr!yQC0Nij;87z%%Oe^yy^=$)jf{NI?dPK!5!+g;D|WK zV@5-#X*sWdsuz~+KPL71`lYP-j~(W``Ci@m(6qjLwFBGJw5q8`rr5vE*GS@OG|01d@JN}F!3U36*IFXu1I8<_+q zekuBBKGF4-U3|cko0-kA%h%QARQlFS{ZKJ@KG~tdYDaZSFBFeSNagE%VDhL}Kd-YYKPdKe>D`0j_n)-)8H(Ls zV!u}UV0**uoOg2{Fin1^bl>(?$<_P6s-$cGeyA6o@ome4ynWSg7TfcFP)u0CZt9y{ zGP&K|u(H&EC8eF4G4}g%PDT+2GyS>TcX`?_`Mx?n?fRGHf(*_Le|#3)3|)AX`|ZAE zUz1N~|GMnJe&Q701=U<}jb*Y{4U?|i4E*+U+s}9Bu5Jr|%8XziD{c1p` z@G!DSa52chQ3d0fbMIMxT0LO>@b9P6iR+B|3?&a(4U#z&PWZfu?|ZhsH929uZyHD28U^w_pdeZ3&A5OSlS_n*^44$rjF6*2UngCyDIw=4E literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/tumbler_on.png.import b/themes/space-pixel/source/tumbler_on.png.import new file mode 100644 index 0000000..28b4a90 --- /dev/null +++ b/themes/space-pixel/source/tumbler_on.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlc8akoajx6mp" +path="res://.godot/imported/tumbler_on.png-019725ba5b8f5757f72ac74072d4474b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/tumbler_on.png" +dest_files=["res://.godot/imported/tumbler_on.png-019725ba5b8f5757f72ac74072d4474b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_баннер/frame1.png b/themes/space-pixel/source/Анимация_баннер/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..c30b61d0d5b4c97561ff0d4ccd8dec1f2d7c3014 GIT binary patch literal 11491 zcmeIYXH*ki7dAWzz2i+)O0a>73Km2uCKl|9-Uq$QEdj?Lnmkc-Tn6ZXCUAg3bwMFDT$YXZRbxRXZ@UAq6CF(~)x zx___%YtNp*qsNqw>8hx9Nw3c}l-zXpzss`EzCC{$jVp+AijhzKt{i*zP2;u`so%49 zJyq*fc(k(i*LKH`&5@C7qB=%gM_it53{!r%UsFb}hV-L$t?nM*QYe@?P2epD1&~9M zS~G8D<0sjSweJe5sW21fQyi{bd4@*$U1A*3iTX$Bo1t&qoD#;skMB8ga%f&*#vky%;JJG+Es=%?| zGvK#3X>fC(vjaOwRSda%9`GRgz{x3aJ9FpYJZInmwh(gXgZhC@g)IwDzoPoZ2i@3Js~$8okltPk3`&EkC4C%0rG8*q`_3S3$a zC18J-TXMYU4b{o>Gw>%zpmC^lN<4J=q?n;E+E296pIaqJhx(z~1|X0zKSZ~fZo_}b z+UW8RSqgEj&z{#%$sMoYB45+@gYfuw-yGqcwDpA3-+c`x;FdC#>YmSDKzqIf~(gS;Fa!D{O=*Wp6>+p z1{Z(j3h#0bH1g`w6C*`t6!pG8CxqiZmP)IicdV!)o?a*+ZCEflCoP(6h)mwQ!B6tK zy6pFX8M=ZnZJ$BENP!;5QOSirs~2+L*(UwI?>#akR9>9DEw*LQ4sY_KK8G8e2pHzU zZ*t(Yk`9@db00p5JkaI)PXa30dStj-JKRzHF#~wg&(6HS+Z4Li1<(_DmmDzNMlP+v zNC^jM^b?if<=^yzq7Jf28wE$thRY(QI`5^5Ru^;BY0j*>&Ic{>sAuweVEsn`xVobX zG?RGvJ(C+fN7q11@Y|T91B4X`tm7xH;-)n3H!l(JGph2kAsHuU!2mZy+N&h_WFZp& z$#oK>W45bWo}qZ%DGjOB`A8Uey!!i4#9B64UbzC07k{s0ucHH%Ch9Kr+#Rbl(IPT6 zHRvY#uFlng)jmZPz^7k(%Bve(!Lu{@1J;LfU_CLYhRS>ufI9Qezq043IcHF%IW3A} z33gx*@jdRMT=dd(cpCjN4y%*}-$V4)7g_hu!oLox((>^5c-6yV7puB*QcWChPNfA z)_t`l-H)T*;xZYs#`1U0$-n?$j8X3+&e4CKR98FZB%g4vunWRA9Y@KEhOjrPfHt2_ z%(3>(Or1`ncMJRA@mt_;UHD5ZO8?F}+V*hRUSA*v(1>q@Xk5b#T&~s9GNfocAvP~L zE2){Rq9+)vrCRMCu5WE;?<8eBp8Clzd0C>M^)?Q4q?=1l5PF*ez5Iy1i^$emInUo1 z0oTE&a<*`69qD8LB=%(CW#G-BJr1Hc{_}0S2EcQK!^{})LuQuTp6qbs?!~LNa)645 zTwh1&D3u#!7wBy#tlio^&|tPk&qtA#@UwOZw)QHwFdO^Odxm!nnXzMUjs)q&bN4}2 zE3MY&`!LlnD|r|upLr9es9lZkhg3$unTH^KSExdg?8_vnm!^A-4@9}T>A7s_`d_4? z<$OQ$$enEZp5^Ep=@F9pWTiUNV{3_oh;CRt5T!X@yNNrrOQt&TSrl{KSXU3TKifmG z`6`NZ_ucSEU`bVg_?G@n*NlERZA;&m1Lk@q_g1LxhPbeP;QN^=1eH97eyRgAnsZz# zR0V(j_?wS?_N7XovSAqk{%1V{>VTx2aL4Ug%#8x@NG4huF%*zyS}H-ha%sBoM-NfKTgt_=vyXMh8!#S zF#_Ch@yHe$%YEx*+4!}`Q3xpW~|3xD)JQ}+);w9uG|rv#~vD@|+e>`5Iu@W80i z@_@_C^Ura3F22CK_pQfdH9=pv3yJI336(nlOc^Iup{n!bY4GqT>&JY1*4s%V%(XJ& zs}a>TkVp^Lddz?st(EKm+q-%p-mlG2*#h(K1Qyvpk43je-~lk+>D!CCGyk~IPFE8$ zJve=cB$P)Z{*aLTW)Ap8T=?Any|85mMtpx`Fr%=n5pVP59$i3n>fSi*VD)#t;-25A zwzcSlHBc=CH|_xr|H$iW8QN!c+~9^K*g%Mi7Td0lQOP=jtmX3PMuAvz%)SyBoU8We z3uc&?ax6j?mR`L7<^D#$0(pXT;a!6w=~Q;^eCg*C##STPFmKV_HE-yOqz%Omu(iYQ zCGr3hLnkk9C*|6}O+NOk18Mt?u5p_cEA@lk-#Nd(VMecfW8W^R+}V8 z|HU6z<9;lY$cs*!Vh-s#1@~oSQ#b#XXyY9UMV_vGn}fzpyzIL^3&zF4Cj(`k9g!AJ z97ov>ZFo5&>2Y=!?(b%|<)liv->O`>`uil1)=#IpeFESa&s4iAE+ethj>u?zyH$K# zfj?UW9Ut?ADdiKXof67cZ=8UIeWc;xjfzqE10{=8#sTb7QUTp~k5wqOYNT_JPYn?m zxjA>BH19zYv8{3-r~dk@Zt3ZLjT3&E|E#huaR&vg++-fH$iCEqo$ z(fU(LJo|-7Z-gU1ao|@*&K;{Nt*9qQz}MsZNP31`cSfF%!@0XDCSfutgjFU3#!H6q z#flm7SV}2=s64nms^y98;DS-Rg3`e6z-En7C+)<5DoFCF=K*Jy`4lPelK3z zDGP}CqkhID9Rl0Wgu`t!*ybdQj8f@O?4Gd*#Q0mJ<*!KJQPo2jT2c8HKz?u@lfO1= zkIR84_-eOLt^4XT4sh!Yh0{n#HE%IjM&$W^6Osc8Zy%Es+9>dC9N_vvHu?2-S@{ly zmxY!t$?HS^I=VhWAx%{DC~|r~r4laMJOmTl$VI*!%l3-!T3!-354Aq6=Ks)XPd@Cr z-d_B~V?pW*(jlj1Yv$ZQ($XI0o5$-Bx5Y&@<54dE%O74IGw>$PYHR+XBj6`fUdU*> zYa$Jw;eA1Ge&=PXaBjeJw1&3DY|ZY+l7BixWb3Gx5pcVj`^#g@-gHF~Z9x=(iFuUD z0$)OnJG<4p+oyp@ay<+NaPhKi`)pMS$z2{zpw81BsK4@mep`p8Wxro)sn_KZ$b{?V z(#q+ws0O~{jF;S#X!U2&TJKrgNqBA?eQIFHmmj@O3I42+3l7q-@9Z?U%qX77XPKIC zDWm-T+YqH`=Gbos#sg6U#pYBwm%dWeH&?LnTMBroBL}jvxw#rmIjJt0tuFRf*ZA_C zONcROmw)=9^loZ1;ORKHbnpSx!K_{ZFX2<7?cgy>m~4LFZFd_uX^Pdd{KUuC>q0pv zB!zddgF5Gnw;2BMQI?hOq5fUKW4e&kG66D)+1&c-e)P>rJ|l)n~=}59A$P{zDErQs#-o z3}CD-w&R`Bzk59z`R4?IVep;We!$ii@_e*7UIcHwBBW>ulpMGVDHT9W3iZYHm(Z1qPbh{C6O?;r|I02E3z&z#;+P13X=~g8OoA);2j**d6N3Ymz~9c?#h@-q{qFv^;yZ zS@LozOWq3EoXhBqJm6EpcJ#M?RQ@@<$$U5Lmt{Ra(ORh=Jg6xv#w7Mu5_Em4Cd{8x z1a>m~up*&>9Qy7qz27`c1e|-AW?V1#$4lu1g*#ac$w7!UixP^_IC=o-y!if!PEgxP zc$%5rBVjzOP5LScn_Pb~0wRofvZs}!d$G63ECsuk9YwLfDQw*){vism8PDToM#v)B z^yk|*JAvzOzYW34ZG{U4y{^Lg;Q z(yTOaFc9DMXk49iJyfrJhI*&_LSp}5rZLG;D-+%QzDoA=OpmXNBE%F3vlYrT!~1=*JYu>_I)JR zK4`WCHlP@8liU=6`fea6sGmxEQ%CwxfFezI!}lksQ_ zK#a|#4C1*AlV%B0WBx&}&dU|RKHVj}p&$C_^KkfN?jpTe4UreC5 zfMP_=^ttTvTL!Q>C#|`!tk=>c`Sv+nVh@~a3CoONT0(*m(Qj7XIKLvW~_be6Gd%@kq< zo26t$@qP3R(g&z)7pQ@L$0pgutprYoN`2lHzvghv^g#7A!^bgb@iaV8US6^33(U?i z?NMC)nn|Z?E#vu8RZJBkJ50!23F9-PGd7P$A71=b^@4BvnB`@*>?9U0%nbsjCp$-l zLVF2P>P7ToBoHPEe<^_{Uc+Cdwjx&lX^+zDRq3C9qI+L}CnU**lVa(Mf0F7gtwQB( z&~W->mFd!|Kc8ZxAV{;_yd1roW#_c26dqcPKUnSVNh?#6fD7W_$9+QcISvA-`d%5b zK+vc+sYuJae1{pddb$vOaDmT^8e+vyDrpM}pY0J?*PepUJE5-q`UkNt7KwQk)VhI5 zBTo;e5-?B*{y)6|B`cCXn`_{9R)ENtP;?XNb?7r& zLna3Y4**h(rLo|CV6g_YpR#^1w_p<&1uPXclI3{~Xj~cDPW(wfEM-3tZLN4YZrww? z`k$p6=vT$UdP8V>p5zlkm@dSA%B0FAXEO-iMsw)0SsrFa)Kba#zE>64?e$>VJoR*b zlTwA2;(c2`=8-`6YBp;O`y{Elb*t%Wx= zN8{7C3#3GG##TcitS*8qhsB&$7e9O)m)Hh2#KUDB{#w!YGO)d(gYV_^ouqAH5K>&d z;32xtX!#)0J&l}Ms?0iCx^XzYwXchTE}Ne}ZN>qwQtjl0DcRm)+|km5eM{UTvY@%c zGvlrY-hSAqPg40&obXVDP|aWLm88&dHe8U~4V&e`2=#MbY5lc?f$l{jYQZ60gXhJD zu8_sQd6oSO&t+Rvbr0vmjecdY1 zlHWt{2$EKYeTEi3POUJp*RsRF&bo)W#$*jaq5L|5Y1N!l++#^w88~Hynycl~oh`Pz z78G1bmHu19Ui6tm;^sA+$|7%86+cH@xI0+yQ|WQj6W7-x1^Kj&eQ6;r``f!xBgg%v zEPT9>mZzKP@mSlUMSPFW`7Q}%Hk&%qW^JddoDldA&UO~uy=+?CfsumBq?KDy(s_`* zD|Uw>^n#D*|3*Vi83N#v@NWA-01Ro_jO2;39owWYDF|%Bz;1+~Ub$aqeys22`HAbK zf)}K1I%58ke3QXZ>OlvMJj(uYqs$fXA6uJ&TWRJtOJ!jrUkeplgHCavsz8ffi!aG0K_Ek|KHAR_ zr(*SRT$@xN6pCoV-ilE}yJKe?9onPq_?|_p@w%MA-WBXKMX(`MEch5w`+nRB?ETz} z^f6Cv>9Mw3sgqh=(b-3=_fe$Y66;H0uGq9?q`c)b&7f#djx&xXA=*YJt&tx zkAN44c(Go%RRlx6pCw#gB2>IFvkQYe0RO|mDo0RJHK2+i>{b_AFibA)Agdv496l0lIdFmn zfApvJS5apdw0tS2^XKU0oQ#3l7tY09Ja`0u&`20_5fPqLz8&y$gz*c-8UIZ zDX^D@S2pn#T~7>XLb5&8wk-hUY2iDU${MEm4V*LHVn0-rfZGK^tiAM>S;?%vA^La{ zJUn+1&i1Wb$tj(1UV0d8ns0Icp3l6$R__;!b!tw?O0+ZHs3&%Hz0Re({i}1e^bSl> zvNZ4f?oqOe-@)82ZAI#|zVFE?KI8x&;aV%fIR!indo_~-8%VJ%gJu-MV>uCCE3GjC zr=TU^*o8+=qEHQokJ=B@3s!RC=zLPqAwo#nUUfh{)(gJd1a`0YJK6AwY{J0q$mLO2W;6mYl);LB9#|6>HW%9o z#`?#*;DQY}ZGqG(-}Vg~Lv=33DM#>f&ylWQNS%QOK_L-?}MWra+B);{Zff6Hv9|pzCc3(*1E2Ub8dp&FjNaO;d9C~;b0YG{S{7^t z1KeG&cUvl}ZxKV8ufGUOy^(skw%Vt8C%Q`qioY#1>f>M}(fPq($ihZdnSAb#$y*q) z{kezwR-*>E&01;tHZsDX9k4wEve~Q6D;6S|aLEby@s5Z683JdIP_yJ*u8gh%uJ3Tt zuvJVBJl5f74#s|^&YS}8rGgiJ7!fQLr!mmPQpKQQ=Q+N}-KNpBtM**Vt(S3-3Z8gn z;w!<;5r`23#_~zmv#hr{tSVt+s}JVrv3|X+JJ!c3EJ5w9YQ!6`K!g*gVH~N|1n_)= z4OG>xlg{Ul^}xfQG2s44#ryM(1h1+zpD8*l_-raK`2FXEt=hJnEvY#OFgj$h)kzml zM!?(M>J=1ITke8xiGcm6G4_WoDZ_3RN$a^AaB9ab8C~8QNX+);5^iu-s?6hM0XMU+ z7zFL6MY)WQE$X2JU-L}?V=lr+)+gsmzcjgh=U@Knkzs2MRQ3re_*YUQeReBaJepB{ zz!!#EU*Q_O;LFm_7~zqh!-?YSs$2NYJ}hGQmXJSXFLxhnRgo z&{5C_kEsb#X+wTfJ`b>992>6a6!zv5P8R)HNVgPP5%_jKcr}LQteQuG_gYY&9w4nsT+`NGFUtm0&f z^nWWu)3cF}uF}HoF3GLhyb!znzybW%_7`Scn!5i>AjU_e>gKnQ_Y>|D>WheKtwiA* zT(ZdhT?|%@BKU->sfmX^m`Z1wqp#XTLs7NhARDHHcsZsY0Nf1Wpd8Nn+eW?{k$l6BD_LWaUaFWaM1PE9FM+`MGAyj3uM+6E3fsY&TPHpcLs z8;bkkJVM|TOZYJ2Z@5^bUtj~Vt|07+NaV@*Gz%p} zXWXMAWzlIn$8{@^dVb8!&W$XKF z8a^nFnrc7}3Ji?H+5^%f*d4bOe$1eM@f&Mv?NRN&t)W|KWCg_Y;?T6@`t+3|C_WtC zznqy~3&yqKS1MACG1h#e%AG-HdjMK)Xs{edTia{!bNRAm{op9wgM}R~H{@V=-XrNj zUhwq#P%oDi#E%p1OVKFQ#Yf&6G$#&7C43!`f-ifU;w+|&e1`D@JhBFq^LTYzCa@`t zsNJ>nVjeMScRmT>hl&EX{Hi2S7>3b56jvo4yjX3@@BXQl10xH6kON%Pi#wx&hu%(|n~fQy9{ z_&?KpwNgHvsvoJ&Gzxw<2Gus%=@N4m4Uk0b@~R%lnDCe0R4QY!oEDL~QRzVTUOY$42AZi!`Nr{C$Ou|Zi7Irx|qH?w@Lep`vmkNhDIL^ z0RL{`j2aO6Xc+%z*gs-foL>+Jc^n9v?_)yMNY(LYKI?uu*mZcyXxo-YJ4rX+_F&jk z$4lw<#OD8+@&x9(KSPAmeE%cD5+-pE$4k_$Ax$G}trR7{VQ}po{tL$7PSUtAH5K=J z8+aqs1!#!lWe*~4ILM#KeN2Dh{D8Z5OhK@IZc;*k>)8!cyE4~L4pxfD%a=fTw;c(B~-$a*A*T)brgD?{PkL&;Nb%an~&otk7Yo z`0g)qWE_P0P%E&62PzeYKY`ThWy?l1cwxPZZWLfE%FZ{D&9SeM1OFH;-xU@a5`>=iz6#^bBI#e8_azy z@XUDxb+`Mbn#?BIb9qBkFVg$dUe9ia&BlwMFKy%)HNosHz2(wuIob^J)y517(sJW% zr0##xT_51h6tK_64GG@vz|RaM5jzZJDXXg*(5-aN$wuBABjOS>RaA1^DmbBB^Fa9_ zVdxb2(wSjIpmz7$<*A}x+rgF5h59QIlP@f;ZvBDvy6GR%k9BtRVnX?lXLiw2wBEAg ziil}_S0rJBt*eX^HF|1&r#Ikw{Ov=lpL(_&T%lBOutD9-*Useb*Vrd*3g>M#vz8%i zx{Q*lH6Tp@`DrtPV%Fh5pwB zN)jX+WWf*1zJc=$hO~4Jw2)2gHpXuf>P~xyjx#Ig`>4zzEW%b#N1+pi+@_RZujQD5 z*@tbTnEdDNsAYwP{_5QV$~7d(MerF2Uh*=Q19eyf=hnE??y=q`&q+~M#+r_P6e0mp z^hr$5$EMWB#ib*$DGy$si-b_j`h%+vh*+J)!u*rY@k6(i=X?i)+sBM7_nOUiVW%vh zxzdCE!Hln!)Inb_>G``frJn7rlG2W-7y_rW*ZhRX$&0rI#di-t33bBVpTj@ObzW#)Hxz$= zr_WXR*<+-01UOs)rW_So`qW>lJ|x((ut6iQTD&fNP0rOCPO}c##%nHiM>3_2ROQRqtGNMSubAyGc_$o#7nh z-BhE*&yP9+Cf(P^4Jh1M7{uh-i2u0s4>$HWr`cmzF z0;@yDSff%+Wqd5>0Zg!QuFLn^?%;fPc+LRypZFSjVfi`vi`&rQ>TXE(FC2H?c17OO zMP|EJADhB(xiu9xEVyza_wv2&x(;Cy#@Oq_K4#pED9N0Xsu`{4YX5vcF@<^Ajid~h zzOxS`X}BEbMtS(T_~cs0RSlkqNxL8?MwiyzKVFcRj6#F8f0rptel9`U_s`#PZ=^@u zS#j%NHgNC-HH~E*$NXj?1pOvVL`3-cv>Q3ii2UFx%>hX-`;u&g zB?EgLfFB#CkUit%WC5J7yyScDB?s2B&O7hwz%w-#!N?oBjQ%ggUSexjojj1-TGyL| zosLE(?mdG7rq=&Ga)caZt#|}~ejDF&1ZmtoS_|MJSlE4{R}U&F0C40o;ijsSwoHq> zMQ$dej+708VlUoK5bT~aoeKN7RZC9qo|OduT|iwVp6F1i=2a1Uaf} zZT!13&gIGxzd!!mGyRVhn)|4qnL1&MRkM=>({Ei4yT6NL`B^& vLxyQzIuZ3Er;w6GfB)a*|BnjV1$;R0niW6e>ih2^<(;%TcQpU7%ftTzsC5a9 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_баннер/frame1.png.import b/themes/space-pixel/source/Анимация_баннер/frame1.png.import new file mode 100644 index 0000000..55be4c5 --- /dev/null +++ b/themes/space-pixel/source/Анимация_баннер/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b36jhy7q4evdp" +path="res://.godot/imported/frame1.png-cd0ba1e22331fe7e733cddc38e0566ab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_баннер/frame1.png" +dest_files=["res://.godot/imported/frame1.png-cd0ba1e22331fe7e733cddc38e0566ab.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_баннер/frame2.png b/themes/space-pixel/source/Анимация_баннер/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..8480f12c5b52004df67b76acfb49b1f6991c1283 GIT binary patch literal 11294 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%0D`co;< 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_купюры/frame1.png.import b/themes/space-pixel/source/Анимация_купюры/frame1.png.import new file mode 100644 index 0000000..e8ddf90 --- /dev/null +++ b/themes/space-pixel/source/Анимация_купюры/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b788j2vanqnch" +path="res://.godot/imported/frame1.png-960910820fa5eb8002ba0ea4a86dd2ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_купюры/frame1.png" +dest_files=["res://.godot/imported/frame1.png-960910820fa5eb8002ba0ea4a86dd2ed.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_купюры/frame2.png b/themes/space-pixel/source/Анимация_купюры/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a496b8648e46dab4f70a691d74cd74992552798 GIT binary patch literal 2588 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

-@nzigy{f(79x`q*Hy_51q;rF7C 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_купюры/frame4.png.import b/themes/space-pixel/source/Анимация_купюры/frame4.png.import new file mode 100644 index 0000000..a3e2283 --- /dev/null +++ b/themes/space-pixel/source/Анимация_купюры/frame4.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dttdobjlr1qc2" +path="res://.godot/imported/frame4.png-364c8fe41c61fd6415c2e229554ebfde.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_купюры/frame4.png" +dest_files=["res://.godot/imported/frame4.png-364c8fe41c61fd6415c2e229554ebfde.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_монеты/frame1.png b/themes/space-pixel/source/Анимация_монеты/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae61014d3d22325388523cd8f01847297e02737 GIT binary patch literal 2624 zcmcgu`#;nBAAf&lW=Kc}$K_Z#=*o2JNNg>)=tRCHB(rr;$gQHt*oNgs@e1B*a1(whyCYq7+qh!hr5pQS>Nrnqmw|^Uk4l#@TtF6DQxooW zD_1vB>tuWBQbj(x-|y0lpyh{a=LOx?GaI%>|^rI@g}uTL}jxe)Aij zXRh6r(D2DlHmBqdQ9#+G)ZM^VpZkVkf&>|!c;7Ic>6Udun6%|uILm58%ij#bA>)18 z_7Q*buJKH==-(1GIeK7FJ@654X*zS%+d&niQ8e-qxF3zlD%E2za&xn;>}DX?K`#Z^ zpm@or5_L1Od7TzW=2nyqzwg^JsI7H3Eyel(3}OcvldqI6hQNC`+fndxD3Z~dMt%{3 zkAUs0RvNa6Ea1|#Jx(PWl*9BuNvufH-c5GSL$GHrzcsa;?p^LsuWgmAtJcbvp1=1qyFG6;IT(NLHgA|$sUxX~}S z9feVzoz`)xD`68zAM?^Ptr-YF4F)$&`Ps5FVK2rD=lItn0&7?eAs92Wh`r(OK1VMP zQRTE+oL2$5&&1-!Gy^2K)$e<-Ct5FC6~gsT$Bc2s?XxZSI7U9}d{*P~Y~O_A12}NO zPoALD!bpOSriyBUSD!|PF>v<5XnZ(__S`|^B`jLb=stqj?1F`&-CJi*0QB9E~Hgda!aKXWEpEpKarGQ-dBeI)BE;yG2L zUE0t#v>GapnLy8GajuR&u4jb{V^&|YqflXbK(2`#G{2S<8T~}rw`aXEo%g)_ZzyGB za+&4ws-AGPl@wRqBK2Pp*a+ztG5@>N(^-X`HU%dw1BJD3WGlUytk~%;GkU$7VnJ_v z6bb`F@x|CpI4~J1M{RxUrC*hDP}igWSH5e})J&Esgf5;nCiA0+kC#00S2O`LIF_1e zk2N?3a%`8?A9GIh!Exppm=T+CQnSy|Ai<8%N6H8Hs*~irLvD7foQiD|o1OM7xf9840fAU#}n6=}ZB-D~edf zo01$?Q2HT@FS_vH;!jJH3z;*qc2p!~m@qhWspGJTa0MEAi9ll@_V+fhQWtPMc1V!S zboSo@zBQ1zP^(${tW`G2HJoC;6zC^j-?yA6cgMaPvrh}+UeLGb3_4-U11LtMTG5qK zx_?dtvy0>VhIO%K(GeFYr2B0hCj3mkWxf&%z zQ2VWh_v4G;!{K@DMyND0kNzgadMMq&X?m(XRs%2}j-I}d+@#Qwz^9un=tR@ojtF2m zH8BuTpiWhwBxQ&WA$;Zk{6u&NC*=zdP(RPXj$v=JnwdfISGX2N37B3j6$j8$w`R4d zmH1~PM5U+^XVyQuGS{qxorjk**yj4Lw(j0I!~I8%-&iRUIZ;Jorg4=tRtuz7)oSH5 zo4l!KO%`Ph{) zo+Qne90&53)GS`tGnSgwW>aGn{88&lF3dR zFgyI=hh=%;a9)$HW2s_Srnh1I z(;dP_8y8i7Ir-ZzT6iqRuIpz6uExi0&XS}-vsO8-JWY!eNeAK!>~`%fc7UN2okXQH z?SuUn^g&)j0n7qX-dtciP2V|{8_CNz_jtI$l(3Fr!HxZW;|BBF0rJ(B&0#7RFxL>g z5_0%Cb5K6Hwl`H1Y(3YBPqClUoex*tOqD0*?}KWyZ+YF9l8ZtI;9%1cWQ0$RXIBfS zZM=v%oS#nYO*$mIm92UaXm~fM74bg^imTa23=_Yo>t{W7R$QwS>He3+eSN?vloz?L k(uRD^mggU=v_E9(isG0iQPJ3vyd?xKj&2S$cErU00^Kik)c^nh literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_монеты/frame1.png.import b/themes/space-pixel/source/Анимация_монеты/frame1.png.import new file mode 100644 index 0000000..42ba4d6 --- /dev/null +++ b/themes/space-pixel/source/Анимация_монеты/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wvbp1nf3ojdp" +path="res://.godot/imported/frame1.png-5dee8948344fd4cb527c87e272dc7f45.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_монеты/frame1.png" +dest_files=["res://.godot/imported/frame1.png-5dee8948344fd4cb527c87e272dc7f45.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_монеты/frame2.png b/themes/space-pixel/source/Анимация_монеты/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..7f98adec71bb9052cfc9fd1588a507f47e0e4d0c GIT binary patch literal 2592 zcmdT``BxI?8va01)EqM#Ev?bUQX4aI%Ux)ZY|^yMDN6;lj8sC)C368uoy>)t7Rfa6 zSZZQQNiHcNc3nzk7`bhOOJ**);ff+4gPwctpK#B)KYZu?p7)3EJ?D9!=Q&@7_wged zYIbMK#jh?qdOb%EA2@ZbV5-lO zvi%}N`HR!xVdU)=H9S;nY;pm8AUD99_xNa#A9s;TZY!$LOTV0Lp`J^z1=p`e%TEk1X(A=j6T-AG zC4~jplt@@Tz}hz9E^lIn&JMP!zpS(JO0LDZsHg~q0S$AV9D<4(fCqMM z0lXVSLj+M93Ls1~)qf8uL}#S|EH5@{kT?5%EXj&OI4AK+uABMxmd`5Q3^tA%5=D!D z^@ilRI#x;>$mxu2kY?IFrQ+?%Nog%X-{b5YC>%Wy9r1j}UiA&*+F;VdvgN+!q_1Sk z*KVj>TMe(z32I(A2oU*_4X0%OzNQ7+>xYH9DYqk0cEhKz3K9`wk++AoO-c<6+*mAY zCnhZ}4#>rwy-UQHp^w>Qj>#qq6Y%NNl+#BuHgRHPl-1Nv5cavuvwVvYPZBoAdIE%M zX0dnKZbL8@{EfIgKi*y)D152PaA*XZJd|jx-A3}SL;1~-mlP175D>trgz$<6*sC3T z(~qq)=Y$NI5fz5kbvedO-^l6Lf|AbON)T9^LrKr#h6Al2A_HI*b+VV1uo4)@B> z_YVwrcrC4WQw6wh7JIX#^pP=w^xGt!r6&=5Zd~0`EqhpPM_hsF0T>@Z9q1G?aIfng z$5hDLm-e$SjdHRZ&B~N2O#nICYT)8Y80fa`n>ItQ_L%myim(lCIHf5#2_#XZqLubz zz}rh4Jzy+I+L#ZhjKXelzF_fAT&sqPp^dM zEVpZ*ahX{%E#T4e`8$cSlYR(zh;0Tk3TAwm8$4+VP*UN!IIP`+eY`9{g_ntY(gAip zT(Zp^g1F+uV%815L%tbu2FC5dK}mY37JQ=$_ve9WIJp04*?J3lVU-F+AvCZN>WSLr z(wJ>xi3#|_*MA84c-%`4Yrb7KOGYQezF8+A)}==ne7Cy(ZTmht@x8zNd^pbyCF3gs zN|`~=jIMI+@75=8)&S&7z=itN(}8LXx&1hJmJ$KQ3T`#9Lz}@Fr7`NtpHv*kh!a2P z7R4o7=l;~tRPPEwB@8!$n8Y|*gCNnufmUe9bbv54hFyq!sPbXJ(Dp{*gXXS7<+MX2W#?OEG(>7=g8)spx-eWVKY zbREL>vlF|Dck@$*5_b4oM3##9ca;_4M{-?~2YrD7eT)S!)DdxdKyXrGXADY5?#v%E z2&>U)X8Nru8gG2k31`>A3Qlic(|wK7a|l$*qm9^mrU*hhue z6WP6(W0cM(KzxdSGht$E-3Vxs$NTb#!TLwd6ELk>bpv zkLt!?YvmoK*Y?X^cjW=A4`T9_J5IDt*obA8TELesFN@<}NGM72i|1lo$0~m4sx58~ zhtj@77+>$7TcD3OS81zxLI)KOK0zW|pWX!Smdvy+Wix3&YK!9$v*gjg-&4*Zg*;VY z>Sy~(m*V+U6;5(R_qdj+9@2lSg1e(MFV6f}hY-(vO=H2Jq!Yi%@z-Z&I$2LQ1Htwu z4{el;WM7<-com{B<%xBbdRXeUEO1t|x9Lc>B z+1n5wKdBj+FFR?YVwx~zIcou3xGNbE3^Uw|53`{yp37>GNUTxyA2%hijiTXE;VYSQqtA x%)apbUu*E|mRE=ia9{wY{olC${|5;TtC~}%3}yB3thK)&IO=x%aMeL9`5(u^dyN19 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_монеты/frame2.png.import b/themes/space-pixel/source/Анимация_монеты/frame2.png.import new file mode 100644 index 0000000..bb08414 --- /dev/null +++ b/themes/space-pixel/source/Анимация_монеты/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c86tbkgsk45sm" +path="res://.godot/imported/frame2.png-23c17d281b5fc290f7b4d4df65cca4a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_монеты/frame2.png" +dest_files=["res://.godot/imported/frame2.png-23c17d281b5fc290f7b4d4df65cca4a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_монеты/frame3.png b/themes/space-pixel/source/Анимация_монеты/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..01055c9978e715756af22cb91628624f9d90f0f3 GIT binary patch literal 2441 zcmc&$`#02E8{adgF=%QuopKCOB1O@gAqF$KQ!^yxGOi_KUL==rXqqnxCCzapxs%Fq zpW|SPGE{Opm1sIdGNg;-&J5XUbJ>Mrk5*Jw z1OT8N9c)|yfXTKnfI`ZQcjT`@GNW+T!7~Z~CG6UQfxH40S&ZOlbI2{OVDdeeg`>le z{pzo_2-z!{Wx<`1*c@q5j`2nmUCh^OmgWyz0K8bClf01aA0+IP*e^J?XB2x)=>Q zwSeYL0Qti~k^(^K{IibxH7Qc1X*SM$QbePa^CJ3)2eN^G9YIW7o$Wt#;gy+HS?+Ft z;DNEiFfZHuUPE-K0vswlPH^X4Tb}9JrRSIMMVKH?I906;(z@^BugXy$#hFc>&%Du{ z$$THo&t^2HaJZsg-Mv5`Ze@suhOSDq8&WtpFRNl|A|42X=7u9iN6Qz_s7oGp9|4$B z^5OfuTiQl@b$YjM6u&_sKmu<0o0hcRu5H!>k?gMus39#&?sdKCv&J&e0q?O9#z zOtloh`Z7PMv0~JWK`{IkLAwzU)*5IrcfdfSh#wtz%S&2Z1JftGDrF%+VO7l4hGU6D z$xQ6lCWb#6B+~w;#a&(exG8&9k zd}o}*gTBg2m@Fy<$NL`BeGxO*(OE@ucw1`n$;}^i7iPF5bRlDn5}zYLhe(>meZg53 zEfyP?uZ(I)1Izqp6rMa+0P$b8awW@mI!|1B^z)SCTRf~y(^|$(+YU_|EWjKABtsZz zM*zhCI8i#99SMT*=?oTk_G#aS72gy)IY>sDEkXRP&aTYf1jk(*7iKM=z`iX)uHk(p zdi7$?Nm_5|qkXmAMJ3B*!3kPNCljGPMMD-Eyu^ zF5qRz4gAGMp~Z(fLbQ86-<{Grd-1Tw2B%mfAVc(erRuVYdM=A`zO}=<^_iF`6})E2 z)0hZSacs=nOrU#i$}e6e^x$igjF~KX)|Yp@1Wq#}yg>&zxrn;D{1u=_ti_xQs%P>u ziy}?eln7apMK6gvZUUdXgO8BDbQY`@aqh@=*WIYb~x^4BhGf0?;OGDb{? z8e%3|HuYGbOYUSh#*S&NEbp56b>(pxtb6DujG>w;>E-LAwbNx1o$}d%o>Rdx0_7Z< z0&BUhf&x~TFVip$n*^$US}k%*o$E;G@? zubr4ylYVMnYv!UTvWWW*`<3l1=y}&TZjPT@LkAfBO4#~==1f0qNh0uQ!lHjVbhhWD zChGFRyK8kl`jAfH@H71#8)VSwfPt%QJ5Qt&AhFZ%5QPGq%&ppnZ4o4+RG~-v=CxO5 zP5Ve&2VWYmlG=Q8;&^N=ff|udg$~3i z!`ikjJsCcP0oJh)HgRy%11^G;)BD#9gQ7e@S!brUJh>#LDPxjs@z6s9++Bm4vi%&ky3fqK|sXE7!$#FP)!<@bMIj9zYP-X;y#cQI``oHl8M#6C zwN+$oP$ju3)tEz9%(`KZ3@T&#*{xjp{*B$5n9s^6x4=nh-!-jy^Se&}e|`NQ9VS#h ai40ht0|U7qE0$!l6>zkr*wkA2C;bh=e*G{2 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_монеты/frame3.png.import b/themes/space-pixel/source/Анимация_монеты/frame3.png.import new file mode 100644 index 0000000..d2d3fd3 --- /dev/null +++ b/themes/space-pixel/source/Анимация_монеты/frame3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqmdycpqehblu" +path="res://.godot/imported/frame3.png-f14c2108ef59fc01ce9308b29240de41.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_монеты/frame3.png" +dest_files=["res://.godot/imported/frame3.png-f14c2108ef59fc01ce9308b29240de41.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_оплата_картой/Frame1.png b/themes/space-pixel/source/Анимация_оплата_картой/Frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..e90e0a9fac1a64f451e2d5389f5b1d3d83bde737 GIT binary patch literal 3895 zcmeHJ`#;p#A3mR%VN9+SW!=VhQIWfdnJD8vqgu68b~jyQ$X3$U zVoHpt44cbpcd%{l3<=3)5Qb)${e0BSn$>^s{r>QIeP+&_Ip;ag^Sqz;`QCMpz3eiT zWdH!#-3~k406@VXQ9w!(eoaRG{Q-XANDkf+07$Py9td2gDFYxkxO<1~z9`yAr*%p& zS-ocb>BGD#kHm8)&+XT+)zmcAZZC02);yHOEdKiI#>gAYUF&xKu-o{qvjQp_?J@t=h-*c=W3y6g-d1gP)f%{3hW zplU(@oWcMgwc`H+B0ff0bATRM))___<_>dtohB}5k}}MgI7w+>w|NeoYay?(UA50# z5uF%e1T!l}=wSvswd?y+&Pvm)zKNcvM{jJBM7bOOcUG;I&91#V!_cppH~=v4qp%JD zn;&4S*uw6?JeE)}Jrv;|h$kF$5{hIGbd0Mi)j%5V(*Vfc*) z+kMDRjVH_5oICLlR!va6>f#k;=XhgN*7MP0-14bg_=|H6 zKlDf~_68Psqr9g)l`V9jBk>4`~=r0UQl2)Gk&-pwM9$F z!djpidxoCYo3v?J(m>q)35E5~`-~9=R{||vUS}y2%Umbg5i#=#Ky{AhkLP0JJFCue z^!uwT6wPG%6JEaVU?|*q$Zi;s6jD*U9HdMR+%MOdJemJRvAV@5HviMg1ovnB*W5jk8CirKog0P7{U2o1CD#aVaa7R%{Z zzdLS(cX~cE^=Y=q5EkIqq@!m*?}CX|0_x?An7r}788TN$M|;wIWc2;qikhyvr3?LY z5p2!)xw6ak0p}VA+imi3W5CqO%X<@f_{ey`nTOqml&-(7{X75KnoXy{V)~<+u->7J&kpECcpXK-cS+Fa1)wS3S z{I=NsYgpN?EZxcK$g6XX5KcLfv)`i zugif!VPO923-PiIMU@NwHiDFY4`Z~~&&dGNMj@}Fs!jtn+Wh#5mqY$D6>Qdf8=LBu z=HdQl9&g*axH}shaWN#!K_zZH5vI*{;qH;iA^O+x?-5bjtW=LI? z=cx0G;E2eW^ajP1Lhz!rU2k*6e`edw^U<>v-+X5qY@5yc@09EyTtid&F~xaF^_e-l zVB0F2{t4KYm*)BUL7B6{(xANo zH1SZ(5#g7@m)clD9|ENo0|?Z9OP>t@gwhz3hR=}&5DC`_U6!H`wSA~rm!IX!ds}fU zq|kC1Exgy}L25e^pxIR}U~4BwZ;xOqVREK@?+poR@RG=Mz>$7SN{+LuVj4$olq)Re?2xHxhqQ0Ajq#orZRmeoJPVNmU-h0opL!2Zr#abvXL6i^4Sj7+a>bH(?M93CYi0 zgN+{IvHd-I1%ON4eqSyt&MkmihYOn}F8F^ouWU(ei>lIZC&8XC~c z?(h)+HPA{0rteYd} z$Df!T>$+WzrsgbUr108szynKodm+Y7I+B`}BG1P2`JG(7{P=!7E469_&y_6@)$Xa~ z7b@2^Aktc4P1Y`FN=msTyDBve}|?yXKur zXeca57zE}hzzTpnnjfFj8OET@H?svj&4M{z`P`rQ4V@}c-+Gfm>&|Ze4v7(63To`$ znyXxli8KXtT>mu0BwNMsM>1zjxcNAkaniBM0aQ27L1@`Yzjf%A}tLfO$c2sQAU= z8f%!g0Cq!(j1n#77N;Ik@~NK#dImKp{6V;(!I%qIxf4Zq1z`|nk6Z?j$D!ocEom9j zR}Yw4K6*k<&ehT9%YN!K#qm=sskVqrkM81_4bgSo=1p^C)|3OF?@od5yXSj-C5j?0 z%MKL#NB0oVAr(=Yp_dYE2EbmiddQOlPwHfw9rf{DWz(&v?dw@%HuN~3&>Bxs*``>d z=;{ifIz*^Da{5Oza?DotTHeMM*5 z9|>4~GI8lQyC*32;K@%2k?DZxpgSLUn2(MS8CeaYRZ7|dkA>_tHH4J4_r)_bW`dj0 z#w*ra5k`b{m+hU?$WDY;dt3sFY=;zbWMJ?QQTLb{}v}7L`$j(^^fJVk2`b({9PY)F98>nDan-TjS*BB}dp8(6b3J+Lt)^bgM~BX6>T9c= z!iPIMorl|}HG4HVW%r+DV)sl&3)+Z7eesum-Wyk!V_y3DC0|%1%OV1Vnu2KV00FWG64wy`ul&D{C{zYDI7k9Noz@`Kv;F` zvTExI2>(y89|iOm)9{FaMeG;sT6&o;ZQNB4 zPY;H;ms7r51>`(%oaz+Ntfoa>F&`cjwx}P_o?js@coUqCy}*HF@fE@N0(L^#ur!k| zIUGdyC2dHeLq4FjIr3GtX9a}V31hktvveOS0NauYqlr?p~hLB{$czmJhbYPq(etD!P>?Wr>o$(=FnzUB$Kw;VL-^%YT-Sn8f&+V(? zw^sqF%~LBP9*m}IA^HME=^Jk5>yC7ZMu%wB=_j3uB&enH?K3FNA-oTdpq_gL*qwZxWS&;T*mz%KhkdngvQ>4LEE_IA<;TVs>sCsl{-sS zH-^-d^|F1JvdbQ`@v&M!wqP!KC^Ev^{F$kqHomA2CqCF13iHqcl-FZd%uU4;!B1(t zA=?fMZe-EtdF3Gh!GBWJcI$G^%=OGZJ#>lbH=I=pUC@gO?Hx1SwR)$kB#kv&^=I59 z4=gAD!`3lTUASvDUPvNt7UE~iMe13SODyu z7krv(f}uU7j_;U??G>;b#GI1y_cc0Hl5RG50b&_2GYXDhc0q(8$wt$9Nc_M zg{8-%o@>xetQ9{%P#1MtlK8UgB*^>riiGyLNqbn&hij=`KZAtZ&Q5Owusp&HX z{?9wcg~misBv1MR0DdC@d|Ge!UGmHaPv=WXR5SpKG9|^PV()AnInvB`kBNv{iNORS zFjIj&D7Zh0I)DXRXxZeFP)VoI)2Kq!sHu$jUqUD%b)_b}j`!5xq7})da{*xgw2fLo ztD1Q~!m@~|+7-D#&oVWC%yS3{RUZ1Q`2le7{Kyl=Rchz3=s@pVVljjw z-pYZwXA51~ll{S}7t{RL4g>W$zte_9)P=8S95O3~xa&UCLn-mZTV;yKeu?@x+Rt0R z$dKuvbnEu`g}h|ciU;D6OlL!tz+?c9 zdY_0D4G34nFgt4fksyUETHEWex+jo)%r_hAf4ST{qw~STRTvJ0>Pck{__S_OqeBCpc}z*ue*5J6_kyYKEcKf}$N{@ddhZdBuSWOHllJO76bqx8F>*Sz)vP2E}fI zzww3*Hd$$O%cr(g&pQuQ@CQT7?GDoY(ZHshLyjqb^eezVQm{@cy>k2VRo@WaPuJGl zj2Uc+A68bP{4MSkhYm>zpj1VfsN3xjBIVh4$!8X(c>sDh=kjgxMeU*16EYRdO_tDz zv;S6`ci>e@L11)sm2kbm#4!er7B`x0!8@)D>!|CWxM zZnmvn%l6d z5EfpVfy|LlB~W|0vXypSR;#j=RblThU8t>Cz;rw$M6~SrqQA@z&0I53@NPdJuRp_X z|LnZ&Rld?|p%rnOV2!*0y8+6nCx3jaEup8)t%4~2a$MkAu?-oy_XudZ2^Mh6N86}$ ze>sD*hq=y9qDL_F`R!6Lqm&7|$pW`P+C*jX4^9&RV(x?@(4U-(WABBN+Hoh>o1y_! zX1Ve{fCueCwHl=hVL*4iKu|<%fWwTQHSlxKBVf65zkG4z7J9llYE3)J>!bphtRr=z zmS;YmaBx}^s9GG7l|*Y#1Q=4*$einWsD`C;%zd$!2aIi>=?Gip0kUH4&%S~MFBUn# z8!)m4AdhTrv06C%F$u)Td*a`qk|S{j#<5y2M)l_a@ZHBz9Mi;KKG;%vSUS}BmEBRb zwTD!ZOlz5E=8%&sP?K_lF~2(308KLf+Rd7^Zx|T}9R#dZRK*jnKh5zFci}&J1<*a3tH}mzXp+W*SJ9{`4 IJ5o;k7xj7}eE5EelM5}-n4B7qJX6p%oGpa=mZ2?P@Mh9L}XqPsh@f9&iZcka!dbI+Xf zec$@YF3Fa!XY?DY293jiE?gab4Zx=qsB70}Iq>g{(L0HfvV3kEW?%%I?q zonD^b(6UClJEOZgR+7K2-|V-+U?2}On9KPQLCR>d%_BHHDfKI|$n#9@rj3>p*C%w@ zl)pM$!LM7}7@Y_Qhg4;9BLE)S0bu0~0Qm+0Oe+`wo=^eFdI0Dd0DxWw0M_>ZE+CgJ zqr=uWIHl}CZB7-H$iu)3@##x(ls`6l0aV~h;#Df~b>*z=Ouryv1Ij_>H#s4CgQY72 zCa2$&4UK1g2)a@v?c&q4w0ry6tist%ekP?i5q3x1h|N_!EF$I?)sb_^?j{IgZJ0MP zuLg`FsIHg}W7^3tgu!rTymNt9B=&p+P8C9;JUyt3lZSwqS?V!7KtxrOxn}{-d4#RH zlFQGVI}OqKpHteug$z=~0!d9^-N07Zf-q{~9etPHiYv+k4Zy}eNFq9A((05ddR^Sx zdf`~5(r9v4S<9GuDL~`|Myc8fsSQ6D>tD(7bR=c}wnv#TJu|px+E|eR30t?)A`!Ek zu0KER|E{H`Aj$5~bXf=jHEUee{H@ULfGQE$y#oMhN)3I>deEY{*#8dm3H<26kfkg- zgSd=L@)7Aou7}U=ReO|=Gn@Y!iwo*wjPw%IXTrY(SSL(?v)pnA<%7o4*=Ys*v6*=KN%~w` z56gw#ba5=`nRf-m^yHY01-Ry&BT95oF2U zv_gi*yHL_id5@UxQ!SZdYVp2~>_DQHcMfcl7>AxaG6prEe;~Z>qnXtc;f_YjguUeS z#34-9Wv!%|8g$JL_XvoC5Y14GA2VybJ@=Esxd%p!$NXBz_Z<~$#58Tl+-H7a;Fly3 zZKl)AcgAB#+4S|IiR((Mb^Lefm;CU^exqHn;o0p@UpYlfi|rZmbs!_oes{>Iq_$pv z8}*hvhwV>gX}RVF@YEDlf5L21WTfRF8cCHRD_QrhI)3Vib`@RWcZHQ(qvdW5;yPYV z?CLq(ys#mINgy=z^f7lW2b}1?aRq-Vu?U1gTgr0qP!vTQ+gfWKg!ri6OyGcQ|08#9 zfL!1&RrV@5Ff@~u@p#?vpidIfi|NsQ$;m}^=l2ab1DwDn1Shjt;hfV}>EA4Iwj0#I zs*$=aWE`PpO>Zvpq7z+muv3H6GdU#L`_3vyG@&ApJvaLxogJlW@)(zNeGq^c^VZAH z3WdBPH06Ocx_dwSRvM{*E|@<e78EPx0d#jo8bI}G+Je;bvM%>YLlP2k>~Ru_FBO}r zVdWZt6-ZUBD^Jd4tfFpMc-85V(SK(vY)X-Xr(xA2*RKbzV5Z_H=YDH@wo-djd){~kyj`BtQ~a~4YrgW=bUQe2;EpLTxhQ3P8~6|`FDGj zIq&(gP+Xc{tSI29PtgXIBjOyDu&BmjP?_R`M46Zb zg#4XP#>Xyz=YQg827&`4(e)d@HC;E#iN0w%P2n)0-YrZjh&0`p zHN*(c$G^}im-$)VOs=edD?BjF3iK5x1pkCd)zS+WYt?=cwc3e?5-dt#slpf1s3}_l tqgI5b{(s9={-|s%+xZ_07;ArznQ1u{lRcLe3jGZOJGWE3inbk1{wH5d2^atX literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png.import b/themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png.import new file mode 100644 index 0000000..f1ea24d --- /dev/null +++ b/themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csk6lvfcycvqp" +path="res://.godot/imported/frame1.png-97ab7a2b966d927fb0eb9cca0fac7a9c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_оплата_непрошла/frame1.png" +dest_files=["res://.godot/imported/frame1.png-97ab7a2b966d927fb0eb9cca0fac7a9c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png b/themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..74f8b4a845130ac3d520508021ac2331fd514a2c GIT binary patch literal 3415 zcmd^CdsLI>9e$Hw0tORwl}ltMYA4h|Wq^!ZxKt=`I0%lFLXj8*MGhdBf)Xw!1cjj% zm}|Wq3~u9cXo zzy^L^o_|a)nHn5S=K5kh4n}?-=4kL@7%?Vb?ndA(i~Np^FfY~h-4DiG-2DOcxPT@d zZ_Tm3_<64!gMTbthJxDVd$J7xh*Yy0y$=A+7XXi904O*J0G_H%Q1t-NGXOw;%l`^s zK0$;OBy;Q^@6Ej?B>ngjBhYVRhn?HHwuT){JQ_5wqz`b@wqd9)e3465DS3u~EnSDy zw4)AE*m84h{$;hlN!^D74qgL-_)@6F7z3enX*G1N46qnzh8#h!jdFk)6n zmb0pn$E~20w1|PpQ9aMXBSjX9C(n&_bvXjW1wy7}Nu?09QMC)@?$w3E3o~WtA>pHY zDrWwR?DW{PrG3weZ38$j$TJ*K0=bhty*EEKqg5U(bq%~tKw8aiCo5)Ce95cXTzaNL zG!jTEqO(=<)h!h+@Zr0qiu#!0UsRu+>AK|3rTDh6djQH_yqocFbqS1L z*8-{nI|=yEXg@a3nmB?znH|L5)x=`Os8sugIHUEGlGxjCEIkbxwk+BVKY^7uCO5Eq z2t{f>tD(T=#}NKOl>SK19gW26!I2Zco_|0J?IGd}@iQ?EMgBkiMkHZj0i}7@+(Jwp zT!a9qyx^_N3!S+X0j{qIm&cfb&=5B%IJ^=FOtMvZ~U$?nF*(FEG2DVLE+uBk8xmYNRr3vrSb8-SWsY@H?7NUCNAZ||0hnK%5(JDWo zpB;Rwv^yOoPIMiN=(5|~x@uxI|!wJOtQWCA5~ND^}!Ya=lBBhf+yHTMcXcN4$O6@ zJeQ?cw2n!g?at=Dgc1uXzsN4I*t@;-87fq@`JI}W?gAH5=1Md36%FoUQ7zVgP$*oi zY6|SmUUk}$v<*s0SSlX#ZJEn3zI><4`sXNAiOj0GBQADP#M?uytoca|jYFYcK9TN`jR62L2Nv0EQW^CzyQA(X7RpQZcVu+!FrN0I97=4-FNdS$h z;UWb|+`+MrINjgyqH#aoVzoS`BXj&waH0u*E}ra=GM09FN}588$+xlU&9X|>{6eCioH^9vgHX-U>3zb^B?;;5aHF22&uQ9L^6WO6b{q$g~luC{B4P{Y8zk)US4na3VP9JUBOt0~L=v9w9H z&-|%wStQjO~pxSm&j8KJ7b`nHA<+#eX7}3A&!N7A_CwX;%Apn)tCB zZu~Mww1ibIWj{bd<=5SnZp!D0S1?SLm(gK-t2#5;- zrGhl3yue-w3-?0Iq#k=yY>b$2L%x|jcRxdI8;w4$Li%(31AD(w8064U`aH!Ct;j%y zLQp_f9Q!9h;&L(pS!hjV4kTnhD;b!Jxy^rDFbT@K10+Mub^=TzoG30>^*5KaE45_UBAt42~}78j>*l%p0a!*D2Ww7fm{0NtOkh4CelyAm&ZZnDNb7o5hUgNiF``dMXq z;8R2{E#ovL=c9DF)5@Z)m^Iy?+W%{13LJBT;fSznIc_MeTT_sf-nuP=_iy%G@}!0< z;s>Jw)LK`$ffboloM}3~t6O7iHI!#3nC~&ugCopl!dBo4)34O@RYN_v&AG%pIP2&w zwB*Rzrl}OX(s-BXl|SH|-r?E488II}@yo0l(W=hD*i&d!p}oE1Lx#Y&J^K_&W;R}- zU0sVyW->nAwMhVJj8ZQY4?FXHU0d_LyJ+Keu^+8(^f3nGIw=rbhh<|8Wo^~kTZATo z4IvLV!x4y>GW6eHO{e$TZAdj7P}hxk9r5mN`InjW{|6vstis|r*rhLT&IhahDFHw4 L171}h5vl(Gvcu5^ literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png.import b/themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png.import new file mode 100644 index 0000000..c6e3e1b --- /dev/null +++ b/themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://grc0j553bn70" +path="res://.godot/imported/frame2.png-1bb933a1eb61d4ca842f47c39534cf95.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_оплата_непрошла/frame2.png" +dest_files=["res://.godot/imported/frame2.png-1bb933a1eb61d4ca842f47c39534cf95.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png b/themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..8e46e2a3a70bd51dcee43b8f90173852f51efb5b GIT binary patch literal 3355 zcmeHKX;72r7Jjpk1QQ7=WCCJBtgXF7t%6p8$Ra9wRlt^^EJC1z0>fee(I87chy@)h zu|-7`S&BMyZ$uQP$RZGA6k4>QE^Gk_1PKy0$tFvn2{kl?I^%Tiy>ox`N9M~+-tRr< zJm);mb8^PR&2{M#^CbX)rF-}6`~m>D`YRk@Q0j+_`Fv9SFl6lUi3I?=Li2%vD>*~} za8LH`boONC40rt+-MO3KbnxpYpKXTX0(`%amxFM;oSw8s1Uo(w6V&m1V9^U6Wgt~-*$kk?amO$m}CVGh+e*oLTL+qcby`@Sl+xNNw2@buYL-vW8ZIf4$ zi1pEr^(PevE2%cE4|TQZ-}GF;Ej@7JXnb|?X#IUc`n12jAe{edQR-&!K5s1B!+oW( zP2!fclmIlV_0tk6?yw8TBevYu3I=QE_3hFa`-YwG%IA5=X`|VOEOX zQFG@g*gM+X17!h(+CkM;u;HOT%8kZC$Nu{oNt^S&3Hh#bYQLCuOH+&~ zROBBNp6?pn=CuE!d=E$ySy?NaqN0}FA8g^>C}ho!w%U4`=Jv`}Ygztcn?|qN z;=8)}Ynk15kVj{P!{xGcbXT^5t_m^89f`?vHd3}L^(&(~EK3?R@WMw4R=7|iURp)5J z-g>zC?iq`(>GKe2q=$qw=`C>Jb)=)C{k`5NJMAd%j`0vK`A*E){GycB!`h6rRcZ99 zaRam>wj4ip%m`n(j`}_ki$Kt%#~uAt5bPeNgTyp?Z%Ey%=cLdT#+fPa#*-$nhlI=O z$h1$G79akyu8!uQw*CAQ%WWF*!&(D7${6vl-J&nop;yEc1L5V@!>)|5g1T#lPp$_p z2}!k6UrK52RRQ}>>vrhFq`e->jT_(~SRnVf$9b33nqTy%_`|NzEnPq9|J)5~y%HA| z_k4ddtaA37q^UB=j{r9;SBUr&T(n*o; zs)+=g{*>j@Gird_z`-_ah? zY4^6bALg8A;=uUs1r|N~ZM_!t7%U_iKhX0#60BR*n~Pnww_DJ#6th1{^A8ORj_uElBAIK;1pIqopeo-t`$0l@rP6?Y6}LMJ&}j`S?c0 zYbEhaQ1M7>#Bio+_pFo=zks%yjR6OHO4|{47PhXTVnpKOeokh$e4d#V2D}O*yd5>6 zhBXr|ic9y$Kr70Xo<&venCY=eK`m=YN#9z1`^&1QTeGc;MP)N@CEbn+g}948a)u@D zC+OHxFbayk7SFlYQ!K?BoLpM5O$&SDdT51TM`~&Lt}%iivY_h4(V(WhqU1m1;ehmh z)Q!uraFX|k~5pq%HB63lj2xzt!9&L_0<-!?N1-Eg?3*^$W(8@U+!{*;ZuO_pqKlWDFfPQU| zU_u@%mCrsq1adL}#BCqH`lhH`a(V!K{?4O?b~vMwv=oP4BxoR!j&atrk!6Y`zL%q7 z4G=!gAlBH7p|b+jyXxHLSYhBK=y2ZX!WLOSM{_aYcNgMgcHp>IRy?(t3Ub)(qxS-|L{ZmJiO%4`#U87^AlH-*{l=?Vunt&S$CU+`2}@N zIJwzC;hZq3mkKWK@$e>E=w>SKm~d!&iWV(suf{yAkr;VToheRQ7q`g1 zwdNAM(o(Yy>1}J;Up20_DDr<#LM^q${qI6BUr(&`+-`*zuCt@5|LuUiyWDo(-VvDk E8$O+!VE_OC literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png.import b/themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png.import new file mode 100644 index 0000000..79f89bd --- /dev/null +++ b/themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckr8wtiy7souh" +path="res://.godot/imported/frame3.png-ad15083429c7b341cd747d64be661916.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Анимация_оплата_непрошла/frame3.png" +dest_files=["res://.godot/imported/frame3.png-ad15083429c7b341cd747d64be661916.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Анимация_оплата_прошла/frame1.png b/themes/space-pixel/source/Анимация_оплата_прошла/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..4af13f059346e5b5de93ca7cae76ec43a3c7305e GIT binary patch literal 3500 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 bp%P3+&N+AQ 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Пролетающие_нло/frame1.png.import b/themes/space-pixel/source/Пролетающие_нло/frame1.png.import new file mode 100644 index 0000000..27399c8 --- /dev/null +++ b/themes/space-pixel/source/Пролетающие_нло/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://nw5fju11ofud" +path="res://.godot/imported/frame1.png-0e8c133415b77fab6fdab4a7352847a6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Пролетающие_нло/frame1.png" +dest_files=["res://.godot/imported/frame1.png-0e8c133415b77fab6fdab4a7352847a6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Пролетающие_нло/frame2.png b/themes/space-pixel/source/Пролетающие_нло/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..5839c12f6198766613f547c081f3f5fd5921185b GIT binary patch literal 2634 zcmeHJi#HVN7XQZEWN;9J@@S=dj^t4yS6&Grn#GJq$|I2!kw_Rb9*0O&$U7v@Nn<$P z%y7EMb4ZhMJfkti7%>yg7~@Xou66&3d-qykz3!V`G9FYI%5KveQ7u@me&s!m*i`VA}p$b!K;)_?W z$Iu}`2ZAr@(z_eq zYOj4CV+d@dfP?lCzUCR*KhHAVj|f~T=3FD>LkdD+XwVZT0z~A2>_uRy4*|XZPe58h zV$AMFI}T`2A43Z|(`s1=#Gl%^Yt^M3A^-%sy-i}_XNQw|!5uh{n)`%N9D?+{skTB2SJR>Q%BL@@m z=bgM4B&OMLoo~Hd+bflKk;f~0bMNUO(!C^M_+)?hYyf$os?hhn^hptq?#UXFwSmc% zP`msi?vQ@-<%N$!J7EDDd0q*c)CuGe?@i|1H|$YuAQ5Fq@g~;SMVKQ38u(>n78nk5 z*Avh0c4*{3B$yV?!3Q!=14jY zc&pKk_%x2it|23GKLi#zm2$RUI~kG+N-ynmSlfL%{aeMyM|KWFlM!4cVqm2SR@!{= zlCzq-Snrw-rod?;JA2@l$MLICP;5wU&(`;jXYF`SatC4eu1C|?vn_01vggG(W1QPT z%Ng6d{N~M& z#J@QuNiC=GQXV94dL=UgQAm(O#kGd-E|r=jkgJRIk)~wLt8`m>fOx0Z}%{dkj1@CHg5}Tpjtk7-u0+==@{- zJ!`7_hUdZ8C?V^MQcx@mDMZ`h-LnSz!4+3J_&CMf^Qj3$t^lv=ZrJbJyfhL{H$G3u zH>rFF;v3B}I>isEkIS<5QTF%;P%-3(bUS8KyttSBs@4e^&2*n?x%_o@rvfl#|5&r2 zx+rD_smh_vBIb=dJvOv(&hyg>e;6u4_RHyS)bCy-4fz>$o~@*T7qO|%EIVC=QQ z#O$;_Kd;4v8ulFy99WvJUJKyYS@5~BZjCqY;k%!Dud9pe5;m=GW~Q%g7R^T! zS~`Y;Z4j52OS#fbzk4E`wxTA6Nkw~M-|0!yW0W zjgh1z$DAWt2uluYW(w*VuckJ>bIKj5cyFXwmVEqN{_i8 zGIDH(IX}&vujoC-lm4S)s8J4Hr}AsKw?-LnV>Ic+-_*Q!@Z|I`)>^yvr@)EdRo+TL zk7Ass;@y_jg`^rf9OUgyM--P?7L`bd%aX0S9!R2ItU8qxDhoj!L0N3^NP zO>_=)^`HgO9o$7huQUpxV>D(fBS4$7xfoa1&6719$*h;FiQY?LsV^|mt)DViV4=4b z?&;Li+oT{D406*JALRMGW&t?sT2Y!AM#*&Kq_<5tX z)j~QvcA{mVODgG=hHqhTDsXe34vEbDZGv?J&bBS9t$*{ZVYl+d@*Oe+t=5##%pf*v_GI-tYNWF+qh}C_8B8f^MmHY-IZp z7a3jBREv{~Vbt?kXq@lytQ==xd2l6xcFYvpWk+DY;DGDRqpl`0LBoQ-qFF`g(2(xiq+?p@BZ+1$HB>(^b literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Пролетающие_нло/frame2.png.import b/themes/space-pixel/source/Пролетающие_нло/frame2.png.import new file mode 100644 index 0000000..19358dc --- /dev/null +++ b/themes/space-pixel/source/Пролетающие_нло/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dq2mc2nbafe0c" +path="res://.godot/imported/frame2.png-bce838d6b2b94ddcc3014ea5572cddeb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Пролетающие_нло/frame2.png" +dest_files=["res://.godot/imported/frame2.png-bce838d6b2b94ddcc3014ea5572cddeb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Пролетающие_нло_большие/frame1.png b/themes/space-pixel/source/Пролетающие_нло_большие/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..67ecfce2340c2ed4b4dadc541eb9ab5931b699aa GIT binary patch literal 26589 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

c1e_Mbw@9@HhyIO$a|j>Y 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/Пролетающие_нло_большие/frame2.png.import b/themes/space-pixel/source/Пролетающие_нло_большие/frame2.png.import new file mode 100644 index 0000000..d8ab126 --- /dev/null +++ b/themes/space-pixel/source/Пролетающие_нло_большие/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccyqdd24xl3rr" +path="res://.godot/imported/frame2.png-385ee4f8150e79a206c581a50ed67124.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/Пролетающие_нло_большие/frame2.png" +dest_files=["res://.godot/imported/frame2.png-385ee4f8150e79a206c581a50ed67124.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/Цвета.txt b/themes/space-pixel/source/Цвета.txt new file mode 100644 index 0000000..e69de29 diff --git a/themes/space-pixel/source/Шрифты/VCR OSD Mono Cyr.ttf b/themes/space-pixel/source/Шрифты/VCR OSD Mono Cyr.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b621e802071a24312be808fb3f773b30132beea0 GIT binary patch literal 30764 zcmdUY3v^uNedqVhosn!=wk%7sPdBGkvNYY3V_ITM^8SAR z|M%T{XEZW~l=O5)y6^jczrM%ZYpgM*&fIGPGuU(8M=!%3j@-2Y>nWG@Tyklm*8BtZ zZ^izS%hq3g-M~XT{s8+0?58ig?uK=*{^J|p#{ORHKXCPRtGhPd-#i2myRd(2{~djU z8@}_I-!Z1D!z@+Gxc#}607d$+cjtx znmo>v{`A(qJMvHb_QJKsYy*9XhX%K8-!cEo^}lb-&^gAWn#n2uH#EO;@Hgr%c*jhe zf&<3<^}wf6T>r1f{{gs9o>M(g%@awvo+ogR94S`+fV@fhy#KBtGc zE-K-8KgWa~$6JVda(zs&kN1OX!nNet*-|Cjn{fRp=t^uTg%$GRaZGkEGpu)MviN{Lenq1XI4$fWCx@xV-rQXCjto`-=I=|0#FoNqG{`j^2 zn$#)q^Il$;+7;nV_F^A&2!6ng!<>j;bx1gfE`j@BpfShZi6e|Y3ry19jCC)fQ_9q0 zYoWQve8v1n^PkK!X1{sPyk`E%oDA+s+GH|WoxD1EP4fEWP05GSbJGjci_=Tf=cRkn zd(&S{f4yaK%fpMC+MaFuX4`?bmrkApEJ910C(WOjedbRA?OF3*&Fkh}2dyeOQ=r|L z98Nc<7YMX-0qrXe+HeUpd-BI8{|_SjcTT>5<+o0L^W^garC>R zFOI%2ioAC8@uQC&edOpL9sTUlT}S5~Z9dxgzrSqETVH*%;ms*;PI=>`N&vK7DimHW z%gT$6iia1K91YAX<~GxBW}4g04{Vb;h{*o3Ib{CQRM}&4nW0%r*1OeCTzdS!B+D^jpkg z(`uHOHnY?$GiRE!%yP5Bw40S?m04{%OsDBG8PjdD=4`XZoMX;4=b7`(1?D5>Li1~| zii^xTbFt|$mq1>Znaj;b%@yWju$L>%Rpx55-dtm@HP@Nz%?;*8bCcO%K5lL{pD?$W zUpJpLzhQ1QePHR+=C{mmo6nfvH4mDH%p>ND=27z{^T*~f^SF7!{Co3d*vM1nKfvzx z!t(Z+ubQvH{+@;f{;Byh*o`s2DKa+ZFR=YEB)!Re*K9Q#vA5fxHgF$Wdi2?B2C?(+ z%-79M=qUPZF`t4R2Ifw4xB0#B@bl)sz}mkd`~Mls1Lj5ZP4lhryl(6=_nN!RXW=9F zn}YcrbD#N~K`mqUm_IPX<_mIBJEY6+T1enQ^On89K4AaYzF>cxSdi#WT#?w2*qC@Y z@p|I_1xtckgD(UJf_IbilD8$FNIskVeyS$5D0NHf;na_-W>;NawX5ohs=uiEtLm!i zMb+KaH&#Dfy|?<6>VKNDbjlS|9+>jt)Wp=;Q_r4y>(s*3gHwNAv$W>Cn$0!4Yo4lk zrsk!ZUzCUVC=!t+n^oK3V%l?a1`n>Fv{Rp8omi2c{pLv0%mpGj5sj zz>H^R{Jbt*cU9eB-92?r)*YOgoO$-lftmNse0b(t^|R`4seiiuwfc8wEt=Im>xx;s zX1&zV+%VYiTH}ny^^Jen_ z_~IptuUfou@jZ+8E&iKU)4Hg2L+c;5zP=>6Wa*O2muy^8Sn}+Wqir>9-EEh*-QM&U*T+x0ffEFIj%!@>`bQxBQvqf3srBighb?uXuLF&)OHXx3^!_UTA+~$L$?YbiCd< zqw}iH`#PWMe7*B+*o#!H$^EDc6WE>t&#p6OP0LhUFMlodEw;rz8vNGy#rB`ad&Umi zZ;btYa{r0-$+@F<+5etPe0%Jv)Lmmei9bL7<;4Er^Y6Y}wRa4avPqy)%_TM<{{*bw zZBuJ@O>2E7v7v~MZN~zsf!86=_68%ku9}#6U2A zFt>Pb&KyeiA{Wj_tTDDVo2kz<$$t}Y;h(_ppUpJXXX*tj(TAU)KvL|Amy6?vi{q~z z8vo(TMLRqW6reh1`T+X~qSN_^K&ZBx_$4&LCLWN;FOT5sj&Zv_la;Tmu^;d{oKGAm z=5qRnb+Kdz9P(5SDOWbgB>y*Ul3m+Qo^krbb6D78SU_JnWaleEV+wJ&2~=K2IL77|MB-Bv35it2Vt7nshBAnhjO`PVk`fWV$Po(Xb>o9Y zV^Kr*CJu-#8gGG#12~KOfr2(?vB(8!&^;gRDQ6FkE>N#>B`3H~)ahj=JHZHXx@IwKpIXNSP*XVt^DhDO7OfhjF7^zx|>?&SFSQI5l0Tg@*Tgc-Po}uzv zn^Zsq?{Mg5P>_8bQ-9-0{L?px4mAZ%z&{#M4M0|z`W7e*o}0DD=t6_V@xh?rHtaBE z3%Ml@peEtj|08Nz4jccnJ!y67bTJ4Ms+f28E)uSv9VRhYFvN4exa{!5`?e zt++4rPt{3N+}1@H*$iM3CqLnanu;6?jTU4v9w_WO#2U7~DNp&f!ev_P7a~Bk(0m=b zfR5z!=S^2ktq5C#R3Cyj0c~PKF4v!@WkNcFmHq*0`sqPAm>gS5CZf(%Fn7!pac zs3qCPF_oA&c&Y4H8`Gd>=detQO@#&Fyxd>xw+}h%D#1yo%>%38D+*3-(_IxcbAall zNpb)*0PChDhJh`UZ3wjj8Q~-1CK!AWZby#-m>qTzYOF^$;<9T2PmmqHB`Sp(dksLE zP|)a66%`S{riXL3f2=2Ugh~;d`C^_91;s>kx6otTphzFy1PK(QcI8pFIce6zYL$MX z5@QmaWBW)pbVT_u&g3D~yrdA36s|n1ejCaQ_K=0ss=-E?ASl4w0Klm@)mW5hI<`*? z6fh!Rn1*^jOS=l~DU%90DGSr$3ju9TWQGhwiRZ^Z1&JK<8WC1(J}25GLlD-XeuQgK zgD}D)RDPa0CfN&K`wwXypf(_~jI0mgs6?p3D~=(yi}7cgXi@+g2~-pXMkzD3JKNr$ zSG;rz#xUsbP(S2=8ppPy#%Y8^T#eHJy-AIOutpb@xP%%X2Z0I*;)o@&e;g&Q;{{4jxR)YXf@e8+6)tKMyiK;z*;Gd;9TROE<=hzx2HjV3APDv=2E^D-#WGnH;40n((i_3k>3$H0`(z(pN<>!HAq!^YcD}@`D8G zuAB5ELN#6YE*(x=2n(q+Xe?P)xcUPWWo%WdenohMKXS;0#3UTrt%M z8RWsniEBtSB0=89aw}^Zq*f#d`G=<<5sd9)9!2yQ7K<<)$DhV3^ws-&TI>BCMZJ7% zAFozf(8kZg4&>l@W*!33Vf4KBjysI4(sao}&_;l-2<0JGE>4hqPOSisO6Kp8+=!(l|}MSCj=G zt8Z;XJ|t|Xh%6Y$25AN#7OLa5j1;a+O*PVd`hymti&ds^_|<5Q(zn1oC~5G`uvMc|d}k~DZ7mLweebb#c3&@Jbf z8-08m-7QzsHzWB}D_%#xl#`)&q$SV2xM?}AzzS?akth|=??etM%OXp9=6PSg(xyWn z2lPl}5%Wrr?0f#rzju;KBVh~jj##-$$wBV3_ z5c-P66YEQ3R|9>R?gyERK}P-yr~r<@!T|twRwR2*tOvG|*ay3I_d|~2A!>S(ujnNj z3kZpnD!Io{eC*EUZrcb8Z_aJJjVEHXGp>*p{W?ghBj_I=fZ-x_%7qt#CVqjM1_pYD3cr_et(|eHCzlAT2eS!=bDp4PpKx2#t0~dlOG*YGvV48eh>`M~@-Cp&OPBr=b(lhf;UP@D+%=d6o6nt zaYwdsoXs&Vxk*Hk9FL%Xj=aHn0L|lYa#XGmZ6|OJY=A}5`2i!LXt5iN*ki}{2wLrd zb%c3-V|oOC)fn@l7YHx55}(MnlrCCVti)lW;3eV|#U~UO6oA-EFJ_AjTCV*C`$DS{ z@dAb+3WGB@wIDu7XPpEec9{!nFoH-%v^DfSSe3R?!p0h7x~e*+6fF%v4kZGh=x7kr z^H~N|qTnrHh0j5lGpz_xG%o!7^Yf(G(?fS#m zE~^Jr*pADhj3WqYkOOD{5R!{pt9ar$(sm5BujotfuUZ@3-=O9qQpmPAi(r@rgsQd0 z;_w_|QAz z4dnP@ofgAT-cwqZp4|@hc&Qrsd%MbK&XuL=u5!|HBp+2LflW0>qS>^78iFY z*fS zDxy^U9_$bRph@>ALDHkx=;3iBGtDJpTw)W>P6;19e~2OK65v`|ITBGMQ#dY2Xgi^? z*9U9Kju!Qb!wVswSkEhHcvwVs1NqF29eA>tB(KeR8_lDwa4$Cm*g zFyyO_mTeVEB0dPu$5|Sbe!xZu6E%UtWbGBf%mON5M({*-LLEy=mPyWOOKChG@fo)Y zfmnv>QFZ8XPqb5!6Dd*B*F2S!spEu)WLr!_E^wE*70=@1`9eP>tQjpmFhr=%g2i7P zWpZ5GGGfIFnP8|y0z)ZP%Ux-bm)J2q1r`=EsUXXWO?xb{K^pUfh2E7BuIZa%gWQyY z1#7}~v3W0T#3Gn8c2U8gTud#oK_tUliqdm(Sh`wZWN<{C{^DX~)!taFtlImF7ZLEw z;6o0CkCXwGV+(Com@KP4@Q)mVfuUOTgkwuOqJi1z7_-4Jg3a+j(CE!jv?&ti7KDP^ zBn?T>p+tlGrG?H-e2V=(W@>*=C!mR$NQi+fomt2+`WNLaNC2K{qZ+}rzyj55U!rG+ zq{}gCPwGN+nWJ0Gj(tr}LIVg_K&G}2Ik7HtdQ^V~rYMFG6V9T2IGi{@O%lA1Pbdop zRhN`Mf|lT*1jjkIE2>vm;X*1bSon2}swIXF%y1<-U>zg148f^M>H#quVUhcsSHLB& zLR}y^QuNN20QA{_e`>UdDGEIxem9rYA!>+JW56-Bupb|ZiX)Rq@*KTEHIM#Z8SmT$ zTU>^jO2&$%GZjEOPX5u@N0=*{0)MiJRtr0jiakmaJ`hn>BwbPlMCa2Kg%~A2L{&*z zJPn#4WJkAVD&S~?dRT1)R2s>1cp+!-6cjMLb&NO^fh*H0Jt(-8W;V1JO1v%=VQA~#5GpVTK9i>Ey` zNPR+0P!}LcY#mlGM}-D4vIj4Q4=m!3U17eAAPzaocomGu+ynNmIkyz3j9P?+Od(9r z6HuUQTa~nmE@|r#48|)bB_RtWf*1nf672^ngprkNLO|{7cX*7jF#lWll>Tp0qN)!H z{p{pS9pSAK%6YA$o!81`aCc~j%4gjnS5wrc#ICC)uHwQ5^hHk!|j~4JgNr{UWY1;#^inB{0+0Nf(oZ+T{DA6gs0Oy#<$1irtV{EkwYd7&kOg zf!vr}=VKIQCFY8r((1({K7gEEw2pa;9ATgp6_m4K%bW>qN}+yo!K>|J>^>Uvgargn z_hKZ@A~c_hp{OO`8v72D3&wnW@2ns5WbbZhvSJ*(kW|wTrM(Va&p~`eMZ$3nZ(LBb zd|4=kEQAy@fvuI;fNzS_jA63=TP9Iuk^I!!iY*|5~LGlQngoQlgs_$#maJFoQTu1P-%gr zm5wGTr>Q=xk{9lqpq+{ut^F8)tLH(cP#PSw*6?%m5N0_O0S+)ruo105zp9V)!Izs6v*g-3ru zt1%o=uUe~66siC&g~!S!1|y^o!lDY|G*S!VlVHA_N})6IH?|F=9hzxkTfPJXCJ}RT zQbeP+8ql>ALM6{(dscWZ88L5?asv`%J*cDS&<#fkIHZW?_EC(TDBq`o1FPm&`1Ek3 z7MlpAlpe^egdUiZqe!56SYXHr%u^-NLI^WKjK4a{sstk7umuu>gfcBgmO8hy3(U`` zXYGutk90`wjQi1^X@QONASxs56cgW)`5CZU0%l%;fd_@e$B|MvNh5I+$9`q%M$G2w zWNd&u;-B*3|6ES#5w6{mEzxZBWltHI=bwDsTJ*w0P|{cr#(v~v;sA!bWGfc4sdx6c z3l@dk06!%s^x=Tmyt6v4)k0mQ85DrpM$6@V#yGx58*TgO%^Izw!#%QHk2mIJ!F%F$ z=}|&l8DeLNs9H$gSUKX7JjFg*#;W(g7kHUK6ZF!GJ;D&Ecq>S&gxGsXS)F>C_#u16 zEmlzxzo;H+p9H@&+r$!Lbtn06^<#Rc(zFG3@et`D&{hldO-5wYSO&rx_nT$dTR#+%~5ETL}soN05I6l3>>8~UtmLj z-g+v)4ho_^2=+99M|3x^N37CphmaSC6M-QjT9Y3{#Wp*I;i!&<%UE1!KwLlsu7srl zdSSg(0-as}VykDmRa&$8Fqw!Z^V6`yy0}{ts zA4r{p`LBD$bA0hc>*2PpQQ~M@hq&myfX)Cx@C4|~jnuB=Z;NY!EfP-)pk{_?9i-QeQ{}i;5?zo^GKT2I`RzC`(i# z>~|z6$*vXJMC3&iuOMXkBbQ?x@+Y!Ci~S;DCICw7Pyl^I43aRT24;FNV1X)^=UA+< z-_0Q#>wyp@YCz~dQ^*hgJT(-MbDB6E3$=gd^l)1ez%RtWu9nFN&=D)iX(5FYz8nE6 z9|$ChTckt!M+jeH^C@HyN=+zv4_crP_yaIw10Tg5lZJLz^HkhFNsshRoStNS-^8h; zLbsfZ2-p-pkVlcf>w|qvM^@)p7pxC@XO=~$C=4OC7fJyaz#PD$fOl(hC}D}LbIuAc zkd0U;nQM2Q9=?W9_nhHdj!&?`1wEEZ=*swGd!~e=QvSjm38vw86>ySOQSIbdsa5JV zE>~97r^M`I@!(t?28qH9e|)z@m!oz$5ervy-VsMHuVm?qe6R=t&Hbap+V zK{tX!FU6I5CSyt^ygu&04k%9- zp##`{X|zObRiNRkGlUsZfxjQTr`h&%@^CgWF`Eu3MHw1Ym%Q%x9thLl3v+Ln7zAHc4eb9-i_Q2wqJ%c>1Kc5P7mG@tc56c*A zr5Q%?$O`}vD$vky#kY!>MTdNhHVN_Q;|I77W5avEjx4q00u`N z80p&*)toWN@pu)2N`ujgYL(U!6(JKoBm&Um@L^MtYi%?&%4XQ^#MDO}YnOIs7(Zc8 zm_e*1pvF?x-E<$37K=8jVM|mi7a#M^8Y(J!^y4gF=V_ouwRQQAT(l z>p6&6@+jbsKv#rM8xS1m8xR~Rx0YV+WAp}Mgk-payTx$377PT1+&lp$=s=gM(81Zs zq$h=Auvcy76Eq2g&&BA2Qq;dWSAmki?@)y+$?7 zl+AjVJrC$WlRh*WEVI1KN8(cxWR`}OCt{*57%?gMG%1qIm3&06v{-()Bn>)eE$v|{ zBo_q{vowXPHw#MiWRN{SXzr zAH;wY^)*38lL1sBhe40mB6mxU<6K~(Z6EuS#3!VpqKW!;CirAtqeTD}zMdcIl1Swk zc*hqART8QhkjSw&HB|~vw}4+wT{J{NxS&mD^%$0{Q*{^ih1^b$2z^(^x&)y#EY^@$ zMmnvmT7!asAuw>rHZP_y0jaNB#NIeLkG_CkYa)&!8mysA!*6725-$ZH7XBAFN~qX= z97Z@N0OC*~aM^+xcpiXq#ytfgKQf~|>hG*M))t~xsY0$T+U}7%FrjFKp3Dz_pj>iq zn@&Fw)SeZL{ITa)@!=M|RqP7)y62hD$DA@%#VQF=tB|4GP?oF?m_cWA);G*z$00Erkfn)Fi&amc=ovl6J;OO zqn8C?hOz*~jzVZup#xh`5SsjgWm6eQZBOC%!tf}uTh7M>gld>7;xRsw4@a9FZt5R( zBHelRzoplMWSkm#S|I0&9;H4VMdv?Gmb3_$hp5E;LXj{?(t zWd1OpDuQ2Lz}@f>d(z*cvkk9R1n#Eh%KA1$G6)L508-#oAcd8rhgOgXpK2R|LJK?VpOILIkBGLF*> zfG5^t%mS%_GuNGd)E?sY8@F2^guRN%df&-a58$4D0MM}Fmfm-;cCL$cU?(@e77^VL_g^!R=)4@jb`|-XE^Qeb5716Cw=QaA@CPLrA8e z?8>6W{A2zK!U7&CV>bn|_zq@yk7Df%rbmXRVa-g93-4k{zRyJXhdHGS}OcL3A(ZR}=yx zk>1vzAnkJ~68V}L76v1Bt-nf2eEY=J)HY+Gv;|W~Fdoh4O0s<-F<8rDf?eaI1dBWz zrrl_pg{^EB6!chRL@AMxWe{g+K){S&kM&3i0%|aD#S#r@v1XxmC~jBYza%V)2RXLH zY-wxa&EjP=U=o2Nu1*un1z7y?BU|jNAVt{m9U|IZ#sQ9(@j~(s*`Ito)u^`3T3FH# z5V8iAf&xteJiCO?@*E$G)69CQf(}Y#kJYm( zjjG~|Xgs2^Af%BuflgYy-o~)zZ}a48T_QQQq-IFOvr1RXb=>!L0q^(ZR-VVbPi3C_UCF-cBqQWT(`=G2>FH>`SD z)Vdf4{;|#PM6}62qcr)fn6aLhi^Z1}sXj3#d|=FYtv)_TJxU)P6XKM5N}sy|51@wz z;u{*&U6>aRotx5M@caXsp>Pr{P{XpBOJ?br;lozQe2z~pf`@qB{A!=Kp!0FOK%qO% z*PNh3ABH3n2+<;3Y4d2Sf-LJ}PpL^Ln#@aV)chZdfzp;@3}pS{DkWbrEfeDraZ}7K z+7GK!dSXxQ;@tdPE>rB3u=9)J3135?Ct`n81EV6}M~@iYjUGG5mo+fX>+kXreokEj zOG}!+pN(o@rz61lRXj@pxjl6RxIP9sd2`cZi?WdrjirQWnxUAV7$=VT>-|}OHGCx~ zKsBNtu5}|a)#wo8Ky;m4!S1jL2jv+jQip(6omW}0{*AOMPUFG?=3%7ApSM@QT4JGr zsg$^hF0qVyc9e*&-8RIc^$+lt*1`-CVzXWhtf7=2Ns9umnD`mjxkoU3a3?qNUp(<# zf)6hbeUY^tIRfe7w*utTuZ1h4wBI9oet3n}p`^(rQX$ZDdfNN-NjH~}^x zQ-0hfe(iDYha68?0|z5gSD@GA#B)KRgjUYhW?Yu9TA#N^YJ0*n#{4q_AaVS5F;@G6 zhRJH*rQ;VSd&e)d-^1gQzUOr$*SkofX{hq7<* zuFm$qsue}DYFW8PPgS@f(@D`5<#}G^Wr0I-6U_l9BA#Jipy^-tSqZG0)i1)D6jF%Q z&Dg{9-Hazmi7)&4y9gra=+S4Gv6q?cgnzW(9sf$seiz>K-@Gk&Jd@PRLE*%6 z9+$HV(8e5vxDnD;v0nDKc{0_1B_F@fdKt!hI4H0Hp&DWFVZ97GK485}SP}^U5ithC z)2J9i|8{UEslu68VimZUQ7JUv%kl`G=3RGleGbTXRL?6k)#bwsEM>zjy)>^ z%>&o0WUEZ)qDoxm24@Dt!IG5&Zmc1;R1I5O^lgV5tR@zS9@UIMh!4B!PrLwNPj#W<423yH47tBTTiIng$} z9%vi3K7r#m;Ak2z5V{-79$bI7xkK*Sg8R4QMMdY~{yd;;H(TVsG^P}?yok>JZ-4^^Ck(3hx2I z8@uutKYzviwfVmJALg&jPw;-JSIrO1|HM0}HsQThubIQw%V%ut$*fzV=F0*Iav+Q!a0=)?v=x&5fU!hX#5+AHl<_G-J{USqGd*V*gs z4faNRligrHZf~yMxphlN$GR@J&balt$$>3HeN}_`?fD&j$xC()ZL8ifw54y;&< zY}9pbtFCtrPVE~S+IH7Ke&dcB*&5oiY4eV1+4LuK+wR(`m)*8)$7aFQ-O=gR-EMuh zTd&dexgEOh^lNv0r&8SAsT6m2y8An`?s^BO)4}OH#~nY{tuJ!xb#8sJTlcv2C2oDG zuDcxmE{DI%;qP+zyBz*5hri3=?{fIN9R4nczsuq8a`?L({w{~V%i-^G_%jZF#^KL6 z{27No+hriq5?{@gJ4sX`s$vXI12mjno#5{}l74ogGRze|{ zGh~Yk#zO=Dw(##A*xPBFcn6Nv;5~bbj2-CPu@!IbO7dd&-a~~{gR`q9oadc(<4|8e z?$Macm|F#mat3t+Az8f7FM%s8Vgs?w!hbuC)R?rpdOPSkfd29!S8$u#b$mj zBg27@dFp?B*B!QDIUaFtA48Q61A~AH1B1c|L5Jy;^6S1SGtd0H@Mn)TUxGQ%X)K%!3>-pGW5Bw0Gd%lnw*G)Da!N9PsqiG>9Jnd7z$sdSC4tt_Q<{q2H z^WK=a^PDwLdTVnwfnpn<-V@CY&prew95`Hm<1ENq=n?uvuVLmLK?d1 Этот каталог относится к ранней partial-theme модели и не является источником разработки. +> Актуальные материалы находятся в `themes/space_pixel/source/`, production-пакет — в +> `themes/space_pixel/package/`, формат — `ExchangerThemeDlc` v2. + +Этот каталог содержит оригинальные материалы темы и не включается в DLC напрямую. +Исходные файлы не удаляются и не перезаписываются при подготовке пакета. + +Фактическая структура поставки сохранена: UI-файлы лежат в корне, последовательности кадров — +в русскоязычных подпапках, шрифт — в `Шрифты/`. Производные копии получили ASCII-имена и лежат +отдельно в `res://exchanger_theme_dlc/assets/`. + +В `references/` локально скопированы восемь макетов интерфейса, рендер корпуса разменника и +видео полного пользовательского потока. Этот каталог нужен только для визуального сравнения, +игнорируется Git и не экспортируется в DLC. + +Обязательные правила Exchanger: + +- основной фон остаётся статическим; +- анимация реализуется отдельными спрайтами в пассивной decoration-сцене; +- шейдеры, частицы и видео для фона не используются; +- тема должна корректно работать при отключённой decoration-сцене (`ReducedEffects=true`); +- исторические runtime-ресурсы отсюда не собираются; актуальная тема использует + `themes/space_pixel/package/` и `ExchangerThemeDlc` версии 2. + +Поставка содержит 46 PNG и один шрифт `VCR OSD Mono Cyr.ttf`. Файл `Цвета.txt` имеет нулевой +размер, поэтому палитра темы определена по самим изображениям. Файлы `.import` и `Thumbs.db` +считаются метаданными исходной поставки и не копируются в runtime-каталог. diff --git a/themes_src/space_pixel/Window_k_vidache.png b/themes_src/space_pixel/Window_k_vidache.png new file mode 100644 index 0000000000000000000000000000000000000000..581e811c21c125318025ec7a4a323aa2addac198 GIT binary patch literal 2314 zcmeHIi%*kR6hAEuMM_)H@Cb#KF&z^-HsWjvVMVdyF%os4g3$#GGcbWzA3R(}dIy1` zqL`WCltN7im1bCoWw;CqA0xQA@st$@tU#5?bU<+pl$FwN_m)3mnej`$bM86kcV0O+ z_gpxzFM;bB=m`Maq(oT?01F=(;Ngzh+uK-MG20|hJaQI*vxWQ&xTy*N@aRmE?KxPi zS};ZCe3ce}%(ahiT}lq~@6q~3M;!_;_d7N@Zqz>1&K!K}#>L?zd3bcefJ(>U^reI; zOA9w2i!OMOa_?y9Wp3n!kIt+Q87x+j|C!f=?v_~Sy4YOnKc9;mGrCGXo3;5%OX&3O z?6v1l=EBaAYKouDkM)h}x5%BB^!n{}H@VLX%IFp2kE1mlY~9>$8&GH8i_i_!3~NsW zI;sQhlKS-h~T}<-OUXkNVK8exQTvz|K|PtSbVhbj|!j z-iN*U5VUJmV8?!6Pu#B`KPPdYA8b*UqbFU{5k9a&N3QT_cLnx}Z+kJ_`MrcyWxs-s zGpRkj-9178bb`Z}EQ?1rjg%S;t~BhY4JMbG&zN)@Y`?}v*|DdDt7rGqI7528plnc& zb%tiA8$fG#JA0BD5RQWb?05}g*4Y4=hw{8uBX9jd;(J*dY@8jhI%{1{lDR!z) zE5CDpS4KeKmrN+aZ$;Q3a9zk1S}!R%98Wic+-Xn z5x`5({i{C69ACrt&x%)t!gqIvEdgxqrdAJ z$geKPcGug<>$-GUJY>3YIp-%*JE%k(k8*_vunlZ#7tz(6UsvSbTBCbeL<;ePJc4Ph zqM33lx=x!q3W~%R@%mbHq0d)iLQ|t*QwMmA8Yr5(f+L^xUhjo_p(uM9L0;oO5{`F9AVRq zo{&(EJ}$)?u$-L9(DW#_yHTgJh%EZKY+Il`EfnU9{&?Crm#W6$k;SfAQM;4FM;8uurCo%PjpDudd5X literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Window_k_vidache.png.import b/themes_src/space_pixel/Window_k_vidache.png.import new file mode 100644 index 0000000..5de376c --- /dev/null +++ b/themes_src/space_pixel/Window_k_vidache.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtukabci80bup" +path="res://.godot/imported/Window_k_vidache.png-3d733cb64226e51be35c9ad526226b76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Window_k_vidache.png" +dest_files=["res://.godot/imported/Window_k_vidache.png-3d733cb64226e51be35c9ad526226b76.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Window_paycard.png b/themes_src/space_pixel/Window_paycard.png new file mode 100644 index 0000000000000000000000000000000000000000..7d585fbdd360e620751f9bd84f93b5618a6ec374 GIT binary patch literal 7111 zcmeHL>r-1r6h8?ugtP%1oWhVcp;C*L&|(#cLK8p)0yDHqD>_9IEf$nV_gocs=Nv^xl5BkA>0PlyKvpKu> zoZYj(``f*zZeL0QkL%9`0G=!{?o|L5YO;XCMoP6MxCSW?W#StJ02_Spj{!}m`~di6 zvbdQ2rKj#qKbw6Z%a52X_%+7&WXjI!)Zjwpcl)^^nR!`htx2ubsi!lai47WRyQ2>) z=x2+bNN(QDy(&}wrGF}UI=}Auyu^mmklSAtSXQEvN!D1)e7U8>HFDdwgyKR+&vS=_ zxFN1&V#VTM=^cP&G=U{B=nj+xIwdq1PzKi7`=KnJ@N&$z8-uE-`w14&0%gjNs$BZK z9y8Pit)}45DeI>6<%M&aD~uV+)1~F_H6}-HM4cjWONOCuH~%$qVuzP2i03@GODFw4 zkO4q;=BM|UnM}+5epW}TG=35qFB)x^G8p3ghtl_~5mq+<4L3${$=f>LbFx;?CS^5) zrx6DcZIdsCYR$uhb7`^HTXV-*lJhutQa`%as%oStWPA3UrEF2bX*|D$(O>|B(8Y5h zbH_oBp*fKy?lQTXf4-@-URL$2;1K4miV|j*W!#PYSXiufl(e|8wZ41%Zp+R+usQPq z4*AjaXFU+lLvDa;>5EB);sWh)Dr_I+wp=h5L-5kG|CciFK<#mr3uda>(lp+9Tya%+XDszqxBXW(t zGVVsqqUivWF*DS>a-nJ)YTxQZ9*_xd1#pz^Sg{OP5|4bW_55=J>#Sqc)5khtk=Iw^ zm5ReAeJ#90U90)S0C+glVE;{m52t}5wNS!8a}FP<>+KB)S9+weTE@b>FjMG(m3L?oi0=yE zEdG?%jLuP!fjVk%csNA4lX)Bk+49jxqaSnO*yi z5YOY9;T7Rwp@WPR!lpVX{}B5-lWl7ZS=_;+kjL6UQnpp0MwM_N8^h(cyUY5claGkt%ScJqaRzTu)Jm z)Z3#L&Srwxw0y69*RTW|_o&U17a}^oIjYHLK literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Window_paycard.png.import b/themes_src/space_pixel/Window_paycard.png.import new file mode 100644 index 0000000..77a4ec8 --- /dev/null +++ b/themes_src/space_pixel/Window_paycard.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c73onrqq5s3cr" +path="res://.godot/imported/Window_paycard.png-1c61288a644fb769406a139c75a8b316.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Window_paycard.png" +dest_files=["res://.godot/imported/Window_paycard.png-1c61288a644fb769406a139c75a8b316.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Window_paynal_balance.png b/themes_src/space_pixel/Window_paynal_balance.png new file mode 100644 index 0000000000000000000000000000000000000000..a815c0a0e38afdfffac67f9200a668cd0bdc3e05 GIT binary patch literal 2310 zcmeAS@N?(olHy`uVBq!ia0y~yU;#22893O0l&&g^3XtL~@Q5sCVBi)8VMc~ob0ioT zICgltIEGZrd3)C|BQ#y2;bHMnNAc-?dQHLFB?YTOxO7u;)5Dj0EpG~5n4;yResJZB zE2hP}*mOj^=gM&1@+^3HMb-OmUZ+W}$K(p#XY-2R|F-cyz;b^6$Ljax|IR%7{1a#| z!;Js^*?E8epNrPqf9-cm`^WEF zs?5m1aNv;Mn;1*;J*?C1_8P1yW%#kb`Tx6Pmw#U3V+MMc``mKzvUO+LL<`DJHUIZ? z{(r6ez5iFIfL*1PxVvDy58*?-ZDA?@?enl0fBebWE>rT*~#0jgQ!BoJZ3 zQuF8SQ^l=}1(zP=zhGxzNO;9}ZryLgg!+B9dMr9s|L;bzG#uXl=HSEo5BP!3(Yp1k zdY-KW)3PG>11e?=-`eY&?SV$U7Go+?7h*i8^SiP7y@kx5FZbX61KCi`abxa*H@m+u ze0bD;SNZ?l<^MsVi`RCZ+3n5Gz#jP*XybyU@+Z0tfgt}dYhVS(Z^G6u3<*Dg&S`L9s3>^;Z<9PH zP_*(LSS2tA00Gk-FvW;$22=*w0S?GohP*_>=EE#C-+oU|mIry>@9eju)rW87fV}7c zN&t30p6uP&58~$EecXP&ZRG|?7!ApMI9$q;k>rm9niYRO+?>G2(ErYE=G)r4JO6*) zB+m;>kBe{3Z@q6{|MqImoZAdH{=DsmB-7+IS?_-}uymNf&G36YD5W3Rbz8FXZ@rK- zL;Foonoqcz>;J_6zpomDOsV7pIgl+4p<636mff9SdHi0>{IkzL8_u_n*_ z9~a|q7LbdV8GZ1t{1D&Cupxs7$ZgnYGwZ{J{gW6UYnNpxFijW^ib-`wadX0O0Y`ztED3>SZZaIuiZG0<*vPl6Yk>e7 z+=d~UP-?owID(+IbHPX*eHSwcuxu1;DU6kpZGfq5afMOJ=<5q{iT}+0Fn`>fb8ha< zJ?A;kea>fxGvDF`h6e)RrHfOK01VnC5WuF*_12rkwBg9bIb{HM$HpR{)`S72%968{6Uwu~A#2hT(<{i@{)YxL84tFFb6h*PGK zJU%W|I3Jk4X^^qW%MH}(Uu~vuw=<5%TpO|Z*4;DtojntK_z|W1F~{@Qh^WD0VRTJ2 z?Bi95ojX}Qzmas^>ROJ}vZ#&o@=n8=AJQAj;N~&f=}-adx$I(>fc@f$x-^m0#kMaQ zsO)CrwP4JbyrL7cf^5iW+6)H^_na3=f8m9N6K`voi>9hKYmL z$*f!RemU%qatbrGtAeB+C9HczeTdu^gyb?NX;7j%#=T8PK< zvPErtA}U?viX`44iKO(Q0OYVs@^ivM#RdYg)yzfzpj)=FJr;Sex_{Im`yWvBiE4XV z|L7?sS?e-2bU8Sx=Bh~kIqK2sy@~z1xUlvO1sN+>7iKyJme}@A;lS~`dZ;Q4%KI++ zL_e)An<{gXO2Xy?VUh2yM zmXr&ut(c6B45>v_mkRu8`6K7e4znoE+x)d@;f6$h*Ro9Im!I}DQ0r?yxz7l_I*=b; zy2?>5pY=^Kq+-_R90FEN&h3@7W-5h{$1~;{$@Va)%wJUuDLQ72azuv{AWv!r-uTFr z<$84&eoT>O1c98(Si4{=5?(fz;|8~mlMFZ_ypB)axiw6@7E9M*?)4Cg5}s9I^uqoq;Q-bNk~u2 KO#MDZTK_i>+R|SD literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Window_paynal_balance_money.png.import b/themes_src/space_pixel/Window_paynal_balance_money.png.import new file mode 100644 index 0000000..b71e7ff --- /dev/null +++ b/themes_src/space_pixel/Window_paynal_balance_money.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://csvo4b5vj2fkd" +path="res://.godot/imported/Window_paynal_balance_money.png-215d0893f2642adb3185e505652041b1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Window_paynal_balance_money.png" +dest_files=["res://.godot/imported/Window_paynal_balance_money.png-215d0893f2642adb3185e505652041b1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Window_paynal_instruction.png b/themes_src/space_pixel/Window_paynal_instruction.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb45b70772a7782b09c521922535a7fd5e90ba3 GIT binary patch literal 7111 zcmeHL|5H>|6hCiS5f(wD3}pGD0}3H*Vn`NWb|o4hMm7Ue%Z3e@<^L}{e-h1wO z_ndpqd7pRBRlSyy;L7vn0f1{#V*Kj>T-4=)lOt-BzPn3M<19@)mJi_a6n+S(uJHok z%aY;`q!rc}b>Z2EPk51c^Lq|>R;37vQ+J<|ew)S%%gQ}*MDwbqIQ7e{khq|(%lC%% z<+nJ7KAn8ghc}uey+5=wS(m4Z$W8pDFl_2lzR4P$OmPR)f6Gm0Y`s&KWuzDCuRWjX zk30Jn9Nci7Fm>OKsfffB2zCN_fprO+49ElQ_kq)ZMTW;26KmdHa8S|@mR0&r`bLz? zs<4$WPVe|SfB>L=7R(-h@rAYxRk7`R>QBQ`X9+X+%i!`&HwP3}mwt_BK|^opR%yX+ zB}~%G%pc_@@k}C`k=FC8^8BJ&I|Po=%>9ZRk?^i%x#-6uaGr0g@TOg9BvT*fel&tx zL>vFw(M(8h8cyEZ2q1ZI)vdR|8ZJ?G#0a>dXBpj_T(Y}!w(G9muo>ACGP)wa6ywFI zdq05+jD&?UWr+~2HS-LoAjpI054C=#94<*`=pHN9mZkgYlx6tO#ewwC!z|Y$?J^=vN%9bf znoieyPc)%XW%E2pmXJB52nwaswk!V5h%1}3O9Bc70B6kJ5bM`?G_&3S(fU`O_zCid zZf?!U+(&G}+!%frlq`6J-OXm$hp?dYr#E_Q-^zN8+Hd zheb9SP!_Psz~U831GZ+ukjP>pi-{-;SWILw5v9R@hl$j)g|zurr5jYt#eQZ~=&m!C zEB>y?gxXQ{IlWM69L}k^4I{L%eC@!k$*_*Mzr)+L1&IJTxDz)bDwr^QBZoG8S4q9p z$e2D_vN3*Zb=01-pxt2S+ngz5fPj&sI;YYFtd020PPN?LCRs|P&FZ1e%CW02D70*M^IWi^#u_1G`sPDU(RK6`}E8K~|lGMDJNH;Udq2AjesX&*jsPf#jn#!kxd?AHLSh?8Zy1izx%$%+QZT2QKB%7kE&A)ek zOc=B?*BU!~te80;-C~^_(-yyBFWR6y%Hk+=LHzn)d!6#H%29;)K>qJ5I(CCN&W~;j sM7Yn!oQvJSx`a&zFRDm?Z^3j|`p*jh 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

kqp-ABNu3W&66H*L)E?q%AF)Sub3 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien1.png.import b/themes_src/space_pixel/alien1.png.import new file mode 100644 index 0000000..af480ca --- /dev/null +++ b/themes_src/space_pixel/alien1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://i5l2u8w4uttm" +path="res://.godot/imported/alien1.png-3778ad20411a5a82c9e69a5275a6d737.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien1.png" +dest_files=["res://.godot/imported/alien1.png-3778ad20411a5a82c9e69a5275a6d737.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien2.png b/themes_src/space_pixel/alien2.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeccb4746bd8ba834ae8327169f44164bab4f40 GIT binary patch literal 31086 zcmd>l$L;!#Y}zERx}*zz1snn!(n_0YspE;Qs$@ zFh3d>2#hfG@q3?)J8N2n9lxqqnYLCiH&ScqEIaZGqB(_Q^!!09GSe$MzvxPV?mTt> z`6JtN)%t$EQ;wRzPrV?o*@^HAB{+ks>v3s_ziau24nD)v`OQupV^SOJnH{tIcW=D< zLWNA`ZA}fTj!s?S4IEto=eNY$&IBl-uO`Cau&g}b>%sk+5#eH25Wa|xb${DP9@)z~ zKc&?hfs51E5??LuS2V1rKOzg$6T5DrdDu4jpvdiYHl&GiwTej|ofB|!RqKA)rR`v7HL7Y!z& zgG!vR1%wnOj>b9OaA6Ova0ys_nh1Syiu7o;DR%F(iCl*pSnoXXjdCsq=(3quT(G{G z!N#s`9+5W8Rj4(NIn!Fk^pXo2Jaj`Z(whK*@+`a`ZzOllA>zU(#G4kai|7kNuY$}> z=0xMW$UQZDe)hlwVpX2@)VGOf=ZQ3syWh#ZtPhOw3atna|F$w`>S({yciV}WR`9he zIoKQsK9<{|YeTJdh(4|{6YV`1|__6+2YFVo#op(wn70ucJ*=cYrfUd#y!$} z7IQ(?*;@`8mQ9eWa}VYdx$9>XPkD73-n;6STqnaV$AI{xYa!UiNX;}rK8EK@7j~J8 zcd|)Z5=rAOafGQp3sEl;8-R&I+KZ8%rh;e3D+-cy{QN+!*{Et_@xgZrQ46<;t0Q4;V!2$H@RB#Kj_|XPN|OwHmB@KoWR=N z2#@r@8@A}wj1Z^DqEsm868mTsgp zj4~mk^HGs5<2zOjq{w*tDLjne&Ob3#s#JgrFo1M;YQPg|hdNP1R??%b4VO=$dg$F2 z?oLL4qk6Vi`OxR?NmPU)B*f_26&qCDVHlE}h1WRUIa0mf!$y=SyqZ5yM3`%!%`?mS zl>d3KU!;%*AOPS=K=bHeXiit{+(`~tdi*+uUOR#@EaA&8L)Adh8$Gin@hxNI;oXd3 zT~E!2%L?}heq0fVP^M8shnpZhp+QxIl9{{btCTs**h+Js;Xv_e$6-?o2fzuJ@>otJ z2{iVt%#WV&d>)i5J5^@8j~LTO`4w|L;32F7-yFu?r6IXY{SX7&3X93NCHcATenc2D zv!86vLAI7fX?4c9xqbZct6nB3@AJPIWulXgo)Ln*6Q#RO)gf<3=Xf$^i>ZyWGQrdj zL~|X-TQ2hI3}tTd0*)h3k-kaBwiDkS-E)I8#rQ|GD2&^jx+ds*1yEwXeVM*_CPS2F zQ9WsAlKz#YxKkBh-KJX8c7p*e3J#r4iUsH=4Q2)Epd?Yg{vK59v8_oH+IL=JKW;o* zk-$H?LFRvw#h2)uHrh~ES{eJ&l|RT!!!1epa*rIK3k-2LuW4J4h`O>W+}6JW0D6)) z{}bVOSLKj#V8-rA8a5gy$^Gc({127<9A>0{_-h27WaL`QhHDbdD`Cu1Urib23(zJ~ z8jJOyS;p`Cz+kso?1pr2!JL4RFsqdtlI5P)(;g3RXIFJyi-JHO`sym}!CbN(+o zKOFdaLN;B#FUNH&^l_V)dM`psaAC8#Q(Bl29)v0M^$JgNTGTY0$pEhO&rRFEM13A& z=bm<|k>>wVH_#-i<4GdM*L^uBLfPUY7e%k{^WX1-(cia>7I$49gH(QXysUNFfcBk= zUZz*?4)>g7pD_<{Be8>Sg7?(AqsQVY1s4TcVI>Pj^qeZDKWa&aeIyjDUsd}B`wQ_SY49gIkx&N!w26UNUwG#7d4)gI16_@{MFccaP%`? zZy1=6GS^H8j^RRvjl<7XzX!!jsuH(oRMe)Zq+dG$7>wa@G5J1^;rU$s+W~adsIAV{ z{9Z)y9?K!05lo|~+I{8E7T#b3WnJ>mPB@R2DgXwd<<$;r5&;-Hry%{>>EJB(6fx@V zi2?Q7PIs-{(1XQU`1=>IV&X>(b3SQES51*RYkoDpt`g&?tmb`M25MFH zZDD36Akv}8tbcGNpm^Dgs@L2NaVhs-;D?~LUFaq#4syR{B4Z8LY)m2qhBbyTlR<7QD+!00Nh&lL~600)jjcQLORE0A->Za6H#z#3|b&M>X=} zE(fnxU;9mHLC`4_^q`|@>1 zswoZSKsf@{mu*iZYs4*&o*l$pw{TtRD?El^7T-%@hYfb3RcUJY|_wKjh=|+Yd*WyHteBl=yi2p5S zzrHcuOj3Le1Sx;6HlOBg>N=^XZxMS~W&bf~y*CGIH}z77$`kUUq(na`$k-~&qKXt8 ze!|#m^@+}kjas)dguet=Ij}D}^CzCdYLW}VE?;b*9Zd^9jEVbvu_+QGC&mwP%* zLUAN%h39GYxAa)u5&aI^YQ#YO;A!5YkDodxCA@E7#Ibn?l1i&-9Mbo{)lC+mN9XL9CXG@w)^E}7uw=%w=)UY|4w|AcR)5DRF7e*oCVc!T)VLznJr;!m_ZMbb z(Y&2OLK5H;htzWZ+fskd0AVbUjzg)D%iQ-y0AKFj`-*m1*&?lja#b&={2G94zgR3| zr40lwb1Sn}h=@J(vC0;Zm`Hf|mMjn!Nt&hT*-}x(deBr0`tYFNEG4XEJpM;kh}S># zbmy)A0TL@IsN&ct|6zHt=F>-!#ViP)&^23&GWfN4{{;DgL=RTo}7b$PdSvsJQ!zJE~E&-iu? zTv;+snofILN{EnBf=43nYWRr>+p)0{vRfXiaJIh{=8>>xsvSCYuIx zjUo^Xp}|VBrm_U_LtttO^7_*znsN}MSKQ~n!vfWmja`~Jfax?-|8tt7SqMmZr{Md| z(dIX&6wKp+5&HJEIrEY-WZoNumY=!bcsz)mb3k7gL%+E@KxD0=A=hahbZJ~AOEk3c zr73_oZ2|wNmZH}LZK2(CM;99}M|IrgkI7<4b*W#;Lg&FO1}i&S(0uQs_v;2IsB!yTRQ7(cr`hr&_tAO;3qY}F9@_3^*# z1*SX51!ohsSA8fhR#w_EbLn04J(WWW3lFj3`uir zfj43(=gX6@nI98!CDW$E>uHP5^^fb5qs`?DNfC(2!)+e!CDf>+Yp7w6ef-QL!8oHP z2-V*@V8@s5#2pioFYk>0chhl6?aCB`zcLkms{oufaTUIsk*r9OT9pf{7|sV9B4^-9 zWhjLD@#{>;D%0aX`(l@7r`kv#nvrUqBt7?cz}IUYQ8`4uCuhgS3Kh#wzv)74d$Cpk z8B1fB-Fm&GE_m~lN4!MB%V$o8AZ+5o6{l^Dig!x{Y4ot<6WRXBO%0X^F-%-ye{3x` zZ2k|on=vl3zrd3D^#~rf3VRD5#$D~EK3*xU^@@DV4vzdu zeR(B`4v+S?AS`qW%}$8bDp~OT9m;^xN#$U`CUsrDd-RRfNjY&_Y>x6N0fXa%j3pm^ z{Hg9u-C9mcIu$3~7vtb#X+F30dRX+##eSR%q*1%J?RvfJa?Ks4O*Ju<&L#ObB+$Us z$Xz4HzJQ$fCX!mH7Q|U4Gw})pkW!t8`Qg31&c2Q=vqdk+eX`S&lNhx$f1ZC(S2fHm zSL8YQM4N63WX4A~CvSXxJXk)UMJN6Ny8P9XFqpLT(3$k2_xQ5L+>Rh?w($pYD-4|4M4`{MkqeOA=IC z7Dk|8hIgdFWClM`ipjVc%$I|WB_$hvD%2GYnNJ*ab4&T@65Q}{MkQrg;|p0K7cBc9 z1D*~Ox@Cl))w*3KxN;n>lP|Gwp7y^mT&H-#JCceZOEXiQ$=ITJHwV*>vLm%?th+sQWW;yJ-apj(-Lz&)%#b&+DFaa30H5%t;k z6i1UQ_;~)hAaK0r<-e1qRQO(bi9|_o>W&aj$C!1ggjbTJR|$QSD@cNn240Dw*MHdO zreQs^Ai7z5ovWZJ!}g{su@UFE7b8+kuQ!UuB5y_nG1HlSGn|$p6)x3tbF4o??QaKd z@p;NL%ESnhn(Y4;k3ufbh6!JY$?T|e%+ysf>9yl1OS!TDbBWJlFK4L|KUTOo{5raC zKll`;k}(uG;}Hj=Og`U!A=VF%eAt2}e|(>T5vYxRiu{26?HT@#{_6#boj{hc2=;ia z{9Z=YN!;o6pe3yqQx+9Pq>7Q|1X!NE zG%iZVxuHpA@;B|^SyOid%L2N5xM40by)4g~OY2L|@av18g3}op7*%LmIK&`4=G{M3 zd+GYE8KJFqLzAn;C7&V7*3ND*cHG#5Fps}Rzr0h|(`;ijsjApi?_W}J^bva3=H%X0 z4u6M3!-&93nS5&X8|1yA1acDKnk-z>m~fT97*mzQ-Y(FvyR_F_;93DuJN}^d*WP9D zJgmD&iS$sS2R3nh`YG-6dGy{?hP~zUwXc{N!Xb(z>wwgzMEAaXV%GryymMfq_C_!b zAm8c^3s*x7l)bR%xuLZI~K88VV+a@zNIBciRl>k50mzm@g-X;|2F* zW1w^OUgk_^#Pj_`amm~#)0ZLg-yR=EX6DQcN5kdS)QA>76ag)AI7^R8I8l*q$Uae; z{`r@@Jc|DYOSS^P_YR~r{db#`I~pawL|J|=n7O2gsz8&Sw=~i|K709IiET&Kwh?mB z?0#VONRLi4`*w1cW0vIMk$U^JXHiXX`oIm<-JD)T-~H1@BxosUH@VdX6~0+322QN} z1!NCfq*dAZEsP}6#C~4d>c!)BYeXvl#hA}_ku;&IR?2s%fYQfvkTAo0>49)YmvKhM z#!V=05Q<5natmus*R9m-9CshViX7k8MT_ll4;|W!m zdnWQE%-Xme_##9y_mWeA6_ZL9Bkt-$)3FPy-ZKs%=s~!gjLhg1RyOnh;enIx(NXl- zf}5yL-(;aZyxg9+kg?-ss3V7Khyp=aD#&s-?qa=c#IX4g+B$&vM>%ax^amdo!1ljJ z0C6qL9zTXVR`Pok>7qQ2k4bO9G2fHqmiK?>uYH5l$}cp-Iw8?F8y?W7bR-1upFQA5 z^qn^BESMWVX}$P=4AhW8{}o@9*il}|kPsx4_V-o_s&kNiLhjtZmQ-=E zc!zZs+M{9k1&zWq6eos{`A~&Hx3GVhua91gQ1}B4f#K(b3-s85By3oLFu?W2NMJY3 zYq`4Xu{h2pm3*tgWTCNBsQl39wEk@bC7O{WQy4g?eoBBb4^f zpW5?D+uH@(Aom}^-3Cf@Tzs(gXMREs_zWau+91VqTn%GlViGkeO*qwXrrxtZ$X%i# z1be1Le7(cz)p7)=Gk;_)gD4SimanfD&z_p-GerscIK|8Al zo&e(3<6;JyjI-dc79jjm@s*V?2vX=e-{*{UL{jG1IwMhk8!}!M`kscp8Ry;WU!+Ev zOPQ3Qy>zWomwzDohKd5g-JH(Ao!?5Uc&ahNxOpR)BBrbgrra3GDN|k1$jo3-bi(aQQl?Wqw!4&o0w53e0h zumwZgwqx>xzx3pD>KraV?z1~503=K*=&?g;77VHA0t;&G4ig-0wj>Gf-l5F!v8~R= z>xsTUip@%Tujid6K}w=<bMVx8uR^eD{fmT=8q;7Ra-Goe!BBs|Q2 z)tdHE-Bpjed3um@3yV_4f`1a4Yh-}YcEL5B!DR6_Ps^a$5FMvWxl$a3DXkcg|7{m_ zxCzb9W4^RB6nI~@?qt#f#8R?VF={tiV!HqOdD7XzBmjg!9cbVj2g(Oq8>`Y+lN}V4 zi#3?OlEfP-k1h@N3OEk@lZOY6iyiTjW7cs!<2*aKid&au4fLlYRY(Yq01GLD`6PW~ zyIC~(YW}j#<4T!rOi^A4>1BQWVdHn-viNmLHdD{>VAT$8qOEzVqv?j1H6jWC71VG} z!}LRDkh7WV$uO)ui^ z&P!Kk0wYm5+&H!Gh9qiKhpLoIw}*9+uE{h<6xrP^yt)NYHnh;-dCw$<=tX7#LuRJ@ z>*J?7ge81PP*4Iiq@9guR#@rYO@#)>M1~l|4EX^%=q@a}?N~rMKo6W+d8A5wSFvWG zoCf-fi0Ij;&iKB)3^(u`weGCwn zqUjL;L=$vou9fD(Oobj=u9q_XBm;KwVbmjV7`zHQE;djPBgc`CDHgf97t!g5bku8C z>>*-$=1$CGe0&c%?9xYj?}?)#w*)`T9!AmpGL=hjZNI`t^iKj!<%(wG3^r;oC9GilTXVSUf#B98rP-pmcx9)NP;-M(Vr^0tvA*_csMr?b zs3X8~v7ou>D%L*ko9RoyLqF(fI!g7mwiWISH<`hx@hqLob3@`ylt}VJ(E~mGb_C9> z^EwYK`Zi|Dvl{3GPM2nVXyEA1!&vc1ijDP8-8gpM0}JK^$Wd`R1&30ExK;Hk^Z+~~ z?jj3)uzdTh+}T3vht4P^fY^B26}po%1$+YpSpoZ^l6Yr-@StFSP_`*L@~eE&)>p&=t%s@_!Q2yH^umVTqJWZd4wYutC=pgm0< z?1*)=J_p!^M{*A7iLc#SvVWw$!6g8MU(u#vS;wECo0tcA@uelr`0)(?UMb)9et_Du zuv};J7s^4HlZ4A+PVbf;+6RrVBjs6LTwhC7(|A+#;ZwLzyz2=r_LN?E!RLr6ZP)xz zDvMf?yVB7s19dIdp(mb?6^tgkg1(q%^*(ZDkqNJ5Zm&2)$k?!qX!u8Lc)2%Fkj4h3 z#bi~xMQKU~%OA70v3o|?V|mq~Z|Xgs<6vp3PWx_SRsk2d@16pM&$X7_f2n$i7gbBQ zckSBIB}K&8>$PSca$YUGo@z>Eg0gtyF^^pu*Q^l;mF_opiZ%|R+?b9(;(azo`|_(} zZHsLH5a3_)Yc{7W@Y83k-Dx0og6*{!h<1z6Rt`aMd&hY-c0H&$v?E)K6}bp_4_ z%#RL>Ko+)cNNSwe?yOZBZInFObMkyrN4fUVhcZ%gp#Uasg0(5%Egy6LxUP+>yJgJU z$hOd59LVrR0)Q{5(j{TV_$kdm4HKmH>eF@dmD;JfM?{I-75+XGJKB!`1)UL1vrd&@ zRc7!LoXC>-U#mAKoc`w}~m~pW40EJV7Q^BM*S!u;|8K{TD#b@;;(j?z4(+V zbLO6?N;fY-A(GqPXEQk{w4}u_ih)+E9?CoLWR3Trl&0FMpPVpT629$E`j2^`?!%|X z(+f$4qrZZM14Y zvf!U`aPW9sN}MsEO8OmeGr=|_bXI=;=wjmL!FP@~v~K%>vQHc`zAiT4YU$JPPH+f+ zLhKZ4;yK&G$6iQj`Y*qvA;$_2jQB+jeKE&IH5xOQAEZFP@TH71+PkPH><%`B7(EL)y>TLiUnz2x#l#dp|6NYqHKa+kf3T$1&R z@=%)-GW?=Th|5OkjGC|Z^F~pz=eJPYx^@8qw09ALQ&j!W3d7|J)5rA_;xZHnmnw^E z0ttPavDNUnY)av>^23bpW@bmx_eL5dGXD6{WZo!#7Q(D5y;mb|0^5GSwQNvRatpoD zC;c6ngs~;Y$=jI*O-0`Wzo8OR>Ca5!ikgu{9mBgtP@tQ;x_hHT1A8{1BKcPR;py2e zLf^ElULXEd?}r0RFB`2^Dyc`UqZp8Oi1F%RDhn4+2i;~OI-eu33f@^LuE9N`!`vY9 z3Zx$1mA7N@JoL1WY;{;kjuGi2EB1ESG2+}6I6XD&db$|ULoN6nlKg5@AKOl30Zi6r zv_f-^)+bs{-;~-ZL_pmyCPluKM#{axDZLDx6luCvaeGFYXDfKrG$?Uen6!vhCiJ}> zQze}}klTrwNNy?)$t95gB6BD$-VavQjq<$>M}{sG!;n6rLqm=1C;1lXw?Unf2C z(NMh(30S;%^h{4D^L^tR(FQL)imzq83xBwI!t%Y=vZVjr20Fd$L0#7R#KR5Ku&FT! zOP+X(Lf`M8lz*ee8j<%#F*jdBO1N%5jIS5~&N*#`N=*iP&*xv*GnQia-(NwCY|JV) z69RtEjkZ_T4}?jaqj9Towq0M7iEN^KJPL^pUp@#^x@ClaP24#3_&W%{8znrG0g8dIW&cKS_1 z5ilnC_s!IG2pUP7ATRTkIb@I~^(mD=uqj+H4T-9v0b_&LsSkblFEF#Fe-%Q_^cOVRL<$#7M7Vj+#F6#K0`cHP})Z-#~mGH72K%|jzE`21QPAU#%`|eT-qZt zImWpWx}Q9kZC=IF&k66aNb?e!7yeN@>Z8eZxBWJG@mz=XPVE_@?jExojh4pZt3gcy zW6vy*a4;?{LQto%UA&qT^9E5lyKPBI&_<2yG}mDra3lk+iWgW&#fgXOd~|VJ74mxA z%^u+M41u^D(9u*9>iu$X2rw-y`Aa;;E~j-aH{+3T@<<0)-c!E+M=exI9>2c@c6AL2 zV1!;q8C_#p1>P+*K=iXUqN#Fy|5USb1+U4t1f8CXbggYlCu=;E;h(YtnI`@zYvel*Ma17-@~&yaF+Vy7t^9vC5;*^(-{8@GccbhaI{AmIETPvGV7H{%(0&LJyr zp<7;7EGvRu>I4qq9b^Y~)bbmomb9c2+@tKKF~a;)0f_L=ie{2EU6SVOe|p+K1R}Kl zz3E(+5whU4I4SYMd;l$CT9dhI!M`9LxWSs`3L4#huTQOcEfga;jnp{v7x2^X;6X_` zqeF^+8Kyh57z{!QH##zGfPJIjm~(Wlasa89x!RiJ2(mkLL77#Vlk070yZrr@^#b0? z%drTb5hvhC0QakOw(p*Z{e>PyCl;rG+oGr7dMh$3#Y}6^(j$qR=F#<9Y>OQCms56Z zKiqA}{esjtzhdwFx0EH1Q7SjwIS-$8#Uyma$bBPMx7E8g&dzLN(BIK5t@X#VTGvH2 zYBoIM!DEe=i0CxB0_ll@@OL>jdV-jC_{;d5;yd_PnrGU4Mle{Xoo`QIsJBN~XggS% z$^Mi+5w5ZcfbFeJabln+lt%eQZ}(T8B;TVGbNJk3e$593U~*;cT#}PG z{nfDLd)d2RyyZVhqobFuPg{JzvDIJ}#m+cZ@35Ws)FSrC&D%|sxOrIcjAZ($x_8vD z{6_cSe0y*nwTPvdsO;RMU(JxRnlozFoJ3Y1(WZlMPUm8y{(122i~%=CRnIH9)D2lm zV!l#j_P*XOSAJYMcvOJo6$^81!~szbGlp_S79s3){5NOZC!Xdnjpqs6jmD+=NGoL_ z{Q5_4qz_mNZ_xxES>aTu)b(;fZ%qwG1uz^+aU3k5hNuO7j2WwCRZEii37OeS5=q_} z;8j8T_CyvuAibNgOA31#S$o2I!oQX$AVanI`y7ZI{Pm4NhwJ`+OPiH?2*s4?)3Wv` zEyj3;5*pYnhT~j7BSv|uZnelDzfNRT-O~)5ge6UCob-N*`7hi_%KrWzV4Zy3-EfT{ zzO42b*B#@?XvQ5%5AHLOx1p$@$f&S{TbV7=e#GM-!!v>UDe=$Mtm1E$52k$C^O(|( zpC%tZE{B(?i&`W+9oqgndf%Xzd@yn$j~@WJJ;mM)n)#n~TUlSXT6E&$? zMlc99{$5tbuVdr;FSOwGN6qcEK`1t=znXd%C4kkQchC=1i8^a=Z}~g!H8Wt z{Gg|kcx}d(INuDmqci>>CJSyU!GYpkMe+1>kSW?jWXbaeYsqE;OCp4LHTy*UQnVSJ ziy;8~sE5>AHIt|Udv#c;e{R(^UACj*uQBy_bixqmUOx8XPQ&k`CwVznW>=H>mP|35 z)!&TP7!KdGhkG0LoS3AK{vs1#(iX9xFQ^T1@TZ&noG1sYsq~1{m8y}) z%Xh5>zAxuj`W-U}`be|li4OGEdJ#-$=_kb4Y{?QbB0USG6S=NRKFqTu=l~aH+WF~? zkjl1DH6$zktXidA`r-`M({3C(IFf4ruN!GTtB{;(W% zk;f184_r`z-X4XuyJhuO{oAOOQWQh*{&CDYU$iOrZP;VDuvsE4n#irePRtlNUfE$* zu@P3I1QWkg1TYw1X-+r5CUrhpjCx%#lI{G)j4*%GmEBI#2fhaM6vLs+EW0K8v3&Ns zg*p5I)FR(*OJ>gqKGxMEESv<;Api&OPi>uU%aGd&|Gj%(ivz4KPMYnh>_EZ|eGWUk z{P)ix4nnA$2w>D6>uvVDzeeV^t`$O!+(s7&JO$myYin>AYn+}I+79c2s}HGZj# ztbF31b0UNzPz$?qssw)2?ehF$1r$-I2OpvR@|uXi_*bQWgbhU;XFdeGxk7R%Zxko} zt3`JEw)03yN)tvm?5W!mZT+9tV^w|sqndJRv#O?2VZkclLb=)!nRtV?uo#06PRVYw zgw+kBJ?(Jl{__eN>CXO8RvYOMNP#lR3h9=Yg)vHvoRD*zx3s))JdQRP_)Q4$ zR?(4z%VC2&xafp)v&;*TMfy~*6T>>GB-CZ>?|->fQE!1Ss^1v!Z|+}r=ftOD8Hz() z+Yq9&4eoA-#Nu@#_4VOi=fbn=Am3MbjHOlAK*OeRkK%3>&*%M(hKBo7uMhjMu%xuH zvLbn+Q5_UY(WlFHTg=Uv9!RX3B;BJnPn4L?e>2~C3Md@1d9QzP0c71K9G!!CQ;Hq} z6Xlf%PSW?O+32_{(6CJWwcr}$HRrX=XcY5+p@nBlMOQ>G8^rNw8u;APuB@(#A;nwOT~o*ed8p zz^_AEnNmu7uTPVRw@^R{-vyF|ly1n=vCrMfAP^k)9~Gx6SHv^N*4=wc`1rP4TTq&w zan2F}IJF9a9U|`xc+abY(D^%E^y-T+RU6g(#I zZly5$0Z2tZw@n?DDG6cSi~jqDn;$oURivr?Haq9nWzV^sO`vobiWxgvZs*ThsNOuZ zZx|dIWNefS6B2%iv+d@5a(V3y{W!k6VuGX+Ldfek!vb)p%+Acy+~f$;?yln*WmI7T z3;sF17mc$ZmUV^8`l*kX^xhz4Xu5x5sGAc7#qNNumR_ye2Z=rkzr999v2O7*QjFaC zI?asr!QG}I-lwhO?x?*#Yep~*M#@k*ZG&~}*NLT~M4k_r{` zvmaotot2nk(L}Pn!oD`tv?IZv4w^&pb% zq>>Xqr5LmYxBGK7StM76|u_QCV2}qbj#y4PXM0j|22$gYj^{ zY1r5mN_@~1(ZK8;4=|PuzzMQ=>RKgkZ00i%r03M6#T?`!274a~>6Lqn-EU zO5J@=k1LxeeFV}mSgp%!r|yL84dgrwlk8ay6L^FICFia-ox@p#H_Aw|8B^Ln{NQdK zd^>)p(0aLVw{BPXo}*ZYl3hz-g?a}dLy{6wZl8%U4${E33t$lNeDYjQMbFU*PV5YJ z)zG+FSY$k4#lP|Jetp@e@dAiZXG49h_CH$17iMxPH3BZ)e`lFJ-C#rzRJC(jrPocK zEs#e8%91QO&L?#G&al-!314?s`eLfsN-w~z>zw@11mp=!4OKP+dGNAHV_*lqDzn8m+Fk6V3nIj}8J#fw(U8GRMVO#9@m=L5a zIbK7c$U=!Zg>u0-JExLl-ddS$Ev>{Ec^cvuOt{4;yq*+ zDw?aCE|n48&+mvbXODX}BWXQdH|ad$S>n6rirbzjQo2NzZ<7B5iK%z5Ve*@fT3}kA zI?AX(Ai%lftH0ZC9e|RPGJ#Rc&nzwW(J_<=5npG~IiCzpE7ZRhyaaIAV-DGipN*0; z-nvuydJHviov0BcBRxsfWPb$E@0BMCsc_C3VJdM@v*YzianVn}ny2L1$haakX1P5m zAWu5aE5g@yCasv=lHzHofia)h=4)~Cp4M`%>r!3?-N+){5CwyaRv$vE?MrNuu{`UY=-~Ap&lLK<~3`+=>a_Ybh0&uUpR&Xm4C%E4Ky$;2(^jE z7#G;U`ck>}Fgs{8*Y?2kf@$}myg_!rFh6`=&1 z$9cAC^!WYm^2U(t&4!&ORF?nz@@i=i_}gM5h!?d-Z7qU^SQkDL7Ez^i5X`m}t%$+l5`g|^jv>el)U8W-{As+4|+gP7X;O|U@Fz`1+TJKdG2@sBFq(y%);18uS znj$D-WtSbbe?vD!>`gHf@4Wl37w4VOTk7S!d~f1fwwG$NKZ%0K|3mY#3)n4VgQTI= z{E_zSkpB$AwXVgro*Mtm*#VX3Yn1JxuiWSPn$w?|3t5`*+yhMDfgy7RcT}lDBHZ-T zzMk3oEeYB>wB7wLlu{7XhG~bY9?7=`#oO)c0_Z?(Jt;is;M&ZuFV8Qbf5txh>v!DQ zdT)}r3M_f9!qW(pOCRJpt*pvW{g~BnjtGuaKEr{!I}?qk5KQ=Oj3MI-u>xEBc$f;v)x?Vc#pBC=G1^zboqdm|F!A zhV4g-VAmo-Ob`F%@e<7z$D`-42}?lh$@ZoBg_ZarFu1O5s=)Tcn#1_`cebXJDyz>` zxAJyO9~MDTWUU2SP=D($=4p{W7pVY6;EFh&W49ss>uFVAS3gmrfQ;Fm% zu+!Ppn|#wjW7A@wD_Q;?J*X9$i1Hoddn0#)XMZxkgHcmkw3ylRgP+(Y64o-Ri@3A* zmVyjW6?OliYGkq*JbPUWr)iZ^)(c0OjKC0-@zqmqcl6@2(B7+suabEh>q$N7d;TZ# z#O-61Iu;K2GXhQnilD(5%R=Bp4~euC#`LkC|7RYaeQ;C!#-F@hh%$|b;6OA>`+4T9 zBS)||mTDSUES1Iym}9vB$A}+Nm|i`Ax`Re%T$DM!q0`v!#yN4}kQd@X8BE!!DP#T> zSQymCH^9IxCGJBPAn-Zi#(TWRD@q(Xk!ErC^LOQL$thb<-S+iy5={1AA&{|unjP<6gy;2&@>GQ_slk~^vph90s8o4FKq3&2d-0NHl5?Ri$iWDhBpDNM$e z1fmFVI>=K+6N3UyVQJieC96w~c)loNvBhDEW$Yu&sh*6Omgi#+F`|dc zXZ?xALT^9^kn5L*3TXA79nzv$;P+`HCK{xTGAf$a6U!BTAJ~hFcvD_Hx7zl+al&?@ z4rnbtz4k7IoQq6kv8S_6`48sR;e8pzvA%%$#^T1y+;wQM_;p|PuD}%*=LUABKNrV9 zoCp~qlh)NQ7PIw;%}yQm9VAFM3x65!|7%bFNZ}B9Hc#hA?{{y}M4^V=e)$)17~8Zm zo57|Q#}mO7(K69bl`VzrDs!^zsLO~lIe6T+hmaREBCc4;_n5NIOh`4SXoLoOLkIxN zM}eV|fr_f?mT?N_@0Y@BH7R}1hKp#sYa&&p$@;?Yn7T5Z#L|W@nCwZlEIKG?Ezz~{ z)9Nxo&yrB*6zXm|lln<6l~$BfG3WuQoNYhRFEX!XzbR&2R!F~A(Ny!(*AlKEFLZ=cu}r$ z-~qQ1X^5l9*QqPpsDbMMv&@dOH7<|-KDFAJ*>)tPk&l30ICbIk3^BwLd9lTg$=(Gg zhUwI}VrJ#QSCe6?tUox6Qu(bLt+8o0JvRS7@p)KbX4@?!Lb7v=ISEod91vBXhGZ6e=dFR+(R~N0}y?1P* zv6IHO(Z;rI+qTi9u^Zb?V>d<{+u5;k@}BcE&d2#_U2BeOtof`l$G9Jkq0F%J2ZE%i zjoN__k0WD3UnGWE2t(6RwUrS4XQ}N+l?}8Wm*F8aVaUQ-!-HRk>*bl*<3C=u?MA>! zo^waKKT3@u_J`l`JzC)V!fO0EYAEY27ainHbBL_`vDmnQf&@_*_#L|NDb5vU$ zzQhE|@Tf)|I8xrT53Tb>J4!vjPrgBiQhH%yLl;_)tVvJ;uPR{7V!VD?Di1Od< z@<$31^gk_=i#@kM$iE*Y?7o~i7m(6W2PRT^jJ8g=fAmU~SA%-Csll1{RgcSCiF=+}7EPU>hH;R;<8G##L>}_qzk2lVhri!cSH?+Ew(!|@ z#9*cIH(U}`e)asjpykV?P@6fj+6GHQhgkqF-u81NY7y(qdn&?E@hRJE-SDeYDl1C3 z_k-x;%dKx+yPsr^`=TeSF$C)>dOcdx9@Zv$y|Aw@LGs8Sz?Y!24!Z==vbx`afDw-B z$Yd7I9d3#mJ%*B^J+83-2bXVVhFDk>?p$I5FxoAguH9?}4?FV2R(UYF39;NRql|Hl zfX#qy6MfDywMFjuQ-FPG>xw6zfM*2ivEnKDxnMe&?5^VmUcB(UWsR2qdLbq5u;V;U z=d#nw_FZN8RUdZC1t%c^zH``NWc9Gtd*xb0nO?Zh(aVs9tWKI0Y8%gWl;KDKw>hie zdB%N~^Pp5$ZM)&`CbC0!$XcL{rlMqZ=wO5dEcf}J9YMS<}o3u{Q|@B6M7EiZ?wwk9}p;`Qw5nj#M{9p%E>^c}cOQy$pY zn7U(b=^lS@6rGnsrLgs)-{hI0ihKf|eEi!8$h|6p@m(MZZ9VtZ=1g!kQit-XS1)?A zo+O0fS{_;ap*gD=X`}dCIp&F$ai|MVd19gU=HD?fd#!BXbjPh$4xytO+YAc z#xK`9hxQv>Q#04>m!IF*?|zW~*@+M@5t^O+S$dvBIgGp|J+rMjUE6!gAm|z)E|mW_ z!)}t-5u5hapqc$yD}gsOIHB$IP03ShpER9SX7wk+uol){tbe|D^I&)GbiDu~)$4KmOO;L4Q`YGcd zZ~m^mI)vj75@n~CyFNlA%O1B?^Zi9PdDwu)XvRQl<{OfpK!GC$0BK*uL9K6SZHkBp zmLen~C;C16m5kSHbkN!1-YW}EprtuCg?Yt^Z$YHeK=XG=Gy^pC*q^AK7(CjmuzlJH zfjS2P88GV>&!y{oi8De=E_T}?i#$#0 zphnZc5TOXv$10H}A~uMWU{kINdr-s3s}gU(-1&!oP0zHxtD_z*H!ZE)@pY{V{8!FO z9Qt2aPy!yiSWi3jg-;M2PUTGtG74jFXl>s^mM@*2hFVw-H4!0|t4G}!16mL&l`9-B z=GTU*kNgQL*R7C0IK|a2Um8NX4cDJe8|=l+Gh>sKUqx#Wgr_YgF7)BjTMchpE{~L* z5i06-oAgo`xtl&hof;QvbL?D8(OzG$=Mw(%1f z)`9pcCGfT^-!)2=$&zEuhL@rxuXfea*l7-jDk6MjSGlMdQA_wCkkPd1Wl5mxq0V`J%>y(bTy?hR!9lH%)`K$

znnG)}n7A~W>6f&;>os>sPSqiWtpT~8 zhlcYsm}}+rzb6wn8zy$%`Qj=-?8h|4JDXw3C^94EBsfaDD!ogGu~$u+g~L#7$cI<@ zo~0Ydp{kP1cC6jkXpa8QiKN&_>6drWX^05e)TW%gIB^pa`S+AE3Qkv0+xxpI;y|h^ zI#Z*NbFdxahj zR??FMwHiRH!=c%>*IPh-_)c0>v`{O_>U54nN3P&eX5WM{f!pR|pH5Vxl`$NB0Yoju z8q|FC%AuldhkeE1dXQIT^PLX@<-G3 zq&34?9H{(3fuD+-D&sh|jY2NMhd$)>dM5X zXij-PVI)V`!a*h3E7?H!dFcilP*eJLFdV$x029}3LS=bD+K`Mg- z0(g&#*Qh?>_3YcGP2w2X`p;omb33Vw>-ywE0Wx*t_(|pNFD>m-k}H17D#6fkT8QC7 z8)2DLU*VSIpHtax4OlCW)l8azjii6U=9czfgKd+l8HYd<*`tz7ygLOKUr(*Sb&1yC z6?DVExS6A)duYo`p%1ltLwu$$B0HCB|LC%tECCv;>Gb*Q&zYHdpXe8#ZG*O5SH~bw z2`+j~{tD`O08e1ba z>SN^1I%lE9yWY{w@x&he4t&dc=E07YxC`-W5puSg>DYz$;G(FzO?py8%(qL|PDD|i zaYhc5{qO($3O3kCi%2pfXiX|fKOu4gWI%)O3Y9uqM;D6{N~E5Ck8G0|A8KSY2E_Ep zPWSjbT)(G+@e11$5Qm$pfa%dHq##+d00L#1+fq>~#dx15E5Gq=a~?YewaZ&PehGr+5^@U zfG{M@u(oNp0P4*+A3I0de&4>mnhEPVkdb*z$Q6F6T(mo7B@EiqtYjAkQ_xO~gsww( zOcvqF+vFT z<4gB9h8YsX+CPEJ^;4rzfkBfF-}fD7z&7>+j!G~X>)*Mb6Yq2jC}b6{7n(J+7qq1i1obD0_=Mv5Rc1G50Ev73Pf~>P8Bti6T4H% zADcY#H-q1PFk|$F>Q_2R_INR1YyXT`ohMqs>qBSqDYpIj#e1FzY?~&9K4qR`>d#Ri zo{G>UL1Gs39*f{L)oI4xRFb}_S#3BZmyPg>zER8FysxQ9*|Erp1;-8MSFPw~`f;}8`pu8chGB&SFfqg;8(?n$sE%(5r_+-D!!5CT|N6?-4f2pc3d|*3^O&d|< zh#1lvH_)2Ca5RX246A5xb0b27M)LS9oQn;Fwb+$djDZwO)9Jazo2?7}1+O0#PXm&l z3oP0;wNAg~+w7HR46>z33Ge~iQa$|0P6(|MHsGU9F*cH49Z##xOg$(*N6Z?m_NKtd z$qk`~rMNK?V{#n+0Avz0iqJvaoHV&lQ>>Nwz_uy$Ud&dyemls0Y1B)ZzLZ)ioXJs<9H?jjtBGn0ULcv`PGgo-M%>)=YvRsAE5O!q>{CIS9*m2 z%g+VUAzu}^^p4@=V<5PsqctNMcQ+1LP|%WVPj``_`&aZPNf`LcGXY67CQ#Kmf1#Fu znds(+J?1x1 z4uQ@{eIz?&uOw7AM5>R|4Ex1aB6K(?YA8fp0g<*Z`ika{+U~F55sdMI&u4n8f2w%& zz5WzTmcApqnSVm&W8~V?6<>G~^Lbx83?XzqRJBKh1qFgwSAQyYGuwSNN^Rp;=tb3>czAt-g*}!&) z|IT!`>!A0uAVp4W@-qWj=oAwHl6|%_V$9%{T<;U7afQPiU*%a(|DG-NiF#|WE|V*_kU~?qX5`v&oP!Y-!EQC$HFF;C1U)brx1qM9c2|MEGI*F)6DW}A9AJPB(PdKYO z>)6mHTDPXU6RIafr-rly6%MihMwdxQ!xO?%Dwh=aWt#UitWyLqx7$2*`F?+E3eunv zwciNdk#RiQan!k9HCSq=?P-0~OCwhH{UO7qI3e*m+Ug4=1wLG5<{1?*?emS;eVMHH zjy3fBp_4A$#K(5ioTkpWKWc-Ghn!*iA)bOPA5_|o+gHAhS=AFUnqXGO=#=IH6SFtK zNlccQxgG5JD60EF1~_C7Kdzc*wJGmSqYN zNCd#5XU0JUyJN>jq<2M3TEpS&mGD|0uy^?T-rx?x28mtneuk@9M!< zVJqj6QhX5)N%sv=Q@v4l27atV`jyGavS9o1ZsvCN5+kFp(m`u!caT`(C`zFRemK*6 z=67+=lT9>g?=#!72_c;kPu=vU1~tV(ys9t-rbxl9J;B>2bCSnP42>7nl2PFRF)&S?B0R zBpsn{mlah_;wKzsz`7!j$sy_AjmYsFu%)XxtObB4}x`Ua5$QH;Wt+&7uKSh&g3 zhIp%0mS7vBKAEu*)bX<1x#->skwl>8o#W5y4U0EeRHSFf3WR)}w9BAQ6W+w_oCqmQ zW06FnLXuaYu*;G%9!cuN#%is|uT_ZIBeFxQ zo36dp{dfFrv$V<%Cabke12eU8&xW^;LwgDBUMEx=1ye3bq*63x=z~N$C_*h&p0NXAWW0gufPh7 zwX}NLbfURUc_ zN>YeyiO&}Ry#Mn(@yc+XV|F`VeBSZocr1z~HDsCr9-(!As|zKV1vuQ=qXXGSnP6sL wVD#G8?duEz*=eQ!>r(pv*9VSxBEXaR;dRyMY>6Vcx*uYG!qT+d1bOHG0Nl>WX8-^I literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/climbing_action_stop.png.import b/themes_src/space_pixel/alien_animation/climbing_action_stop.png.import new file mode 100644 index 0000000..509514a --- /dev/null +++ b/themes_src/space_pixel/alien_animation/climbing_action_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eee0w4tg4i3t" +path="res://.godot/imported/climbing_action_stop.png-146dc6325d16edd2015a213abc8104d1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/climbing_action_stop.png" +dest_files=["res://.godot/imported/climbing_action_stop.png-146dc6325d16edd2015a213abc8104d1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/climbing_down.png b/themes_src/space_pixel/alien_animation/climbing_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e409091fecff540d8159017446e61525726094 GIT binary patch literal 30360 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 KOv;Ts;{FdT1BF8X literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/climbing_start.png.import b/themes_src/space_pixel/alien_animation/climbing_start.png.import new file mode 100644 index 0000000..9509009 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/climbing_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvw4js4d8rsmj" +path="res://.godot/imported/climbing_start.png-5d7e7c1377c30d27758167009df3ab34.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/climbing_start.png" +dest_files=["res://.godot/imported/climbing_start.png-5d7e7c1377c30d27758167009df3ab34.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/climbing_up.png b/themes_src/space_pixel/alien_animation/climbing_up.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfb53e2df8c3ca5e0bc4e54106401a69796823f GIT binary patch literal 31496 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/climbing_up.png.import b/themes_src/space_pixel/alien_animation/climbing_up.png.import new file mode 100644 index 0000000..0c91363 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/climbing_up.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://l7gjp3w4wltd" +path="res://.godot/imported/climbing_up.png-60cb362f4fa4d6b11bfa427f21a41ea1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/climbing_up.png" +dest_files=["res://.godot/imported/climbing_up.png-60cb362f4fa4d6b11bfa427f21a41ea1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/come_closer.png b/themes_src/space_pixel/alien_animation/come_closer.png new file mode 100644 index 0000000000000000000000000000000000000000..f3127ee4759e35998a7086f3e2d97338a328f674 GIT binary patch literal 104115 zcmaI7cUV*3x-Fa#dPhV$K@d?aAfR+Y2Sth?#X=Jh73m-%Wd%@BsS1kHf}(;_ZFEQw z1Oz1@O=@TodM|+_Yu^0!zTY|fKF>MdA9-fVT1nr4U?4GyF>v^sT?#@VxCH-sAQ73_A_(Mj&$CAQ7w={-(m6(MJJ=mg zT(RA1*cm&d#w~_A7n6Gb>FF8Pu|@uzzu8C{={#aa%X8HWNM7aCq)Ndjir{-<2>CZKgkz2`Tfs!EZ>>YMndGiaGIbGooc+LlA1stR%4OQk4%&2_pAv z{W{3Zu|_&ICZ2)%fe5%#3H{H@;TG~SxHV`-DYl8P@>?f#2l0ttPZu8$Ay#>HIwz`t zS>lgF={v)qSG+x%v?&b*;B?nlzd&)hJ`oZ`p1+PI{N_72ULEqKbGjW_=@2Do?&B~J zWjLU6q_}@Zpl#4m3UG)cd_BRR4i^%PFe$^~aM$pZ~wHoVTN(q{+{5 zFK9z$_Ae?*lS(@W#r^`BeOVc)zr0wg6i=X9=(j5bi@*g}$-T}H3QtFi=EDNUtd4Un ztS&wkqVS9gA`Z>#g&Mb?K#y@?&2Cb%VOm(049h zXkHogxQq`y0~Fkea3<5AhRolFb&zJlxx=$+b>~-}3@eW8*zI9}RKTq(tPg1_+P^hI zXKr!IpUZ$;^;13JLN(W?QH_7)e-*9%oTnw1f;dkCB}Kdi8c~9$;?~fL=OpEiDQ%Z! zqsD!GIvxCYm+Z^9|Iqx98_?f|1Y+qIo~9gL`=%$OqOjGR@3?~}9rIv$cpjqH$X0B= zF8F<68My$iNT}gHi!DXX`RQGHJ|MnMy|Wv79Mu9QKTgzOKef5&+pLbArW{>NIIP^! zcQqKDt?S}SD^qioKBj=uU14iUL*DeS?Mh9S0raZK z-=pDFqN1F_@4O8{MchUcR;n@QG7W+RRQ-w2HXy4tbCM)~HtM2lOtq=j3TGZ`>HgiDSTM#oH(%LSUMleBxx3EU>r}9_5tr% zXlVBHh|c-a%&-ael3n4)Os|6P<%IjnFfq}NAY3T!gP8Sy`!HjztK4X&kKVU}`eh>| zS;mo1RRoy7Owr~HjsXn+D;Pf6OV?Bm6{E+cab-goa(1}RGw)>9r8d7=39$b2v9zaN zZhzRZZ_tNf#Z^kdR0dt#{wYYX&xVS?1Pt_&wn2!yfSy-Wlec&U=m+ti5gWhp@J5}r zPw{1-#Ucgh61xb+F6!1oLlS6Jf-{&#CIh4637mYsykW|6Wkp+bpRZ-9os#9%FmEtW{nkD0;xzEqMv{~LXow#Qaxxx`373$C+0@ps2nTUDiOvWAXz_PF5 z?B85+Qtf>C6m+c%f3!qY`{LTQ=EBc;PG$4LtlaA~x!YG8&j1R$8%-PxvQ1&miGUVp zyOEM2+>;DyHy51`@B@4O_K4{zzybH{Bd2U6ev`a~Qic=mDkfY%1IzDXDorFcE8S@> z);8DIuFzIW;MO0QgyBS>4GMa1gW7(8H>$rG%esW`13%U<6vcbj$uqG_H3Tp#}N)}@-&9P?(kK@k^i7EC) zH)(9XtX%Uho-LDS$D(d%`8Nx(yyT;ZHb0IXv(?MQr`kG>VM--^9w6TI{!o-$5f}^a zJLP$o%k!}U*2pQ@Ngoon}{jzm4W?S^UBH|^NKjujOt9?CN+^iiYg777|KSJ3y zv5*uZcnQv6IUhqf!5VE$>rq+!hEQtKa7I7t_h&MjNo$kGivG)uT6v~0z9N7X^9>^x zi*|lU3$8(XU3ENTlL9q(5n6zo^j;b{G^Fb-IW*9?H?R%)=PlLcaIT6Rcy;_>he5Tc zI^Pr~8@a!OT&e{k65Y6afifAN58GugJKX|Mg%PuK`8NI@EoIN;&CFp@z##RU~TsURL${6UiE6sgj*9ts0eovujOOga^)@6_v3h4j0_D^kzL9nI;-= za?7UCWlr?`DvfPuFpgR1U~KBeaux0OTp15!u!_}VS%-<@=LdtHKE`a{?F9GRm5;@q zJfY!mo3PPB?%E-^Rv<6F?DoHP^351z!xmb&G5FnoG83<2kFpkIIIKdq>1<^PUG2m^ zi`{sH(Ll^RGe6S41t8~Z6TzwfwC`F>E6`R`e2l0m&nNQXC+adiYrS{y=aqmRuXHlg zk`29VvZqo@6imHUIhcIOuD~%z*_#%Rq^eh@F^vC7W)fWlmNtPMR?>-v@CzK}M2M%~ z?MnpLr|>d|hJY{y`#eVQ^j>&;MEWAz_*-cuHYGS-33mD^iWr%_aCO?^MYpK**LyCK z#qmdm?$zxmJr(b!HDm_=_QX6&O-ruyvA&M|80cQrdL{%BT8Iia1v`*=)KWa}{#f4e zGm&0!S>Awr+d+K(C26DJ=q7a=AlKg0@g=~mK+7ec7wAl8-^I1@`oDV~ZPf9%Li0Z6 z)rz`eyCGXYnC0fZM}#?7Akz?bAAQYzQ|EC=182qFfnrhVu^ApFInc*o#wzOHvd(|{f;+OBr`+qY&?+{JMa%fzi|!$Ky{Vn}dY8&g!BgNsa=%%wiK=hjdPu z4R%uHgLMQ>XrEpAdol@zix0&4(0LxRlV12=zH^iPGwnD+_`U4*`IR4eD)j~`818gX z^0DX4i!HZFgD({xqQEhRfDzv4bgrxlFlB~Oqa_&n5v?u zM{9}^+r6rWV)lA|B=C2x-R}w29|$Cihjiqni20$Ao&dZZ}c$+~+ar-IDcq z-A8&f(l_&ARlB-YEI*Lo=LNGz2QMiQDIa^W zxn_UAh0^eE2)pwNlpV=ml;fh(+0HAUCh9HOc{=-*rMEDBcQ_65tcML`_+!73@n$a` z@NWL%vDEo{`Qz7x*$U2H%O)1o4qAb&g8Szmgkv*!z%pEW1Tn|f?CD9n!skkBkg(@^$cigkl%iRC)-^-L~03a4m zP&E7b7sw7T=m$mTUhf&uLXWazllJUfhtvDOsdfn&UGRGVj#=O>?b_cZewrEa51g4? zLnE>jsgcYMwaZC>pku_D^@Yds{P8fG%KC>%(8Ko;P3wI|GL=VxZL#)zVo6eUH zFnJ2Y(o+!o6m)Yo6M;C=|7+@CI|_c%-M@CBp(k{m`}@Lar*S78p6rctiZv>I-;NE# z&UUU2b}+Buqt8BvnD2T^|Jr-0`De)ffm9S6}!ak^&D;;-5)0 zMDD|0m4K7tu#_ntXIAz%*81n(-u9v&Pg;_VW5SO7=JT(jMi_AS-e>SUADxiRe8Cvh z-uupK(_1gkhji^6)%4|alI`Ot^Tdiw<+VnaF<%#w9Ex(F(KvJH{DHlvlzG0rL_aQl z`6$xk=%b4r`ZrRE=2u+D-94pAW0N`ZZ4GOf3m=V9$Tn4(RFk?ln$kKim9Z3a;+xS+ z)c3ak3AS33V&!PmNxlN&)|BKFD7oiSFiTxvO3vd4hna{Q&|BRmF7y7rDEc3%t_RgU zZBb9sjbdB~Y_qk$z~NmhGd){XtJa|9r-QjrB}$H7pL&%n1$2xl^nG$>+=c5%$NCT1)D#AC$Msw#J}1i41Bln)$-)!j=}t z{_jGGz`s1b$Ez}a5%_1n)~3r{q${}b*R4-Z*n9Lu+SYGQTm?q}1~ zYt3P4OSY70IZKfGy0`TK3+X}sk=C%2Ki=Q-234LL<(zE_s{)%BiMI&QSGnyFMNq^&O$jW~6e9B4d(F2~)Y7YGspnnQ5 zjyAl!JaK?LlK-VK1G$i~88udVEsjTLS!WlCd&ZX%sy-WyLOzK6kTb8xHo7Sh^q2fy z)wRtjvD3B>R*}{|c;R<*2$aFBS9PZSuTZq|2iC+F9r`Dha~w$7{nW|>nA&fRW9H?C zSjhgRdAOk7`|;_pOeB+nHDukf^son>teD(rK}_K(b*BgvMO{B`B{+d7j!FcKw__G} zmv)pj;wV-+ri5eO{`)4;q}9wE3C}9Q8T_Z>`ncNy5|>dhJ$i2uYpwB|$xEtk01geNYy7uz;yj{5)`a8p;(}ODQDDkp1+j_(kf@pHTs*q0696EkaY_$>8+S_z=wP9$PKZL7u$n`1?U5llI2GI(pLA5NYrg@)?l%= z@8(}?B1{JP70NcO+LxrtN`|`jNVcX2TQc{t9|)uKog_u*Ep&#ZUvf+P1a(kx8sw-D z&SklTFZqZQq+HxBjWld2;#_Mcekz-KQ)kEd+$DTG#p(+;KQJaIAzSdrv{z)x&oN=k zH*nF(?!oJX%h!xMbCu=!xsa=!3cPppR%X)Y4kK;|t5~n4@K?yI{62qmXNM`)Jc75x;e!C;V+L}HL{WpM9<2E>c);3gYv#!f ze38JJ7x`!3eXo4B3Ybne|N4g6<}(r}mr|L80O0<`GtSPvX4Q@RxZ&c+8Ug=3N-yq@ z9Hd&s-6YV-4mU7&Prmht`^6fh>+CZ0KB=)|jD2;>WMI$mG%UkHS-81OW(qo+1*#u; zi3Bp`k_X*fOeQ}JJlN&S4L7;yJe86iq&TpCy6e-N_CfYaq&?_Zz~esl%mvXeJ!XHV zxqXah9*Ew`GTg7BI1sy))qQfmdJI?DR-{;#8E%91^1c>6ri0Wc0V@G1i#76T?!3u* zUwW?e!eBUNTjXwZg>b>|-Mg3U7k?QDs?V0?1x^f#%9rknr+<7`M$1#)y1)2dA`@7-`5ET1jsyEyz@-Z1+gxpTtgkNh$d!@-mfh4E1zndcpKg8gMS}e z?<5xNY$zBd<=Ycul5Le#MjuX?8}R&f21rF z`Mgw)G`O$)`xNl95x*znNt?YnN_r)S_2l069{bVRfA5cNL0Qo%%dN_uyVPXuy#LP?|ns}jcNQB3*11UHPbP1xjMt2jV)^D z+l@t+)5FjI9D6I+`U`tR-eXfynOQ{^-pQ`vqcx>&9CylmQssk9{i*OmBRYS_#ps0GUC_bb#jHvfNQx$NvuDOemfd}<1$sTB_Fr?`##X* zuzEtDFc&*@e3E}WvL6V$UE8()vN8^tE^L}VgbF$c4dxv!@0LHGlBYuFXa&>kFj2G9 zP+Xcs*Mb9r;hjv1Eb|nk;V6mJJ7VnG&5ZZm1gfr{BG@0%DFK>y1rcBBEzKM#@d!cz zF@0>qmMtju@|$^#U-F2T+MCBppvIqFd}m_!T0X#Iuzp(5pJDwLf!ENRAVO^~lH!*ggfZ%dH)hZmZob!qtZXiPn-Ck6yEHeZtNpXe_azu8bYDr` zX8FxpXOrW14QthR_=PpDixnjQj?t>GFk%7@f2Aftld5gB35Pg1vB4+5`drg>xoZ!y zT4HkrVaAe0;TGISk~Xl5bQ{*Fiy4t;Rb%W{JEpct6u)W!ctR>h-=0wu7>vk}fo=ar zN$FiFFY-i)8Z4Ln4K)1z(4}0?mHe&#;Zdpg#68QB1RJUBWPH~$aTqkwvFVM}_l{dq zL(9-5D$^R0QMC0$TEMlBoJ`njGR~>|BW70UtuAB6)opZBd=z^_{#E@W=f|cVt=2^%p;! zqQu_2Jk>yNl(u2UbZLazN{<#PvT9bcz>!{rXDmMS_nHDr@hW zb&4fGKU~Qvww7h~`GFi-5S7W5hi?;up0PEfRx%^-?X$)>v2< z_z*$FDT0vdfUs9@Y#%$lI$%@{9{zr#`hj4dRD?CE7)D2K%U{?e?FLPvzoir%5u;&d z?=@3Z=dUcc&I8(QEHL(I1moFMr^hs-85T7!Dta5dSjXp^cSl&WJep*#*u$VxuZ6a$)(gOWt!ph#PU+Iq49NdwFJU!M!8&nE74CY=%<`dos{$WP+*wea( zQk^C-&GoV@sXVMhLvnYUF2v1nL|52I;;8Sd>I-5EkU2qzmp}-5UaYw;G4V zYxSdyoT8^q4K+L9yVy;-HRsJ~cbWB0Uzla`u#ce&&VGK-ia?ngpXde$j+7IdFZ zu$y17I1yadON31!|n8Wijkrx|1+XI=T|R8Fl6>x5!LF zZQ6#~rF~#zOq%O^!^dAFB~ym7!j6dJyC`-Eo3ATc_B;8mSUOMNtL@FTTlLqwcak~( z2-uD}Ot+O#oxX$P3lSDg7;fGWN+rj{q7UNoht~yFX7DLwbLeY>6Z^2mj`3Y#0%igZ zo=?y|8!3&bM7;(PJyzz!@C~7SGUb}zIIHaKOVch{H1~4RTR`wceoJH>t;4a8;wSmv zJ*r!4(Ad5iMjwWvhV)+$(di(kHJvyJ3+n(=es-@{i|1MNPGE|z==o9 zYG2r)dQ8uAiQ=%CP5y!RyS-|Ru;f7=rrl!6kM2#-KIOVCSC6Z` zzXuVt@aY#W6?6{K`Wb@IzvcIT6&_jGWqge|1vZ|mgAE?+C;S>oH@C>LBDWQ4+pRT& zHAFlaF4O{O*+Bfz7nj3;eDhMXSTpJ?Pp05q-Mh&qm#+QV(KWtyvIx$v$GlV)G}H2= zRmOD(MeypZq-|cpReHcK`sMjaI( z$sX|3YZuR`b`a(^`n5ak%=(ZYM9E?TVq%CsSlQ@(7N&wV4P!V9*2^L^lte%*(bxpr zMGjkCaXBVR`W!%FYA%dBthQyOmoS5FUuibi=WL4<+gbYdAF?l6E!jHWrJF(uai!t- zLCx*A45S`ITuqnTAik7V0xJT*s;@%~ESUfw=I4<|w9ChXvasyq`%lADm$Se2cJYE) zAV7C&Jtep|at8SCy}6eX+xM8si9v@%E9kAhQd-|V8aSGizw^`W%Ka}h+f&r0p!VH% zUO3_D7lC81+2`JDs5N7>MkW#m$h@$;k#x^G@siwK`2*NR4hb@ywAGT=BPwmcYftvX zV)gP*&abZ+mPQ}v=g+$@y>q<-@deM#&5fXF`;=rp2VJ`G(?dUQ9YxkYzK|7m$2ITk zdAP{N^0LCX{r~Gt8d`c~t~AKEwFNv{SL|+YfogA(J}33Ep08ar9Hybnth|HpcN+Dj zJzt`qe}_`$b)FZL*N}YYfvzzm!vbYc;@vqrT^U`6HGE3$vF40YcbYpl_Bi4&Q;ul9 z*ADl-f#7G5NA$AoVWlbPun0KCgg^eSr@p7n3+?Fr50{F3N% zi|Wd&Kly?aA&BEev`O^D7*EfCwhtJ7wAoMJYz4k&X*dRo5jMp#94YxCnNNoB`1zHq zCUmkgcA?;2*#QV6rM6GIWbfQXjU#=&ZnVma;3JJK=2*=)K%CS1v`>$D z)nl}eg5xox@ZEli1Ehm%(^aOf$N#2v+-Q@kVZV5I0VQkK*LIPjw-wNpg`JKRohJPYwDCjL|+={)n*o z9*Sr}=lYEnXdDBc?8a}`LQV+X2=^fw9RPPn!HvK}gwt4cyH24^=I&gB!7bcDdLXRt%>*9JIJ@ zrKM!N3F>yqy3$+i1#6_v-+Z&?R=uFM1)~h<(d@`WarbC`sfCl%$^9UGDB?i0D6nm! z;4n3ch;e;&Z|n}O>{W$m_~ zXxYK0@GCSbK{}l+BEsTi%wfb!-v2Ib4EPlN6%!_P_naw(yipMCN$`Mof=9noaJe9u zGj>^-LiU!m2{G=ES*k<1rp^D!YetrH!-fNTUnT{&yr-ZF1iut2oulY^BW9RNsS6}p zbzM<{y{2%+2iS`jZRlROl>9^nMAVwX9Ec8n0&#A3jD6&8P76+3!$>BA>X@(RMw!JT zA}rhOm`u@7V(s6WEM-&IZHvrgU90R$R+9_UzO&ZadldH#g%tifHwcd(>B-Nz2q=M@ z8sO!W+S$Vt;ew@Zd5MLQueDng+(Q`6#o4~{z1EA{IT6ft<&z&Fw~biY*;TWLc~%u= zu*GA}mBYobS0~6~Y^Ml|Obc3;>-Dw!DikMeA~_TEFx>yJ31Zhidqp&^cI@7gg(w); zow_<7{_<7%$-1|$pDGU7A=@o#4Fw3mPU+~4W9^4b$^(*i*_=zt-0#`kSl>E7A8z&{ zdgBa>k(_qh{$-Z3qe>Ug?beTIgbwc?P&wa-5%8s%w&N#j^gC$Y@*XrrUPebHt`Afl zB;Ly~Li{<93tK&Zc4n6^x{NF?=?0#t=Cy#}yN_FI6+bzi0TH@07`fpGYZ#qvZ#wBv z=br;zcCf(58(YvB?P!}Kb5TT1GX`fabFplDxsigCn%5&f(yM8~xLl#&V{Z2;`<`N~ z4vCzB5k9e^P26>12bN_lS(sAqC2(5_mK8=2o(w4_!1iZ8e|u7O$igX;JExI;NR-p$ zj}l_P5O3i2;=9-0PIFR4`-jSRehPXx}vYvm}U1jN7 zb&6Vp1>ZK#Ohbs)K=}9WaYTf^i_q;GxyWziV|Mvv8H~~8c~tcP$Ib~U_TF)HY~qBC zlFDU&S%hvMCcS8d@cosp1=?D2NgR3DFGOx@}>6dnZYAHRGymZPDNH3_{_7xR03T z<4pF+EFDQDqo1Uo{qZ!Dh8e(+cvTqbhDssSk!HYWE6+MZWX5RFP@>yF+K~C5DEzL+m{>*_Is^^Iq zW|te_FFiGA*;jcxsG3l0%;>Q&HAZ!7?BHi%e(xJJE0!tf)GWLYaklYI4YNViog*3` zrUP*?`9^U_q1X#@u(+C=_hNhk=^n4($5-Fp;P=h*0JEiCd2}a3HuO~+b^Uf zc8NK9SVNJ&1~jYQ$dx}FH)1hA@B^6%YeY8I=sISso94KNrUDx|BdCp*au;XMQrHO$ zV0x!y#KwI+*A9egYt#qOndMrqP|h6R3YB(Rb>Mm7>8sCZLD!!Wrpt!F$tgp2A5Kat?D(T{7*BXmZulf8q z%%&htnA!}TMcDJ6jdm};f!8E|`0Vl!`cy6kww{FB-`H5tv=#n^87^$)aF<`~Yk?vY zbA`B|Kmid?w(u30{K=OQ6s7NJ;uGWBO`B<>b4(jAFJ^j^ICKw>^u zR@c^(+1i^Y^y--_hT531wj8zh@7YV1PM_Hyqtz=KX#cYvTBf`)LR`DSS7>;5mnk(B z)gX6&cR<(z$gX zy=1`e{5Od%+5&}dU`&aj&KpIVWY1i~m2xB}BkQq9*Ci@wAt{lAG{ZvX35ay;a|_s{ z$@i8rcqIvgWaAg-PXcp@3oN-Oa;vYy)w@^JzL0j<_P|#xSaS8%2v}m9|D^Qt~A! zTj&;2Ce7+J`=P&HvalkrM>Hci{_UCjE%hGLSQ3F;<2*D{zK2#c__D;X`7KnQ@UG&E za`b(QDYLXLaXeP(F0VZeXIarx?I7OS`1)SQz>_wsn+{L+Wj*_a^g{JRJ2@qvKFUtF!fpc*RX%+}yB{*eAX?1cvWXU^dOeY7CP8-*Pl zx7t>~kyF8QeRe+u`G%ki(V{ob~60!~OE*lo%}ZqyAdyN-Cl zlf749Vj?tA{1BY$oxlx1&&u%PRj< zXM?+Js@pvg5a523wlngp=3Uhq-sqp;XB4v*vm5%v^^B}FT%Y?L?hL06A!As0^osIP z#77O6aDMr7`|fHaF-e~Ir4-?Lwdv>|)ywK74pMWTs$K zTQScEh8xrwQk-F`_f?T{+raS{w=?5mpG0QAPMykh0iVBgaeV-lSD~~ZzC}LjA?C={ zr_U;wS8uPfxIDcM2AC?UVqoav0sqnu-YoEnyjyxbvP$FRT-#G*0>w1#K z{c_u@r-@{$=M=~mfJY2F=o`K0I@3;3NR zKdVwOlnxFZVm&%YwsY3>Z}4jhCIn6EA(pvl?EbqXQ*l~&XY@!y61~dnK&i;}Cf{-3 zBBpx2(}-&#sge33D*QpW>8GiCP7vZB2Mp9N2Hw zb>DwN8`IsxzWynsm8f71(8sCKaW?+n1LbJ)Y2D*#EOnxw`Y|tDL=fOwc|~%)!7H_C z_vmPw05|XOI7VKouu0a6xia9JSgYvak3D$>29kF7cSCJA6o-@7_qXbo>k}A^sBZbn zxcg8w2?C;nvy=MFZDjcoSR4qO5Ena%{Vh~_3{?tvWtw? z;iFb`MIKCxcrnxay3AMUkjvIiT?{?a&E)B{#GUHi(TE17HZkpdJ{MvOVv9l8g`G%s*Xd2G=ok2a<;t(cHCPJaqTpu=`X)j$%6G)-3R6Uvb^#a zGc5E}PXeugx~cyqa}6U7L=e{kod_6WRU~YhMi8YClVlB6@%hcFaYz4I1pD2AuY@Gf z_y55>LLRSJ1nkLOO5@`R`c5NvYBW(W83Mm6SqQG8pRR~xx@Q>av9nU1(P+o;7q8@k z@x8JTvL{D2q&7`y4Ghe$z>=dg?*0`bGrZRuxS?tch7mt1@cITuEzNjXyc*CW zUGS&#(doRoh1Uv;ct zdG626o+t8b6av{SjcpCDyTI=BD9F)qpe?7Nv2s8dZ5t+WIdoBbpRc zKUK1Uv(l_mK$?jHV}yg}!Wp|~(Vxv&4&8OxU5?{)9pvuaH5$f}?N$wGuiW|N9Nwcs zU&Hdzo62J$kK6SML%z!Cy=w|@OJy~572q6la&9VEcl2wz`^(CT+2$ECCIiWyOS0xN zqsRXU#yi*hWkKA^2|J4F84REQr>mg}SQz_iNALd|03y6DcT;dJ^j8|rSGHVIuk2G! z=Sby=zRkrzVW?bkMJHXOF+i1uhZ)^ z1oWQq;}daAWKej5vg{g>6dIO%%NuyHW#bpQEsrv3d*sVbOBycqg6>G6QN^L7Q_z`m zl@jy~hqv7OH>n%5AgB`p=`;+blAHf?wDIZRK;8}RDEEiMs`oLj6#-AU5aa5#S96ZV zvRb;5&e~3YIa^PJn@cUH!JwQ~FM~0nOr#5MIa{A9RGch6;-d!fS}ZQG>%BR@%#qzg z@k_i~aX<9f&am^j7yNl`>qdxAZ%o&|*AeS(Kg8RP%IQ7*Q9)4FJJ0b3443kgQzzcu zaLT((JNC3Yv#fV`z?0u|6?J+??f#l?iLDv9vfoaB|JnLq4)ue(XddZCXi!;6du;_~ zFB)bP&A2u6zt1GJChg2eKp8WCbnkN!rPcUg(>VMG+ZaHQ=u(o~7Xsf43jaxskk2DR z{yM8`18KOFm0GCE{pD`ID+W4!Xsy)UZ?-dN zHMdB@Z9)|#Xcilb#n4y5N=m^-H_R&h=hWUGRff8vCs1@zDf( zow3%mZ*R0Y-$>iY_nmf$kHhS}E|$>F;)ZS)SCud_zXjZ3a(u)}zEkp<3Oj@S`j@fw zUS(xAxwUC4!lqh|7Ty2y_6G_`o`b-pm- z$#mAMyW)zw+@=29=A3QoE*YPgv#ivc3$k?_4YATf;pWOdhc8`Z^+(}WE5zsjx%S60N&uVh^AKSX&zoi33k;T#BiK6V>GFV*6P^4QGwyx1 zsS(2ubtZt{w*^0Sl&YD~)h+FJy?KmjP4C++?Pt8BX({~sV7c`7oPW2@Wf#w-sEL3L z(*YJlS~r5GL>1$3mSb8yXbE#|O5$9~aA{0W^aLtYBs)$dw-Hnh}DI#*Ir27O%|cNdJ^f(vNJv$I!#>&K|TsC29eMB z*$2lQrkp~Kr&3hj*tPB?tj3iB02 zo@VCTcBDJWA-dh~QzsDeT_O&vL=j_}Yo24D;wtv*Cl0KXPdl3W-(BH7ygK>diZkQz(lD?-dt&HTdPGV&39&)cLyo{s-tP;%}C;ZCIqO3Vw`>$_<_-)Jse9vC1a~2+_#> z_gLB!@k%ruEkbofMO2=~|5IpDv<~&Xf*ax8e_TFk$Anw(=mt-7pZ%E_{Wa%P(^=Eb zS%)*pt)W&0TaPsy8R{ReS$@q~1O5Y3htjs3=Sx?0ovB%r&|ef`+4WUznUmJ7erD{Q zEiQ{qakm(VWR-?XTB>uZ7H*9gyNQ``sqpgI3yEG#)h*0b0hhuF9oW?{)@UF84}&!5 z-e%j_0vi;t#hV`epcleHr5g_2UPYj12Rt>NTI*$X6?J7ENxB_;)_3uYFV}T4MxM4B z+vb`z9pra+5W~R3yP?ih;6WZ~t%EVYQh*Zc3oURJcy7$~>IQ7{P2m|6uXYzwMkKyJ z*C+5$-_@W@Sc9BvyH9eJntQIvVQI}PTQCNRzH;wGu^}-Q?DR;6rf=FAbOtC8MK`F? zmYm`3u_6yXtg`V?%G#MezHO1>Heww68>o7*5vqA!yYiw&=w^1-b&z@|kG+l4=Hg1n z5YvbQNyTz-+V9Nx?ymQ(T)VZ~rg1~6F8Bq_HM);oOsbDi^yZi2y{E*)J}g9?+u{@~ zGT9oN!rwm8sthkYj=2|HhW?56qw7U7Lg~LdH!aNI=$gx!fgN>ChK_AASf_l-%mV&C zn093$N7BMG2&=0BjG29DRw=Q2G~L$~r=2-1`6Du$6y3`Ie$5Ik>JK1B>S*u!YHlui zbYlLnB+R6u%8pA%YFPTwtXlEft+m>0L^>bNxl z49_E4&U|LEA_Do%uxnwGzhjGmqHJf$|%|XoR=i zUm77x?sht+T`D=PEO)X*-;GA>1oDNsTVJ^SP54i8H51Dv)mx_U%M^_0BQx{eos2^< zDc@8u%Ed$x>YNhhNY@h2JG?*2!WtS@Zs}|Mpgwz*Y{>umuwDFw(3|ijzM}O+g;if;E)Cv(lFW zffR!f5wG68Yud!kKRLa#+Zt*i?KyEi@SI`Zx|CvUwA-C!InKrRH6>PQi^^l&m(WFn zh!5OVu(Uz%eb3g_W-zC^mS(7{NB(lh_0HN^qw&NaNn&`Hhf9*AvnYQvQ9xawC%M}#ITcpuMNmo<%E2qxWIO7hjqw(>w0 z{=mCRAYUX?`Df6r%LhDAvxO+vw-oXbY7+Jr-Na`{*bYR>D{94HoFXin_Pe_94LPu% z2$HdoGp2&u)ydZ4PIr=Czjco2wrV5AF5xn@3tq8E*YBkr;mm$=J{hdPA5QZpMY|_Z zcJdn{;n1yI*9_k5o-U?DFsqE1M$78z3ml*A+2apCEBDmeP+}g@-u7gr^rDb_Gs`0} zbl!SPPpqbK_C>5lMp_1S z;(fr&)3S{o{2(ahdKM$8wzG0yD-qC{3AP^Kh`l2L5d{2Z!+qcQm6}D9xq! z+F(^?In3!!2-9`N$DF0i5)a{1QKI94-%Q4x&H<-^U5_L2B2|=AdDq(dV`it9P}5O9zzKeDhi^fb_xFQT!JBzU^EAf0D1I5x z@v@^!#as`4tPell1DfoTO}qr_+RsIQ_x(*JdeXtB`s^A}G-HDU9Y+A)@O1|6)gP26 zb~a#eka6Y(mzNE0jb8t^KIoXkjfgsc-6`xz(VCL!t2bKZ;_ZSHyWoZzEgtn(T?e-~ z^96p+eLezT66mbk9dQTB&sXWsqE~ioP)gFVRt!uQw_VMq2JcyMc%uBBgCB}`Icu>1 z8Hup3JCcdX4{1Aggq4lu!LI+q)mw)(8Mte}8!?77NXIAvMI@wal!8TwfdK;r!9Yq% zVxv(h1qBrtAp)Y3ib!mL0s<1!xlxWDBL|E3dp+lT-#NeUzxUd%YrEch;(qS?eq^RC zn{K9dXy^sC>%5AV~yv|mLhZ>Vi)Hc?)2=n?W)F^4Zo!vcpts@|mgI17` zY8ExskC9Ai4ZB{*{m$kH_L3)rB8`Xh&PE*Pat(u1){JgfpNBNMZDaL)g)&b?cRg;3 zOKV!#F=&nyVK6KO&2JutCIzR^d8gh|2)2yi+_fQ5wnJu`RnSG$w z9YXouaVyM}*hDfAL`@jz?PcMg#h!wwa1i+;tOXtp?poT42u4tLMxoz6F{A7r6K(*6 z9x5L+2)-Nf^hEU#A2qU1IkwF||A4G8Z=CxLRIoN>w~dnl6>(?;AfN;`h%iRA2>2~i8M67QLL%VPu%8soMLG428v%e+RVZ2dhUf6KS7vNld66IT9 zN=|iCeiKZy6YDak>SEEj8{N2u$gb4CoK|QWwqMlbbyW`wIN;a;tRi|4Mc+{`Lj5e@ zipGo^{_C!iov95#Z=?a4$z)mGJ^Yl(269~X5q(Zv3=D$)D-v@0!%ZzW{@5LK=A8n{NO~*oZ($kXdu`9_5}E757l&7eT~|1CpYnH1Bk7c@e7 zGkR##r)di)RkYzJ;V4KXvr>`d*m!BNte(HIW7^bJ)_M_po zcf(bmR`;xJ(bdF3Ycec#^fpL1bQf zGJqC!+db^^lxP2$WrL`n`}cRyOuEs+@)MV1zLB1O94E?CqNf9S;FHw#sU3($NTpN0Zb?MjM$jyo`mjKdlv}2VL&*ViKsVVmk1$10w?H%5d zU*U!^YzfHor0!?U+>Y{B6D|sl=Y0}YbcfsC7elXX031h1(S7sR!1f{o>eJ`7hTr~A zXo8c8JU=$2L4F*+*}MW3mAk9KRBwGnqVJK=;N_xn;B_7#jjxtl2m@apCVgHR6!=Nf zW=^pF?Jw>5b&ZW*Yml}x61+HFG%@z7_5v@vNOCN`hi#HWYhX5PGG+|&*AWPA@a*-# ziw05Kt6jNiC+YzIxV%bvvBM}FKJSmu27=WcRk7(4Nte8vyyo_ANn3%_98Y4yu#cbp8e(8pwpb4-nh{kj2X z?SuXx;M+XRdIe}=q5qe)Pvp)+uFbTilRZN-gGf~r`RB%)7jmQh^Dci{v?A@QqqpyE zrXHY+HW|Zs{g`%PCze=tStZzg5S0BNBbI-Fk-$9gYx+9=C`IPFpji_-zX!U!p&o## zW$$V2DfA3E-D(#?(q)qL_KdEDTIa-Q>Ko{i!$rk0Q5<`SJx?1upx9d`L=e-cKb7< zX)(5m&@nzRE77qZc6=<`7fU9Lc}bLmGspU7Jz}x~9#&WWfERQdbm{e)_?l$M9cQ@G zLFPI-(&;kPtP)O4dfEUxzg@#?j^4+(>ypqx5<(DdpTjBJ-=f^!KXBH^qEV2G2|(0m zqqVU+56nzRE$l>Yv{r!h#kj-$NgFPFFhM{JTI^`ST%6fzx-my`~ zng%T_1j9TQs(<-J?V!_2M*4@k+y`M%wb;~Jkq3Kgka{Qy3DUdN0p(J-?EHr6LH37F ze7n$aY??D^7JtE4a&7`j4`c0yX`q;P!@(%{3+cll9Jt=0VDyyN;0lggDuE0QVj_=J ztk>h0fp8jny(_o|odCxtusxN2AMT$f=1Gp?XB#tHFW|?6_bOGba;@W1s>+i3icJA)Ipw?uY?8|Y-%6C_9gxUaz^#atGFz&BZ0*E`B$ zAp;m`T*~Lr8|%2ziU%@Rg6zd+v2hS@D9;5>z`1<&zKNXgo3B4ZLF(S=(HVq4^CWEA z-Syl^p=T840`*lol;teG$(Bu{vaDLlMp#1@(#y}f+86qJAE&>5Z99&ezl8kuy882- zsD11!PSi&AToLxdAuY4X&xlXlHU9(;|C@8*o2e?s=pGJ-6R`*lwyKyCUOY`sOVHvl zKHgG451fJc(Xj=_c+N$molzwfeaDF>_SeiJnp9m$&6I{gmGQhX7McXGjrZ8!N-DcJm|T)#IGL`4zgQS zW>2%^5n&fwA-+#?)5~YZ{g{$(ERPMB`0vwihr<36NXgGHJ!mK9#R8wNZUvC3Cor{a(_{t4*yy=A2RJ>w(~Pxap1KI85NAMLKiUm8}1Ip7o5Yq>txIjRV&6 zT9ry_t_!Xw#7uhq&?}Q1#(prEr!l^))#5UZZ~K=kaZ#cP;(iK-E@S)u-3xMucrUNB zKA`Di=Sf6(B>q(NRm68JVnHR2bfM=Gaz*v!{a>9#FKHjR&c^urB)_cI%7OM!7V;;2 zWFmLq;r-MS&G;&?u1$)Wu5KC+XxcI)u5!DxBBjEpSOr)pg0O`8%f?GV_Q3CFc`|Tk zC)`S(K`!bA+^Dd;uS>RP+%ZQOh1ibt>Wh%vjm^9AhJb|~0IR5s$fk$caI;m4j<_X$ z+t{SBxhxMY?LW>{6QjkBqgMdYE+nM>0g^bmpi4kWPK)kWH6r9w2Zd7H^-gugYy5Xg z;V8?6LTtE3T%(so(+%EneGC|@!5_8aMUEQ^fwG_RA`T9PY)%&XNW|dXsA~R+-(w@6 zxcO7G%wpy7#S2(vbS6hit$zi5m9N-Q1f#gY;%QRuf)%H7Q*F_Zbhbo3vG)fk`eTd+ zGb(JG5_#5M&yqpX#uz&sR*vOUWeorYn*TFP_%{+`+i#~5LM^d8X~(5%4ec`4^Nhiv5NHK$i92k zP&hxd$JV@tLt~q4uki$7OfJLI0tw<^ETI989ZLz1znix}wi%H@a1k!=kgf=MLH(iQLi#X|pQ&{Aj{wRTc)_XI z&y>Es)99kBV!c50|1Fk8G5%_jKF*r772YrQ!!q9k!3L6~z=ZHD5S(Z~m5xrTZpc8U zz@k>gHczpI$4yLtRyn$S_f7O;`7s<3-BL#IYvQqq{-g-&Lxjtviw>K-J=M}(wzJ}K zS)`0k79Wm}QjeZ(d4?>Z%H*46*N^%$S+lsg8v>g{kg8l=!kE<}PDv&7m^l<|EGi*Q zc8%WM_m_F#ny%q?dD%|lS*rgL?h7BSq74n8qrc`Pndxt~kfX6_EE$Dya&*vXs}*?S z@|PoAgvnP7cc|eq){Bi2?a8w|m`Zt%IW2BJMy+X*1g3l;v9H)RD2i%&**{}WcI0^z zh7WIes2tM0p$T?DPar|Y{h~ii;Jjl(zD%Q8Y!^fdIk~=P+@3lFtZ$?)K%@*9{e0UE z{uCMEIKL^;$`QNgIlZFcx1?O@!Rf%j;>q#g3QQ%$C{BIEwK?kRUT>ah)C5Zq3tz*| zbTSYJih@K}6d`afs975F*BrngpM?cYi;vge6@qjZ`>D(V-I(VIBN3|p5*NjtUY?Z+ zEZ$hfKSp;;C_(cas|!f}H6@GggLV zTYQ#1(txL;rf-7!OjBeo_qVW){r0Zdh8q)4n+yT0ZTpr)fAEs&siRnsJ6%f^mBTnr ze?7W}?hW8=J@aku_g*D9KZHKJ*u;7T_PrIj9Y}j`NYTp(CMp~|GxsM^y69$k+nxxf4DcT3QnbBqhGS|~^vAwBT;K}Io@etqd=7dTlCNnfp z`)_OAvsdBZJcuifLf{>~29fOm^xvT+*pgV5{G|YVRj5;#97Hv8Ws}co5V&`T#nr`g z2CFQ7MdW)9C*~&tEauZzjDQFxqXVIWR#(4f^yrik^ULMvXr$Gi?^EP?Hn25ELSvi7 zjut!}hpV!li~5i7nXyT(;l|t-VRI$K#!kz#`93o4WRZ%QRRLe-u82gy(T4uJ6es(E_-6 zJcYpUAd01qkSk9d=l;&rB$`}K=u1%ji^jZ+dbp*o|D4S&5q`emcp5)u^~GE-6~)J_ zG=@K85&AS|s{lNw{G_6g6Nm$74Vh__N`oCc_|S^;!x_?%&2uLCK?s3aTb!t08if!l z22{(5K+Oy~C9I8EFxX3^6BipNK^NLATe|zi%(4^{CeChpvgvmnA&(RC zmtaO$6o+KL2L#rk@7SA7M?OZfr%Ic*SCp?F;(;sx6H6#n)-oJ-?EMaORpe9LA~+b^ z;&U=sJp7+&$sS_N$GiY(Fq|bDi~y_mRavJ3A>Gf=Q9IBa%n%y1kemH)8p0BP3`ADC z2s8et1MSBIsw1b1S4`Eu{~QDOBXE{EO`GDim~9`_yB)mLCn0TXfq!vg<@AhIAoWo3W)`9ZK%)TB zX>vXa%oj80ae)&{%?XUkjcmnyz zw2rGw0@#%3iJ1WID$wUJJ#$6GkYf&K3I;a~x?Ayw06hm~!tDl&neBiN<+-OBJ_Et> zBGg6dE0TY;5+tj9?rJtVTIl7370QN|Ita{iGqpKc-LEC8juci|JHvSG@9@p+H(eju zJK8IG9mc$l%X}c$va8cZ8_$SgeCJN=QX^~0uo++M`r#Q^?}2ghp;%iAB)*Ir`oEEn zkfzECzT!Q^DzEip3Kih9+zZp-0x$-U5zn#S_jJiURrdS9-03npvfUu~MZmf-X)>p$ zPVd7>>eUrO>dUu3LD}IA@Pr)f97)qtkM7$^NBL3}IuW-pvDr~qmxE`IGnJF!Od|E` z4V>G*x&j)~a2mSZ@hf4QT)KIv()w&qv-2^&D&trW7N;pK-w(qS%jFGp)`>0I9lFLR z!sfp30^_Zs;Qrvo%{H1uMx1hA6+-fQtz#$bdC5j$xje`j{s>4s_h7YnyIl^Fum2B6 z48)E_i&kPr=8+Tb9;q!G{HRF@)*r#nNV@Bsp%_}c2TcSc?o={T-#{N zmej6Jyn@$p2&Mh~F72%%x0IJiUJCCx_wWBJY1DJ4UNzi{SyPs)x5qwU0o!+w)-X;~ zu35j$iRXXp&S7!d#+!p%b^I^adbwm=?|m*_v#Ep`rgb1tuPyuIAbRL$YYm#Cwq=Eo zu>qJx5QZzGaOG}0+40DHZ<^k{VL<3nl57_gXSuiE^y-P8K8g98YB+qN`*rI`a!!fR z^GUI4!s)sFT$q1;4^S7dK9U{4ccQe*6iBt_s5s7XBBc5tF71d^)a`N=1H}4X^bF%h zXekI2X*$(%Ls}65Uth#NG2vUcYm0kwUg}pV4q4QGdx|Qp_JAx!cwDCUP#iMut>2S( z_R#v6ToS->Dc|9aX%Y4(zbqB`ZacKs*D>>0WquyFvH8lDKquDs0CYHCeVop`Fa-o; z$hn`x(SB@9w$Tn{##tFeR7A!@AW8B@_>nJ-);C-m%I$Qscs{Hk->hzCo!9SvFJ#W(`X*kdVn=IVe!)4+GM z^ccj=zUfZ5iz=6D8(?Q2rhY@Fpn-gqG;OwGXfYGiLBXB5^}L*ikOTp+cS+wx#n}N zLcgwVly~{Gc6M>opUz#)ovs7Dq!kj@;%XYo2mB;g>uvYLqMjlv=C`K(a(ZTF=C^19 z-s-zcnp!C#LN7B6>Q!0}pg73SNg0aYNHE5Bpvw)TDc%KE%`}h#J<-sv^{II~4Lc8Swf?&gEp* z>IjaK(3Yq+bOTtLQKIUilR$>f5CTBvW;5%@ndChwTm_?Jk5F&~f;2QOei}Aw~5rfZRBR8Dc+fxS= zOz@68Zn#>A1`1(ukvAqH*=YH_)*H$_qzp1G-PP)cMYLx+ipb)9()UD?f@7cylTHo# z)U7>#P;_wKW0IF@Dk=VUu9P?9hIlV3Ug-JUF7yq9{aUWU23LW4HX;C-!7~ceZG6xo zad@$36O9Qj&+PNOapfz>keIDF!GdYnLi8|$%eFEV8tgcwetqCk(an>24ya#lrLZYCktw&oe)m#Af>EI#)Q9?PHNTD|wWBBk-I2l33f zfYe1+d}YnRuW7T?ljhtFtB6G@X6gsL`-FA;+vGjrER}4loLa|7#Bz2$M-gTrg^_j) zC?DcvD~QWusXfkLrV2677Y}A7 zFuF^bn+S$U0QXa`fRocvD(b?t+<{rFPk{iQNVC-<`t)a$%kQQna{JyAk_Brc4RWf( z=l*!h`GBm`(T6TB1Yt85gcjz@a{a{GJN8Y>f$QRn4-G<8zN}@nBJD|3m7@tOfYX7n z18~#;7~?JRXbC|HkN`eaG9mwCDzVO!9;hp(s`sN`Icg@`dRqK|uwm%5QeVfkVfjQugr6JBo))T}@2hohewCS7nAwLrIZ zBU{)Y)qH}AzY_|3uFLP`yo!2YyjyIwlI}{2*$3~4gTz&s^mXxC5Sa1|K|01!nT;VpB z`!Mqiveo`wo9kS}DS2GhjqNGE!YHW%7R?eN0sPgH)C4!D&KBi_Vx4t`dF)|a8*qq{ zY7o_nyx256gAkB!1D3ateQ;l^<<%W3Ao?5PPA?Y)eAk63xKFpO=FmHZtag{zWf$8? zJUVRamp#pbDh@&U!3mVkqOM2Mcmdf&6Z0~Tmx7i!wQhL5C4i3t@OLs{rZe;AutX!B z>)R)$NGr=`?neEd?IX2XeU<(jUQd_pZ0I{?TAK*A@bdu;lSKw0Xx_TELq(lciIO$&V+l+*vllFl?5u za|~#51RhT;AzSxX@uRj1nr7H!?1vGFKOY}c5m;6CJuN!*Y-_!})9gqR@YBtN4Wcd{ zA%UANx{IP?Gwnqn1PZxCXeK)21BB>z9g=2x{!r({Y0sQB>nw=tSM!!U~O6G0@Tmf`C1CLi)tkLxAPUw@%(PVBEP?(&6Wy^1NB z-+2d>45C3HVg0BwT7J;?I&a0Rxv9IegsX9~AqlfaMXP)%NgUDW_qzFdJuGq>>qhse z)`PrC;VGB0UmSX|Vk||s;W;qy2EBL}7pYT}?|2M_!1F(iK)?dFJ);e+4C?)RXrgF#UZbq4?6Q(czz};*gwI2}Y&K zkVi-1bB!_Hc*~B;Ezx7UbAzkOUa!qe;ulFL1f$N**A{9v>*?%-1!+!2_HTgw7nc)< zRGL>9p}9x*hCVZA{Epoqd1k{}90TWGU<(9PGo;~jP%9{*l+h9ys2G{@2Yq|~+7&@} ztlss|yFVI@?-T4=gXmTa<5T+2m-P==iUFhrPG}}|;Bll{GEM(7U9R((1IITXy}FLzVyclx zQ~i{f|A6ll9d#LxgaK6|^v2TcM*U3omWuA4+5N+7$-!1={aNvQC)}YnPkPH57A$;a zGWgyltgL9Us(8jPY@rSPQU+aGMiK(ka_z6-Wf5(tcbq?i$DZ63+z55HK=f+8t3aO)|iacpx>XG5veK3xaKO=ixZw%k=t7YYe9;lJ@d_(|hz_=zk*# zr_<0$D@nkY_KVca2-92iU>3Xg`w~Vp(?aa24ON@L*9yFD*1Igl0>p$tPRw>+tz)c4 z=V7VtCq1n0k#0^Wcx5_9v|G5@zVMV;*eZ&efVYDMX`_I!FJ0 zJMJXeCr3h#tl%8L;pF?zOKNl@9|Ozl-$2d2t7KBC=hq;m7Pf)%_ewxxPA^f%I=<9z>DVW+q!*3oy%zA z^xUIvj+s$FQjIli2&zJeIJe(^kw3!FrR|AzpN=fc6zWC%q=wErQ;(ekR|aDrSapKy z%I#XcP07=E7mZH)y5BI!r)4U~6aIl_BmS*%@`>bkpZkb6%~X`s6|mu5J*1%-BSdn} zeXPi)9~D(*W6+smE`@&eff-q|RlI9PC`FXq@lo!%$qA%XL2oV?Jb4Y| z-VqEbyz>(C!oDk>hb1$KB;X^q*l2gT-e!kX>|bvvE5mXSwa2KrBg@8mj2A>ulZyKl zQ+V(rUXm5&$6SLJ_l#RLlq9K$=v3v>@6de zsT#B7db4M4ms_1#V1p6H)UNB=<+B5wg&f#eERw#(3jfj9{nV27$BNU|Z zJIug-;5Fd>2Wa#(M?#c>+lILbsqm;ge~A^f7!#6O4`>a(&(|lM1K>ilI(7E3yiU zI(vJ#K1}=A#S&U2IzZxAk-R^wlx_8OdJ6AviYlx`2|8*02o<+*2NV*Ti-dSP74AM* zNdxaEmw!&K(Tbw;kx!&-UnSnEPEvDF^7uI`T}h5>;g zzGAr)w;O+oJKT~6tKt{HeLf{!9rM0f{_NBJ){32bgvB@O=tA`koTa!z-$SBQ1!A?R z$esIKa|warR|Rdn+|?@GsmEg6S8gfQU~PcQJqX-L)`|x9?uDMwo()Ug1^9}Jthv`> zyel4Ldeo~OgcA05g}qt(OfCB=6UJkm12^U*_`_P-I6UQEvE_et`KW-U*eIXBSx|KgM*=H3T{^%vYG7tI$Lf~BSDHfxpY`S zCP*aVv#Zm#EL8f_yZiUj0W0O`#d(wVs#3GeSkl1!YT6;~>~^{FI4vgQJjA$;G?-QgznY+z}%G#~pDB^8|Xp%EcIq|4OyKfnSc8LpOqTb8!h% z;XZeO551gCqzw?d8{zQpb953D9S8+B!MiD1KOO#Cucq~N>LP;pYhRWjigbJ%Ll7E;C8q8$=3HRJ1c$%6 zE`Qt*r(z2k7&U>{iWi-kF>CFA9vWXnmhty>;-!2gPmNZaG@W_sow81XAhK8BvpI37 zls4Fr6l7D-wQ+w{$#X59I+F0({Y8TG7e>kfeNa+aBA|?G4()vsa$dJRsZbYR zfO*AcyMMfa0-=k$#Ac$f1_5yWJGZqmq32bQ=7a$){`ey&0LbUG&o7%<4L^5HqW3y5 zHRf$7F_Apkz#5qJXHO>{=Cv9U-)1tfvw%E0gS|XWMD!rGCI9gmn9ohGgKLmP0c`(q z`);IEbQ^jv%CAwf7qD*I^?YH;L2JgRCh^iTP)R!xa{OBCzK8Yy!hLxs=stB2&q#eC zHbN5we$z?aX2s2=sW;Cj+oFSqyul3 z+{E6*VD(d>8ob*KmQ}H~ujRVi(qi9P=WrrdCL$;o%PrAD5hQD$s|I0~1GNQYSNDy= zGdx_D4_l_ni4ERN;KkQ!q5g{OMXbF{I*AQN2Zha1vP`=UI9s8nQmXocHBa$3EJux+ zt>I0rSfd?#T~S+c&O*Fh|Gux>Dg zGQE=wtZ(6pG3W+KVC5GYeU>?+sLibZH)cQIg}&H=Y)fxLdp-}FUMyogc#ya_v0|`i z44}*WcZWCgz30SSrFlUQ(CcL+>rnL1fAfZ5+L)N@iLCMbp7Y^jU8_W|2(tYy z2Ryb(Nq3!0V>1@tF99 z4}fJ4`g~uy*|iNGd{Y31hc$AHiV1dch?RWRiVT^%ge%Np;W%L7*M%L>TKVVsn5N6( ze2Rzq`<$5^Y8$;8%&Q52%Q-qS?yDqlE&&|V-T8~%JNjk?l%~cX$ALT2vPe~O4&m9I zV=u)3dt3Zbqht%4qgpq+l79oDNy>eXf7@mPu6d>b?|JoObM#1a`!YuHV+P^w&7tqY z#eptptn-5g4nhBET2QWw>%Kai^Jdf*wzqPHJxxp`-oYg7t0~ZUtYx`$?yuvqKl|Ay zdOM^X`cC&Ov9_znB2e5`Xk6y2Fe{obA8E4mjd$BPW*zeSx-_S`>52!{Y=W24_iA`W zy`--dA@n()RYQWAbLSwMk-3KN*q-0sDqgA{DR$CL5RRhYhFLIv$~T6mHiPrws1vfL zpTs7GPwnG=8j%dXkf-`YSm?>e7LNq{1+?CT?6TZqYo#~ygd!_;Pwu{sLlfY5v-W%# zOp>lH<{6f*_ie7zFj>txyqNqKpxq7c>2Y@97zHgdwOFXxodAOCCOSci^EkieaoF4C@b-hXrl>2~ zn4W-j|2xVekNb>I=#lIO^A|0Lq3thqbp*#MLbwNE)k01$*sCe(_Y9UC-l@woA zl;`9-h1s|<7gn=bVVrb;Nn-#5$6#iRQ#HsoSoYEp*^O&@9IlV(s0(u}56K+kz32}Z zv=I6ucM@=*a`w$+L}F{s+u3KwcKHmVM(b`2IirmIzSiKQoJ4#cctH!BFL%`42(d4t z^GUK1Fz!yrzd^~#lEBCCM9BO{k^Mc681k^rU(Jwk2U*rQwVgcM`hUlD@ezj0~h^A(bD?^4<@mOXNjoD*5@ zzz~ADAzQdTxO%KwZ$;@eF6?K1X_)OsD>8al&_;G*U&{)h2qG#wHZ`b+k#z^If2QlT zo8}sGD?5NALv=K=Z#V$?yC5Qi2RmZT{)(!?It~!td%$-8h|LFoIZiK1<}hR@FeL>8 zU%Fk8#`L>hVP2qDj)Nz1j1|wHm6d$=myn{ZS>9(Eb+s|DK+g=h`sFy}S?jq*I6V#W z&YRhF`1B#i$R0$UC-=hVa^{JPn9KQIxO0s_zX%@wZCq{Xo+RYiuxmq7Cx>JpqnD1h zfp7Gf)rDl%MjHQs#Mj-nAVziYBFKuoZYrA`(NdgkUEvSxxt?kYkn?`?F`@vU%X@~Fb*aDruv zUptL}%^REZ#Zcu4INkXok(ECtZ|4 zcBOg9L$kCQg(CtO^^J|fHX`?(+rFq&^*O>xh!}9c1qbp^e3+rTx4{*UK*Oh_K-GE~ z1>AUsOKmw5B`0E7$JnQhB?b+A<6aBbhH-=^ZP=ZTwI z9gSUR_{zIIsrmS8@d_+ypllV1k9F$-_RT(!&cW0x_(o24zR`gGbQ5!=BvB^D5d_}YPUE7H&u(O?!vQ&4J>Ha!kt;|{KI{QmwKVi&6l1-6gl-_Z#T)C^g=gr9SsesETND}479vk zL-byE@eCl%zPEA32Ptqw40zV8Bu-XgpdVs?2yGm$oUJ8C;shQ7?E>*C3B5kMLfj`= zz+lB399IWmYZ((}a5_r43Q12nfQO1|~*YOFqstWTA|w>aSYf7c+6xkE~9PB3nx?R)=pn zFt{l;A5w0L#DzCZGEW*x*XneL$?AV0x^StrGsU`FaTuFC6z@gq$z@ zkR<6<ZtWL}YO zhCrhIofxg|c+q=P5`9`1_$d#L@m&oo`1EyuFKW|Qm{Z7!J3dp5XN;%jH!gnw{uJst zPdL~D=li%w7L4{{$eND+<_ifPBPn2}h*c@o=Fn%)B_fGL=cAx@8wOZRpHYLOHZN-L z8yQus6@hlre-$7z=Cwe>vtjhz7TgwhRHTFksVFNB>TnV&HV%5@3tw{=YB4z?E^#x? ztrsvY;+%Xf(SP}}OBz$?{?D@_m}&_?+fs;$wG+6Ra5*tN3ndmcfDzy<@1j2w3I99i zmiFlO`lmG?1PBFYsRCZ@VJ_fWQX|%XS2_+&PZj;c+}g|UZTL+^ecWJu{>p|uBIxHy zyQ8;Rx#A-prXM{3CUzpJxsT@-Alz%R?VpTSE-9dA!e53G9hWeMTWC0x9^o(A18|YZ zKQ112;*vSqjMe{{s(t>d$iW+SV(Bsd{n}}0;3`swD!LxP!dmwiMN0h=gywafJ zKEJgufceeYQl?(}Idd^!?Vo)u*Bk+LqMJ$vi0k*DfJ z1YQ*Cmg~WZ62T(8 zaEeFBZ8Lp{lL+Pt|7r;KJ=u3SL4Mouf_TVTvl722?KpMryVs4v=koEe$TgN8;CrhE z;WffSMLvbEMa17jk^1LJ67^AyP}4&84V;9oPJAB z;ErZ~HDm#;p(FM)xy}Aftw*l8fGQCq|K2pI#%67%@fG!1tTdB+T%2$F9_Wg^-@6-~ z`xOztOC>n?=`2s2`Od~Fh0j7mJ?N>nE}PCnbZo3loq=Lg*u_s+&ypwEtTF|B4>|04 z1)W78*~TF-CSuW>);r!~xf&OWd%rnMhm-6Fo)}&wtQim)nvcbSz`uYga4G;l z_>66rjq|Uz7nIiiddNTEGh*NpGrI?2)4-j3aubnFlUo3W#&z9}in|w|1ea|%4)Np4 zdc{(L{SKimy72AV@{+qKx3zr7&C~@YjQZo0XuHsM?zS$Z7+Gz`{~n?LtILOS`3WER zXiTB0v+IpBH1h37&KY02wwq+(-x}OD((foi`YeuISA}2Q-+?>%XihS zxk+%2WiEHz+?7SY>A>EK|GLp+A9vG9lYY*bJa9Uu@wa zs`5PSezZqhBDu_hal#}XmQrQ+3Hl-bIwZC^#ExCIe(nkI2cZ25RZYYZ^VH$S9IR(AjL&}v69RNgi^BSPzfL!Hj#V1>Ib~j!EP^9^s`hcXPaRKM9Xc{sZbJ8ts#gOw&vHd08tqO&u)M2WO-IfxioTx* z`X6VzOKd>H2-d%v8%l#@C(9^=&u)lltci@B^8LruzG@hm&$lNc-EO&Yt~z^9?%s`Y zN)zDJyzggc>)m`y@1SoGIfDPD)^{~*H}}sRqC|=_lOTgge_5I~mFQ@_6$Z5+9a?jY z6tOI`F$Vbe07;1@bYn2LR(I?H5K*(8ls|z{h!nNo+mZLdQOTRFcH!;_up+; zT3(v@ZX(N(gj6dI&x92-N*?bqixo5d_={4N0FRsN!JYH8Q>2KawJM>PPYWq6Z^nPFuhorlh+xq8QP|!=7 z4h0-*q%vMc#bm@mMu-eh1MeH}`QSoLZmv@S3%S&Mw=|bp==Dp)J&{;#?AFkByCTWC zpeOpAwj`%DUmKeFVudYP} zbs1-XUIC!=DWtOvDE^8E($9kH(g#*<+RgzVx(~~UOuJkzL{_^!PFj9D8oyr} zpcZS^#gR>y`?~wl^U%hZpBG%dYWzj8T$FiBu#Vu&UwHS;cq}AR2Skq@V2~8%qg**+ zgicC3=3&5U_tCu2lG%ylsq|d@k!3~r8hTj8Bvi$=Swj^FO!H!Is`r0XF?;>(GWAmz zQmS7rzMU?4=K`>fBt*oWd&n&(kEroS=FO(|3OjeKDB6BXqb~P z6=oPq-oE_M?OspoS$PeM9z@%1ZK3loAy)DnK1Bf)4lRAAfK7E>zEs4wSfJkF5xg~3 z1x_JfGA@XZA?i$9#k91iLHoK*r)B`F3q#^8#nHTeyYrPLAZ6T~>2Z_EcZ3mn`LwJb z6J%j`0gjJwdsm!G%nnoag?A-@vR^>Dwn@lB+#&t2M{$rr&?0|#<)n0oLx?t@I*%^j z6nx5G-U`e;{p4P_Pw5c}|>qzPY*9p)Rz>FtW)h9k5RK z%|i+7JPSpt1GNsbURvj`!umcJh|GkN7lVUgynllfE*CR&j_BfJzHb+2@1@W+Z=$Wm zVR9Bxj!=)ERgjwayW_vJH*RHicE&UwugJfx+ws+kk^E&wRog}X((M1k)mO(g_5J^E z#6TpK?odEU>5|c)NGVE4ij;t~AhjV#D5)Y!2#8W5Ee!*a5R{Pac7(8z+hE)MT|e>t ze&4^pE{}1yd+s^s73UStrvN7_w*8hMtMPuXjjFW}Z{eVmz)j7R{U=fBze(|9ZV)o2 z_;mJ7)DgIt5in#x_rsS*!Ah-l%**l#*$AID2Vt07?7DkiHUyGUZMa>-AG~f6|4B&r z)s?S~&0l5tfSlJ1!GXTih8sMLqppH}5xMl|h1m(q`%zAoJ;x&_+65lxb=8jqybwhf z2Tt%)g{DrEX^3LiBE6%lD?pGU#D#CF%!`YC09AK7ibdQsl~sG3u(udV#%;wu8*9vS5SObDoL^+SezbrDEqVe9sW5kNf zfp!zI*wm4L^nwlFTHr?rD}(`EmuLLOyndYWWkmnXn)YP)>~h~LvIz*x-^FZESEtkPa z1_a;IjGSCOFnl$NvLavfIJ>0v6*25I65IaLg+3RwNxYxr^-L%L$D4s=xnao&HkA|9 z$r*-9(nDYDP&!>40h>3$ip0j2>p@-wZbT2zkqvtfkLHBPKEtvC1( z^fZ@l62)(3PkIV1+AWET7CtfIb)y2aIS{;_e%rS&P2AY46j#X$3r^6Ngv+|SEk<^6 z+d|w%18?`>BGz`)=}$EdB#cv3OM3r|8#zrP0kH=Y%$!*RSg73feQVwRCtx)W`Qo|8 zGk`FKdNVb7uW}D%NB*d(ye_Z`+Qct}MXMTCBNia_cCT|rpZVVwGlUb$AX*t*zJ1r< zAPhd5>BH0`HH@w$x|90|k-CrXgAw5d13wqI13O|~rPJq})(dudcSJlBsqlPwhco?* zdME$Yhb>NIj0bthbWUvtC1ccalUfw=fXPg78E$y|{vAUd-!YVDRI&CD69m`mk5juiYlb_b(oU4z8L8zNJgvr*rvoHsO&%eowTNH{ty>eF`Qz&R#K z?y1{`j$3;O4AN(D*rZC_*pG7W`09z|ESK^&t^=2dSa`UhlmsZULGT{GIBQo+1|d}s zA3Qej&>30Fiu+CUI$7us(l8<972VN-tT;C8Dl&|Y18Nk^Dcl@T$kOLaN;8i_V`jCc z)nCZP<0sd>xQi%7S4xYCl`8^qoXfur$E$CR=jBwK4{g80#kfTU-A1WJVz!ar@V+#> z)Css4#rJ{dWX|f1G)2dMqIf0t#8staP*_ED%HuvUBnBX@QAw&PV`yA!D znLI=ag%tRiOS35N3>Y~+A^_R}6dbwP{;Y{lpYuY%(kfN5Jnsk9>9*_d5&jQ*<}+@o zWcGvKg!vJ_YU7qy2!IDqO^uLob^`Jf9#NOVaWa0490}H3|EU}*<(v&P#PIK>svYk= za|z`~yL-@=OK6@;?ifiL+jGU2E8_&lT9tJpv39(9d}pGS=w>Kr1CN!ec69DPX|}rn zndR|gElgTzm&CiP8hM;ygsZrlMau*D7Z>%F>4f_k<|)4w06NnV(gjuiYcm!ewgrc#ZC&F%cMp0O2QGn`3W-|IC69^B3f3}NLTtgM7CD>b zTeB$2HXj>`+p)Czl;kA8p?v_20X$wyWBI{wo`) z(*6{308WuS8Hczrcg~(^*Wx1j_sI~<37r3Jgk$ZA#{2sMt#FIvZ%e32BqD(|8Th!L zHw&W~VH#Tls<&k0x`y$NnimEp6xb#Fs;><+vr&8TUZ~!1R*0*Vr_m^3bW{;nz1Rez zv35+xw<#@&D0*wgFm`E#*Uf^+ZYe(Ud#w=vde{jk+!I9LbX za1(XEfstZOAPVL0%|OPPj64E;v)_5$S6zt%in~|3uRcM@6GLiAW?vi@TVQ~-#JR=s zU(kcg6KX6A(n- zA0Yz4Jx>dMpekYkQM8gIM-Py71~P2zSYBB+hR`pW4L!Y{8Wz*Er?+%2?5&8$qYDeQ zt&J~<=q50Td$268%BkWiwJ*mcI6SV;p&_6KoK z+jqkql}l3~Aeacf#^}J2{vgm#5IAcX=0fAQiO-W)&X+2oe8ty(}dHoGSW?J8)ezmCK*8LU;YF z&b_XC{!i4l)4PROjq1eA?+A*Y*-KSik~-V5^}bAcKlCShG0%`wEip%MNI;;&*T|)J zu90c+DIS+{cZx|)0kl^1MmOtiEg&xUvROv%V>V$AyM#8i?ZaVrCvGU#uzuJ&Jje;P zUv}KR$YUh@6yF_WvWki%7e6jKr~sDUC1-ez-VTaIT$yP0KbiLIOzvz#W{#2oxqUGmV}|SFRqCe2-dA#Z!O9@w)C1`YDbCg5~Py#ZyTP5{Y)% z{3V}UjpNw(ZUyBOgo6h@DN0DO`x~%r(IjRt4q0S4Us36anPmQ*2Vgh>)r;xHFo)hA zmt}0|8{*g%!nNk{Y~`2L~;g_7a`oE91|j4PRictmw4 z7i36*AVyq~p97Zss90{Cz-*|Ci0E2@fl6$n z`3P`I;Jk$(g*@aZW7NCvQ_Pm9ZwLF~!b3&NdF|Qz()2$2i+Z$RLF?asI#AMj-V@@x z`tXjCI`SoM@x{tmQKHd$Y+mF8!f)!wH`}HvhGUu!`#CkIC+*L$4bm=vSS{4iVN( z*0RUqsFg9417UG&GWU?Luy`(JHS!&&;P}4KEPZab9w6ZZn{3xY@g|YyG2@7Yp>jZQX}jJb%RKaZ!-cffPtPwpmd{w{ z9JI9~DMQT-325sfG8cnWR~QIz~>J zO&ErV0_^O}CJF6$&bwsif0GtUVT+ ziy(RHDlwf-*81hoAWn}I-u4mBYjtgb*<71CIjpT9pk)3>7RVfH65NaOJTL}hOZR@G zFXhm@-=`CT0bCUx#E>+gmS+sHin`^o{#cl9YzD~ax-oQclMNZV9iQnq+=H-xvgiAT zt8c?XIor`!4a8#8P3d?RNes(Umo^7^Xt$r^Y<{@Ta4_!_F5NCUR3=C}8 zgrx#9o=XZ9EvSOoDuUyj6B_u)Aa7vpSd|r8W8j3iXbvELsp8(YiiE6Dy~dD1#*Op2 zfq8OZ2kr32TVvLS(G#+)%shMsnhX=zBU{fH{zAd$RB;zc2;BPtZWeGhMVLPlV$ zsnWWj{j4iEU_~zqY)S131ldCVaF!gf4?qNiPo0}T7oYlZ83iwze0lb~7AWAp6!oTp z4<%FesI?&5SYKt`t_G^m-QaeYq6ZuveO!eLA2nooH!R?)jKih`!fx-w5WJ`AvPaFk z?CO>%@KOvW)ZP@4v!Q;GzmRvZ0yluoz0^p_85a^hZ>j-oCjA?5;R&cB!yWA8sDVE2 zo64@O1+zPV`T;Ss2$}gg(`4Uw2cUDlCDH&L14b3P!%<6|ovS&4dDt0*9urS<>Nn$c zL}MmJlyUCKJ{;l<(SuZ_h-I<2SE6O19S@$I0v{r-B_{4UzFd!?hyC5((DFh^M^oVS zcH@oH=QSwLO@I8Oea>v!ij@=J?;qrg58qf8LZ$ojX6d2x213QxOk#v?cHH4irkD8I zA~wID+tj(LanzuSY)R!!MYH;Cep&A%JI*cfkeb=`z&pMO((F?NLnYM{88^+^W%b0<_da?pc&{*=G}y$%{sD=2 z9k^Rq=X?FqI{dzC{x;{{o3c?dD|!yJXqatAKe_?iWzFN4u9(CVX&WlCMQ-Ts}uywu>~nT6sx&G@7iUpii*u#`l| z26=H@QSa8(cy|@MA2MwS&uZ6VR(4l21@Nmtk0!YYJ7LgrP}%X;8>p zk%}v1s~%XWo_sS2lRKAxfs`MUO}$_!`-K-MvI{sAGdw!kkQf^JHKg(| zf7VAeVO&cGbEjIn2){1KnGqYep`fgGnga1`4Tn8k;K zWrnng4OBe{JC-F+!F3ck%m@2Ip{JNwj$j<}C6j`Cn2OBSax-4{?&MOY}@SbenRNzp)H?AWTuc|I40J8K&F%<_r1m zX*CS{G}7dC3QKGC`so!(Mw8fxs95nFq#t*jF!FP-wE*Y`#e+p_{5pehtX((4LWx#4 z1X|q_$3aMSh4LmsroIoIR&!EqE|Jzd=yP?Y^NWq>4OU~%oDPv+96RO$N``+m061m+ zvQQ*wR(WoytJYr2{i`wQKb_s~UDcPSjJ@wKE^#J`o%a6Yr9VvVl*n2=&gR5A?YgM( z7m(K!QAZsbSFEDeqHYGhrPV{Y@PQ?4v&>?<;W>e3xJH@=qXQWX=40dnIw$<{PCPyI zG$(L&j1hY!&h(z}Cp5WAC9U__)7}e@{Y#Q%{w*QpYB#`%`PaDq<)DmrYyVvFyPw## z>(mKY)Ac(lYXl_~gg4GV-+j1JwO--~ca0bglSkSNXQvC&zsw7uU?PtoM_^il=lwJvWdQIb3#RLTE&>e+ujHA8PO0dco2lIymy z_FEAreL1b1k36c}8l`;{>FRHBDS`HL`zAay-9BqoM}@~WoPvvv2EG0SCn&^MnQTQ< z>P8V7Cq}iIp|{u7iBLO(Jol3kxoSdHbF=EA_J1_NzR|BSgSvl<*T38vS4U;<{YU{PW835G5f zUh$qRPh9;>=K1eWaf(9zcNYIH@{FmL%8?3Rg!TjU+!a5;uLSqad@C4NDz#VC5WQL@ z2n4_a#Sdt+s_cu!Qch?7CjM2c|MD<6{xLWI7%^x-xV7r4|G&@v<@)}2AiV$IK>p9- z!eX2moG2jw_xAsM>pzzX2+u$}6#T!nD9G{g>G;~Hg3XV4&exr_dpsdv`P8a3c;M6k zuW?7vy{|pU|H3c-{p4R2b^ifGNxfhq5$X7M78dxvstz{YsK7SG4puBet6Q@N!7E&OKoNrgsbFr9bt2p901h>DMU@=$MPP$62~e3ufVFM) z;F}ppk8p-0s$zbErerDb(Xz#Ldrz#nUu3KgxsRkW(n#|%@g|M3t>Qnv zw0NhT5Q8T!8?J`_+OZ6XA;Rca>xHF(UlzNFhM~mQV102?;s5}4v zbb^Q8^}i}(_>N_@f}CmLwb4fKS!-#9ozHlIq`dld$eonc<~T>JFKkIA7XW7`2C)j? z)kK~me!{>u=P?>8{E*UJu7rBBdv-FA5%&eO)T^lPcr$QX8Ng}%AFQFhdzVig!9>6v z2=lWl2SuHUWo6DHS@Hf55I=_XyAl^>{x>rpNV28HcCQD`t%`^wBh=nOJJbq~m%vm( zC124wNC8F@T*#Y{*bvu+ey#g3!B&CI9CZ((p*!SjxSm0N@Kf;VE)U4T#7rM0vK82( z`8R^`pS8U5i6jFfhgZ17E@$|t#5)|eZOe*Abr~O#9q(Wx*Ot&DNA5RUbgzvq1zm6d zGYBv;e2MmEfMgNO1BZTm4i2eu8*a908CgCDPURp0jRbk}>bIs_Sdb^qq$}$XYC>p;ifTJS77_0X zFo%$o|BgwS_Wv%=UwJz}Is=^JpjNV@NeiS>4}N{?!X3uaqC1FHY-7a-4^9%y{{*np zvh^<@OWO#Lz0q?QyI5b^pD;Yvl9tzbKSY%ha4i!)%*u-nIh-bz;}Ey|LxV0fvmy&z zN^Uj3agpb&U@zNpZ?NUiodwsWr;d169mStk-I)CZ2=ugjU~S(=d`~|?u2kMKh{A)! zv&ukR<0+ym43ygcLswt)1<1V_xQS#l6r+MPiEmP}vEei#FY*PIwZBe+QJ#Z-c=twI z58|Gz52<$2+1Nuz(@l-Kiw}L8(S#pj5#8J2tv>f;6D?b z%x$;+zT+1)9`7~d|pi0EK&{^MWyk)qZ83op)*@M@FY*58*M;{ceExtxrGe!J5UF<>l|E^v(ztH<`D+M@BS@lDSDD=Xq3AV>1G zc<-z}mq=L#;KldeDt@D)rNtS7ik_1`k%Q0O`cl#sW}7JU0P71*?%vRQA5bmtF^yP6pIPArS$Lc3A7&4NtP60uuf89LLo=M?|oWIBd$(e{hq}Fw@_|^#DveL}30;#NE2#O(m4u1tHswewTNS_! zJP%#g3Iq@Kx6k2C5|yojg`^x`83 z$bFEzso254l|t(j#MGidJ2foRkTEp5>3anYP=$KNOJi-$IPdOKFSbdxr@*hXfV|LW z`d?HRPW5-3IDNY~zUNJ`q+3H}%~M4dh8$Ynqo>`gEJcA)LC?#6?5}k#rB|5U(~Iz^fti~`n(K(||_r>!gxTP%EZEWOdHI4({~h6f^SQSoR*>)qvm)kt?5v|hf z_*;NyeU&d~;PruepSnB7KlOy4RNv6aECmXAUlUUYuqK4vdhk0!w z9bZWZV`&%3>iIPZg&VC}i%e;OFK)#+lp4GbiNz=fwT*oFR`A9{d)D}=Hxua{d=w{f z7@5oWjVymICD&kDaHmI9|Cfld&ij-Vy@vTVBH@M~$!;ANu`Xm`s+{1PV5}mwQQ_vE z773Vic0c@OL}3^g`$zOJLcPC~R%4+K%rw6Tawnz(DQ);_a@(3Er{rhl&rIwrj@Q%_ zq-#b>-EGW--+37IHieL~FzI}s`K0q`tvq-za)hSlZII+Mr522O=>ldXeE!cwWW}13 z?`=Gw+cwFc2+_+wdbT@kWOoE zdI7xedL|S>G|X$kM%0G4+Y{g)c90R8tvtAfXMI2C$Cs3wMzKEALnVPPhCJCJHLBr^Pail z*HG3&**JMmS!VEmn(u zUvWo8DcI3&+XFp!a2Tk~Wph_r=s~ngGD51x`GUg(l1TQ|%=|6@r{H?Fap|K{N5Q8h z!lx}}%^T`ekKqrls(Sq-47^~MPq;? zr?PG)D$P;}?$9AAh#@_DAaYAWHP^0xAOY7C=n`fQo(G3C;*|P{p@LoO*kG||=ws+ut%^-Exi7t|Ub$f8BfB25V%Da_WAQx^>hX59I3xUHPpfX^v z?dn5vOEnebSFQc;&jn<;XRPrtEQ^ap=TBTT_Pe$BLW4I*5y@cR+l0t!hs*|m%D;!~ zE!DLazAkf6ajF==+tr!Cdd$O0KqN=u?zBbRc#6pb zpkJT!+X~_^jWXalQ2VG_x+IXYYLd(jP$#ctDy#q+LCmSb!1~mwsT#R(S>cjjvq-n7 zoOizFX@phoyQa7|hBay`zS9X~fq2}5g@e@XNOHBBqJRys@LmD0E_X;+8gy*jP2KkP z!Y!>b9ofP$I-wml%M|eXw@WZ&3cMO`R0$ijUn+WqkF<=Qp zjCLJY$2+I{Pc`}SuBl^-4_X>Fcu@u47kOuqiQ#22>UEWHVfdperTmZW`8w7uhwWOg z-<-DBldQjPXU?={_c0*!i87z)iO@&+gwFNBCNXoW1hEOF8+&s@!*YU8$d}y)`uikt z<`)=4SQDbXe7AX*cvizZAD7F#S(!$e=ecC;AsBbGe8}kpmSfe#8>g{>yUP3MD`b&n z0b#7y0r=PUU#C*yCtPo7a(&2!X!sR14ov4go+lv2LuwajRuN?=Mw@nC*XV_h0IJ|P zzo8-A>{EhiqmDt!{Os5j@;$!%fo;8u7`kVDhIApFmFj4+glbH^ImN;$scPsbAI|Pw@)5qFX=+)0UUgiwMpdihR`i+l z-t%>)9QwyY`-kfhm1E)O$Cr-p9||@=MQLeA z=4{``gapaq=(yGCJv3y8cbHuqid}D>>^kNgr3h2ikQ=qQtdR!|vge26+>u&g4bhn+ zUb?8${m@c@?d{^A6IGd0-Rbk*BM?~&Sd^ja)zsKo5{1R(3G&PKP2XNdCke`1bkX=k zsXjc1H)WI~-!LccDZclrle93NsjEpnZ?s>#OAd*iT`K)~6DEp}pGU8MgC|7^X*B|1 z<>5E}y+`s?$~{q^z2rp8PrteSIV*~X-`$}MCMc#MuPWOQX?9X%M7{kVRUi~&$aM-eh0AJ zXXcaky!x)v0zg~o0qh0R>tJyaqw59cnEg?OepZ9{5H++WCa2}Y39ctLopwp8jQ4!u z&b5=r#(9fy50SRiZ_p6W-%oGV{X)ISF%G8UyQakG=0E_BtE);SX_*XuWO6@q;)IvD|$*p*@<) zMNKI{<#_oeA8OAI${9AwJrZS#yDf5BcjWP&H>b#yzkL4360VNsf8SrOu4vNB zm(_d_GENxUY~R)s_z{C(i6#ywd6rH_>(UDTsydKa^^51W@x4Z)iQWLvWzjfcnX*q< zH{0I=_ny)|K1x3&nVYaf({C@qJ&);KQ6ud`lZ*r@+sTMxOgYhIIDfHwFi`3P10N!i z?V%#1zat@aaq<}WIRpQ5=2c7)QEVopi{L_3mOqw(G|6E#q-fM_VGgA`+8GBNv{zc( zYsh!G#CtZTomM8P zv7PURnc{duqtImLu;pbn zRx!V1m}T@^_m5`RP|A71f2`PpM@bjfET3{NIhKunM)!A|4gStizS;#MpEv)s%wsS= zj9s$iQ^@2<>F>0;ycHfS80kApH0G-HWFlAO zz)7fd0g^+#A-Mw(^RppVV$d9*qGM^TONR5>S+iX`9|cAa%j_aQ?!T>wwZ zyy{r3`4kX8V*P|&C?_6hg)O*89hdIgTP@>gKp1n63wPcY`tlQLetqR}TN1pzS~ZdP zOSh4i=*x#~s}YREXyD_YS;DgaR$I1IzpwZIfbkMP?On)0eTx2P-dDQs=Gmfsh??D_0~yha zBR8BXhdl%&*KY>FeXxs@+uuXS`n6QU9JoBPL5QF?*a)@_r&e~2s&0a#<0-!c<$9=9 zboCb>@{qkOkT|FD%F;AuqzvU=aan9a}LtNO-LQX;^~Dt#K!s>%pQ|f6%VCP&am&H3R0G>db)iW zY0i$lOUWrVCCn9+JRn3=KC36b%@SIwzVM-}fYFDqw2a<<&CY81*|Q@DA&TkYW(Oe% z7wN$6C-#YJ#OqE#J&2(yPnjIks8=ih3L4C@1Hu$GvjAeAz;flZrmxeSn~h_?zl}Z@ zZE2;~jl6)B)LTKn;veNpu4>)wi1b}!Te<_IfaD1|JRifE2x|_C3VBq1Tb>ogla+$r zp5aQJ30vx>b*1!-K{%|E(Cn5l;_0k83(`A0BP05&d%cNQmC_pg@J1jBSqFuG{+jwY zzBIO9?B>_&Tn(z)gx0D{z_nyar&KF4PO^Y35B!4dD3Zng5%oNOY5K9u;h#=LybK>M zaKaEz$wxP#nitc zY%}h!cwI_*YBL<4)%bo8&r$}A^uyY@C5mhWLb|U!=yR17G!BfIQN^7@&*eQp3)(=* zKU71?xyRC|m-5C#4`*jOpN|0UU@x;xot4iXBC7RzMi1JhHdw=VVD+#GGwI(^gAWPw8K6p!`M>$F0QF&Y%AB!fxRVuEWEA^PV42A}jzp8T zi0e5*M_#0Y6ncy>NC^fPc6ybh*y@|{*+%*_PPAfwP!^)Ul*S=5U$P{y>3=c3gKc6E zJlh@jF5E09A{9p2;I%e33--PDsNyg=fxtCKBaXv?!6wA#p9QS&TJP@U{Eb$I2wnc0Mc}(k;H<-d^#O5q+!k7s|I#sU6K;lAe zM)Wo0Bv|?RcD6HASWl+;7e3} zdjQoAB_qa&WEMoO^g(7onf{^E{%CP#I%-3mZ?7UGIc_}4PfTKJhdWIZeanGg9l0Ek zB!1#DYp%#vzLL3~Ctum<6S22xTFa{2_MyMy zc1F9V-HEBReUyS_SndR1u#X>{iT>WcWY0?QccvC7t=|cqw_x6jF7ZujXqF|vtnqM( zzISE#QM6z=)`?q2(B;)A?Y5ZtOeE*?W;rsV)?uQ*@2GpSK{v7*#667Z0 zWI#ZHt{i1#b0iuIJi4v;is8pP#~Pi1t@KO=tance0cnB)x| zIOoJLD#9~ow#Iq8s$C7HRJ;_LPVBNix*p(G>8U%i6#z}xRY~OSF!`k^lZ6;tuN6k` z+>CU{8}3{Xk^>oKQ`(=8HHI6}#Ki}lB6&5%Uep#}&M?Oo6%i|>fqMy2{xJvNzM|+) zattEuwN{u^BKF`gT*EeC&AxPYGcF#(GQZ+SD)e@zBOlk|<{bUQP>QS%h7;8?ygvxd!;+|C>3~8y9*g%|! zpH?Am)x|0ZRPjzHbjI|cWH1T%3FVEeL!0)7n9z4zIy$Soea?$!43f}vXMAroLV18_ z)^n*|!*XvQaodGLK>aW*H-*}U5P1fIt&_!w%v3b18UB#2}!4#3Ntyl&}jlR55 zC(Vvw^B!<-9DF%IX%%*?agnkfy+IVjP?>!E6E!gK+uvbB=j;khD`*0Mx=+oSe;g75r(nVzAGi!W^X8VZJ014szK=G6F15w21nl0)^ z%TkO_5EDLrC%GC?J%s_o7s;+IiCWKcQ7sp!oO_vK1>q)nA)cO`mnebTz1NF9?{;o3 zw0wmNK2h?bc}DGg4-#q<&9e06!QAvX$%gsRtd5GcANlDLt=$D6X3x62Un`%!wN{wI zsJ_h-ZPZ5N{oC;lttD!8oSzGL~99GHatfs{4&YeV>aLMF3aez|QqLlyIT`-t?? zMeOY!-x7|i`8dRk4}#A8fH)q30lm0+smXb9hCJh!7g~~`e13;}y=ozR?5$#brj?)% zezSE>NiJf?YLy(56No6&5icjCxC&IgHm}hlrxu1qUPWgeRefTCBe=vSGl<4+*?Gdf z^Nuh)qLp#~8v&mnRLwO4oLXEte@?U;vA5CowM)yi%LXS^+Rc zq~3>y#)B?g09HrlZl*@9@(3^#JV;86YQHtmvEC09DHm@G1Et5*C=b{CAPxMza{+kQ zj#4cwZ$JB&f>l^z#iNT{i?6@Ks|r^E$7(tAPrMhPK<&>n2Wpy2 zueTri844g4ud!&AxmqMmWBe@MKkUt9p#MNbITq@%)kH3s8pk5H8Q3U= zg!3mY$o{Q|l$feV`Bl8FUqbW#gmcNXnVljRhb4t;s5)E}Z^e!(-K&iu>VEKu?4-i0 z-q)}?qCtV6s3n2BVq=>C%s0x)^%dw)<*@wu)Ka+b>6#yfs?&8quRO%M9 zWd?eW45FSOf|Ofm1aRW$b~#QMj(tk)4jWIdRi>b#k`}yaQi9!=%Nl41P~I=b#2qrRW-e>yTqT%+)>RK zoCfD|j|i8YrnS5jr!(6}keM=}xyfETwCdqc5aUv7II%V8ezWIZSM)vH{V}sw(mULr z5HHRsyRMXi1O!Iu(P+>&sXVQjR~DkkSG$;E#oG7+R@Fk^vS99XROEGzg$W9U+eCrM zKxN|zniX4V5DA-E@B&4e_GbJFTf_}@?7*JP5N6XdKFpyXtz_On9zef$)zqc0H~P_&ASZzTRS_sqySG%g?qmsDFb+Ir@NpEP zHBtMD%Fa>l8(tTGE0LqhS??NWz`2JR;}>1&hg*rr^7yoTMR6#k?d1{s{4OzbjdISc z3Jg#_N(Ss?)Aj`HNn-Bc#hKJ_j8gn7{i@+u!{E10k~k&ne4v;S=uIZD&&gj^JB1&x zB;Z#+Z@ZrL9-x*NNEjI&3G=_yw)=ZdYI1>-2s%b>>nA+D7N;h+1zU&wNq_8CEtg%4 zsQe$bxtw&-9@_`|IXBGj1$*x_(j98F>~p6%D_aE0ES^wPFtk@Q!@8!N!hgl(rT-b0Ih3Qolfur^911h{ym}6 zhR5-K?XvezpIzb1UaqST7W8sHjJObXGiwRNU@JJxu0QqeM?KnTAC4gmsS$Nk6Qa1wp`9)$?6{Tp_~w zFTap|mHxP(JK<^D0v}8`+vg|`VV`9@+%*J^;SsjI5E;i|JnB2qaR535)Li-6b=no+ zwF*r8*SN)9PXw9=I(}p$zOE5b7e{RW_#h=2jvt&ujI%+cUI447UB`KN)J4+nVIW7> zgFOUL@YDYZXjNvt7ao_>0rvt$-P6W_K77M5h}->{Jk%?Y=3%bjEn%Mx8aBi^CrRz^ z?#*9xaE5ZNnj7`)7mhX}<9IGUYoJ$U(K^3Ww?!0Kxb9H&N}mRMbUuJpr=)5-k&C`N znUaT6DcDEwaTL?GdkR5POYmA8`BCKV5<-V+nDyO(nKH zzZmuOOApJtPJy8_gUiiM`W&cC=ljDFyDYGG%5>}hkE*kbYdUP-{%Dj`RJuh#K|-Wq zl!Qv7l!SzUN=fGiNGRPXF%Se%LItGR0Hvivx*0uSz%~}YXZPoR>i>S9z1Ys{y3RVj z#~rrd;=A74ct5TM@1cLFhE-Nw++awP5*pl+>_mzuQaAATZ8+%ym1+0V)_+6;$~#4u zja5Z}S(n3dCsJ*zAPUqIB7TO>3gVH}9oe_I{zsD#n>Et@XBtQ=O`Qh{SgDb*-E-u> z4dIeHHA_CgFhQZTSKdQsfL?Q0Yd$=nJ2*sUx3-Emk7A^3q>p+%X9z+OOaRXI)YlhM zlm8SyrTyr9I#i?)00%#~ktTA);<6q;b6OZS9bUsp2DN?iJFL4&yD$Omr8$=Ji$X=N z&$FR{#}cnUIKEJzgv9kw8E#P~t~rcw*8|}p!QIm=Is+!=BR&<>N&)O4b=pQD zP!h0$H}IBCFdVlPxXp8AwVb0CDWDsZ_Hq)g+K38co?V3qFMR;g>5DzqrQeWJS?IIL zCaBUJib1a-+XVKu9Iks+x{kcRIfCzwnqWJuLd@2}j~z5@v^O_V`CBU9aFS7xGy;Im z@d9&kFA-yO6c0>O&7YW;uYz+sDw%;L_!jnq9Y`pmX~He!eTTOhT-}&7(T0Y<2WsDy z(s?pBTDn;*8_p_B}&I$-@*ULMe%dUvoj%&aUKH*pt zfy4`7zm@L1*Ll3|_OKhhlZChRjbfQMwDc0}e*v9VAF5?PBi0Pf!`T7E>jO|O#f_OG zY$zuIUm^7ocy6HCed-EYsPlAdv?VaeE1;iylpdGPWxQ6E76DkH>NbrB;~A`Wt6-m{ z1;Q%ly#kdNRSW=T@7GRSofSLztQh}CG0Xvs2{sm}(CM*=eR(sB2Ds4hA!OT&4wzS} zlh&B#n){}Pp%fLAkXp}_@e$sOmlJpCJzM)7YMV4mRtYqlD>gm!<8IXghUxy;`oyR zmVn5fg^1#1J)p(>9$OzJHlCi7^2Z9n`{V2AI2k@YU5zZ7kTPP*k%J!zRrJ*Nt~Lh; zxovr}O4V^1CXvi~fcb1NUeMMi|NfaOV__6P`%3eB z9RL1)N-8{=$1dkskg-NF*h^*oF^hKT{6l#jTxG8E zFt_aG+UXAQr!}v_n@+S*-iX6!_f;bxVe?%*LjJqPjSoN4NX^5(o<}3=U~z_JuH4wJV~4NN_6Z*t zC!%@{3(lU`ty04!Nw|fUX}4J{fP$a#BJGiX`I-Jgn|Y}nQ^w&eIen1MA0@bD_s7oe zZ__&&ohkl35MX|+@*D6~!yHHv4UY*9zu=8)9gNRai+Z5XZsg38jGX~;isAo1O7%<3 zq*b?g9E5HQ5_Y~Xj^zLK?Y<3V&3uhS%8kV*R3~=pwW;bxyeOq4>%V%*be9tx1lq{N zLi#AQV_v&Uc!qED=R)u|3`2LxJJ2pgN)B&Cp!YOzM@Rv!FPcj!w(c+i;15!L?0Nu1 z5Nk=eP<3?xYlx3p&digRh}NQ*1`BGFKtmP@){K$Xhi?*qG4_HQD{6)<)+!dp6J3_V zamWZ~$vON6P7A}UyPe)y1x;%Aj;E^f;t;Ohkhcbhwi-~zFtea#3~6G-a0w;z^* z2(hc%BGkSlz+4F#r>HGLA>TF-AtUhi>61awP&&X!E=~;{;J^Gyxd*^u4(i@5Q|XKF zB%1FMR_s_&o(>?P3kRWPi!oHVfe7bPb>vY@J)UADxW&(W2dW?4{MYtB*8F&0Q^hgS zTR)c(Ett7qu>xiq0)8^VJM2kNul)O9&V+J0uera!Sl&e|i}oMvyHWN11nFM}s~cbX zKrE|3K2<4ys1^O{(xZoB*S_$QcfAy!m1@waQ}pBRAg3x;#9-wiWRL{$C?GJOB0f67?#0nut< zn5V;lZv4mNTBTqd3kM{qr5keiG!d&X?KXHBdCKeh+}1&w-nbi_bJ+!tD8P>FL&(1I zf8f-Fl_vpJWI;6{v6{X1t8+52iI^j+9nQdB2S`3njf3FE8~lky!cVJxctKz zzeB?q-y5KpedBWXXX9Bs_CH_Ab_>$$;EOE?82aXO6YmmmsNC>-I=Cy62zz|SzvUpM z{yOaUrBm7fr$AfzDK&vPW5kns{bJ!Jb!j2``<<}_(TQWJ=*%x=O*pP@JpZ6BRb>KR z%W;Tqx7eLz3}g)h3Ub*y@w*P=tO=A(zS8rL22zY)4)MO_(s~llu%DC;3JTTV}xZB}x6?uy-xxa#$)$ zMI^H#@~+Qtd&bx z3##fUMp!;*jGm%{zkcC$A2+^c7Z!I6Xy`0$!^xXy%n~5&NsKO2FE}k}kb*lr7G9bH zE^m8m(QyAh64H$3{74aaWwP{J1Ap3M0p$3(P*ERlL>DnifH;vx6M(pLer>hBZbH*s zaImU?P%+vaM%z`*3TV2GHgqSIGz=ds{v3e}ce+?H11#vB>tAAzk$o zVz!mnAv@p6)eX6Nv*h(5@u8z?IoNael|difXVqy5gj z-2sA%#zra=xq}K-%Gv!%TSWisNxrKqIuzCxeMixPbXwD_2~pC5@jkoNelzDSfqU;` zxI}(-KUKJhR0sfvccr$#ThCQ$mif7&1Ze4T&iPo6poysRk24}PSx9m!m)xOp(c~Pz z1JuQwX~8Tz8Yjm*`EwFzq}H(?%D5h3u?pe-2<8KKxl+~DXF_1 zD80->e79-Zp%T6|d)Iz`u2l2cbS1ku{$cXP**s(m{Ay$@$C&N&>%0yAIEO0yNd z@e6GNf2?MpHL>PES83(!JO0<0nuG7^E;aYZ`KgYH*z_jcve={03F3T#$O>>L}h~bLF?@ z6*vLAO$R*GhWuE>D#oW&yXj?&^sx7# z)^6St(=h7>8dJ7^y%IiV{9dUWha8u_+1+DziS4m6Yv%4Ypiw{9cje1iZ|Q-Dvb?PR zDfqI)TTsHA71_F?&5G-fIn0l%Iv&HORy$hj)@fB*o6lB%1nS8En{hNQH~PdL^}LFb z2G$C4W)2U%BKzZmLYY2XQtvu~ff=I^L3D>pEZDJq=e`m3AL>E$u>n<0q`?qvf;a!C zSlDWluB{7?CDnmo(ToP!a!(maBKqV$=l1kl4o=!4NKlP3JCHPLx-rBE8JgG)q- z#7v)Isa0@3B7Pdvjaz)}T=nT3%zfmX@$<#k<(*nhk0{F z3{z8{yzGLECjtBZEow20bhP%$VcHQlH?|)vBGsREpjEu?pZ4F8Be5-&C8zx=t%o5R zUT^@*__z3E)JOsFH$51|8hxwfX4I2fu2VjsiE7OaysRLY8=7Wn1ExyC1-GGWBv76Oibi4DAI0~xI=mcE? zcTNxZ0ZC!aA*Dows;xE|c(Mw+fa($~XVb~PrJetM)z!&5HsvicT#G(`^eK)|>rUb? z0AibJilwUa03?>|qX=pIJ6BoG7`4u1DwHQszN=#rAFeB)^d>HrN`-cKu^37{=*ktW z^xnrPppfmA%C7UE-!GB{3CD+CSzqkYh1{g%_$AU!$G-+=iBms&wA_58K}{ zl2^*K?{&;pD*q_DIBG`jJu3pnJM&qT4XyDGePD(ble-2CPVV$B+N&*o?)yhk!L_{}tA-^Ta-OOZK+c1(fHF?I-3&v3N04I(I zkOi{%Pzr&%`?rLox-xTp<28xwCkq1}!Zf>aK=De`6TQa2AL(|OSJSTCD%wv^Hykhz zs%1OOPdpuDY%Yyy=eOPY68kYh60E(jNAWSx>^Gfz+tJyMzo6IeAs;K28I#_XwzD7+ z1_YwHG(|<;d>8AXv{FVF9oIHC{3qKncu5BMa8DyxZ<>w=&wr*4*ND60$81S8tRZ(% zY{26^Tj#d<#M__Vja4`6g_lWui(*v&1*(F_?X{;T6Ka$8q2=XI{Mboy76Qbhl+nJs#^#=Ev@JYI4o`5_6?Mlj*DUQY zX$C;(s)9rjWQG!8r64c&O+!w}ocIEQEuJhkeG23<(36w|l5(R!D^lAc<|6=?D@#ot z;5vBOh4a-6L*aE$Qqt>6H^u!O8^Opd#E}3w6YIqyIU|;;%?>v@jCA+3PXIkwu`Wmv zFioo~JVW2&OxY=Tp;$GmS*+wQY3c;bJ~-AB<`za(<{h=@Fq5nBQB z;(5U8BR4*aMz48)L${?BCj$K5 zKi(Hn8k4mh)(+BS`kKRK9Ys_atp-P8-w_#OuUn&f?Fc2T2(0Hf9wYn_6J5cqXTZJN zq>SSmd+^@+-4nrn3xXd2smqELDs^PSkGO;P7`UE)sv%qb7Jdi!IFUT~YFKhi&Is=InF1YYq!Y&0g0*P?*S+rQtN#|&bud2_?CuME#xa)Z97z<*FF9)Ic}L>0cE5W8`>aY^#Y zSqLG14v;0)T_n4{XsQ+yGdIX63%00!lYT^l=-mbRRlD4z z|Mt@ll?YCKcSgGBOhw0qs$w(rgO}dUle@+OL1T!+Q-~zV^oA*4`o-b^!hgkm$Jp#v z!doE(9a-4Ncsi(ANFtB%D8*JGvb!on;565$wDU`^vTZr@n55VG>h>qBScg|y#i&NU z*nR1RgGns97msB~s5AXPo`lAGB;;p)S~=s6w5{QJ8@>%wE$PLdeY~ho}if z5#WZVOnT1v*Ehc-CPtEr-OGe*Y)-$HS{?2`Do4N*A?A4F8b*5ZR5bOiqOPq^!_`2F zS#ztmY8>9)F~ACzJT_SUgN}%r4Y|<=A7T&9_|!;4(iS2!0*fvj{0iO43S8X(9+XJ& zkpZnaYi@)K?Spl?U2v0c+N=XB<7K%`aPHaj%fRwjA0ZB3VAT^GFlNiCca@Q5Z@ElC)2;_)3CG#SGgW@+`n*HSSWjCtrP5bv#4`)1naXtDh`pd(+(}T z>#wT$g}Ywi8H>DwSlL*5t`3>dMuh^~b3Z$Jbgdbrt)aDN$Ne?xHD5=ct%CYx__z4alopuxKv$0B+V__yCXwY_;9#gyWb)oFf5jC*0iqze5#+duGAiVt~@ z=Zf$g#Xh_l2Qke~9u+J3N+=^f$U)bHmZEAjln@Kr?=c=S&dWBmjRG^`4P z5hnr-59z9FpZ$TS+Sayv6kIB%bS1bgyLl}C-I-SwxX|Diz*gnNgU3WPz4##tJgrmf z%lyEM9kal1Ku3u+Z=!Zl78LUsR&=m8Y1&rms-pv{Oz=IN$%8;(bA#H7kPsop6a8)P zylN>ZQ-z-HeU7(+Bq$m@c2aDuS-uIOm!+5AgrOFtxqmQk;{3wy-1BIA&(ryC31|MjwBl~RP(%E0 z*L1unV<|?D`OnvkT}=5b5_FOo|`nQaXmeS~+aMs9RGBo8CIfVAka-3`=a%FhZ-nJPo>kn}?PW zw{F@_I?#U~0R1LQf;akt7;^Ra zH7m;BC=eTGKcQBvpVYDNV(<~H)q8=v0+8H-(_1S;SRN4g1ESvmOf3p}UoAZ0dTm1a z6e@Cmtu0dSi2Y=tiZs@rc?&#rj)W#^iKdokw&a$D1}bC2(Z4@4)q!*gp6?0sMc1PB zRTj%g%b|;g_s4Nh&{9&GH$2{NMzRu9ZKWTxsKR+iDyb@rrIz_OCg3xBKx}tD{PQ4% z+?To`aGbv^iMw#!<07SxTHDWusQDYL^E81n2Z_Js3E};z`8gSj=>-A`Is{3+;djw9 zJLaT7ZN3gD#Io0heEV`w(#x%gl*ai*k#SWAw$wndbd=)v;1<9s|;znLGemKq@K#;8YwaQjpOB4sSKl$lInc$Hxk5C>E z=y7Kdo%MO|56z~<3*+;aRh7>%yq9ta&}-Te|G%i9wEHazohgUvCIBCy5w0#QTuuBT zD@57(g?cpn>oKX=kp#m*WPo@>pJYOF;SJDZkoaoQq|yv}61#7qB@g;g-@n0&a+s|q zO(~EW63pU&HZ#obKBMo=7|zS{2HZ*HKspz9k$5|%k)^aF9nC>2Btu>}h?nZB9$v&J zI4`omj!I|u)LB{}9gHPY>92sW_Crhkqx6m3N~_$S5<_a(yD|vV)Pt8;8s{sB?PsMy zatmzwZ6mPx0KEg^>T}MLEZGxC&I8IFwa>zH6)6CGw39AJqN$rLxQs^XI=x)5>RxIa zFT`v}*z>jQ2G!1o-U!7zbpCcTKbeUazRkyU^s$&*wQ3hvspLP4O2^YZ;~I6XZ7 zH45s`6;3?xQyyjU(L-ZGX7J^sF;YRuw*uffHHNj+*P;6g$DKjF zb*d|oZ@#{%vUGD#nNMJI8R#N-&zDsp~|xLzc{ z+64+3X5Rr=6Z-dTyUzvKw#a=|2X?kfAS6-<7ow%W+-J%OD3a0feg8o9tidS$zjCi}g{{i~WO# z3Ox?yUkY;gSD8yO>=u55BHE#+=F&oI3CDC*XiC=xcui(H-VdcR&*LYKU+R~e- z!XM4z%J1_2K;>1v=4nUjolx@2?DLka3DK*l>tX1H157Uq+?9$msHvTH6ZP;1)eLgE z-hbBeVEUC-ZxL$f)iLn51bSz1Kdn2jpeh;hlLaQaUN`YGEqHi2=B6q`C+d!nuE|l1 z|MC|k$&8f=2gl8E50t9ZN+S9Dm`*!BnSNP-Tk$Uy(Nkxta}c$)So;ZY7JfABLD;$@ z6M$76t-3gY0n~Ds^Fy}thD;otD=0-xbzRCVr0*8)euC7N~iC4?(bTj<5+OVlM#Gx2-1{}(s`^<96=%A zLKf&=uQW!efhIpf-<61 z$ORhNx%fZr4-h5>5Ek_3Fjfk!ZTL50w+2&G0%5K%QS&f@kow}og(LOrSODr9G-)Y7 z*_mNb3^Jld0d1Jt;a5>d`t0;|;3PjcphL6ylj_hxwGb*fSDlu@2^> zT3+&9gdi@AVZc4u)O5g`N!W-i!hieUNV5UzB*<~s8mSgZ==%0}P;-gdl{Tz2H|pNt zdG!ZQx|V0(K5+sRWfwO-0(d|074fPo%2J@dCqFHi^b!R2%s*l$+WUk82`U`9JBkIV z@Lp=UDG3lOBNo|p2HU^x$f2O7mv;Z!y|2I1a1`Nho8qWUxn7#SbcKm03#dfTuH5Y9 zEuV*1rxO$v%(6&dm8nBteu>i*8q;Mg$d78`Y@`afT%PsUc_#4&U2Tki*9V1Fdgg|+ zH%vNbONKMqnxZK|SN6mIDg`z99Uis-whj9T>DVtU%O!tcl2_Xl^Xb%`|5ljXfUdj& ztzT9*x@6~XdLeOe0#2D>;?>IxjkD8<0E+p5TknSs(dUI*%*Ps=D}7fFzx`OX?su4yjk353lotO9p|<*O zj$m1SL7EFDI&Sg5YIEfj@XtuM)4jk*1vB67e(eekLAqLezXm-8id8rf64kD#@3xUnpA%kl9(6>98M|i{ivnMuxUg|7N~)*V?6;87xkhQTWO&Z2l~?{UPa9 zMHpeargetuFkfZa)EbtSBCI~%<~}xnU|dle*C>SuT>hO`Q1_M~{!Z&B>6saHX?bxE zTf&M+r5E3VBaY(BwV2@J$OMpY7BR{kFsDw)j=CXja)o|6Wbx8J8+*M29WYo_RoA@p zJ!|nLK&g~{j_V)&#vq)Ju@ExOj3|fh%~=(nzY(&lQ?^0h6P@E-{&atGc=mxp&$Idz7)HBY?0#!!1xd7g4P< z9rz@2D~Sw02QtstAfgR34;_Sbhp$<*^_rIcSgjTotz`)j#n$eE2s9D#Y%jb0n7cm! z%J-EW51Jh?!x#%=7bsdl&E=z%#0!bMbQIee&g(WmYecvP+^xbXkTUt4q^U;B$@^VO zrQqtO4OcNla2R+nNX4TST^qVLrF^|?WsWX+uV;ZWb;|AHN~*c4p(@%r^n;)K#%WaD zQ48fDBcp1N>BF(sFH3%8J)o2?rAh#0G?K+VVrlxqehoYF%Wk_s1$=nIx}iLE(e^E% zH)Mp(_)!RLub>O9vLOZ>WzkG>Lq3b7d3TI4!Vx|$t(#PPdpMA7y8=ZmQW8sMSxAODWTzWYF)Ef4r~AZ&+iJY$ zJldlR&w`{-_g}p84tYf3R3tFdQqj2RF@LI4$Y#aq4k2N5xLArM)8sE)4q7(>_MJ9D zx*}&!KqY=j0g!*ivU>!}2R~EcaA0?i^odlcRei{*=p^CvLw3}O`zZKo@JdALFA9AY zf|h5ZG2&er%gn<9WejF!aV1nup3CA$>Hy&u7+-MSpOf$l0c*749=-fOv?@Z1=imn+ zw8)gWqg0a)AU~H$ppMSf&0oPmp?)*@KbKt_UB7U^`vEB25qHSDN6f*^W% zu8I&N!0rv};5lp*V0(Y0+XJdPP6Spb4ZnPH{s8q1AViq*K6H0Tj0 z*IS1A$cg`Cfxn!G$4q+-eg8c^{uCd<=jOBY>1S`UM=O5meFtzbuE783Q9;)}y7 zDDXB&ab!SSa3*!UMU0sr8E~`@vM7lMCuBz6No17V9W6WwiSM`>LOo9x8)krqJK(8S z&nP{$YsTbPwQXv>$0E*6w^G-R<1T@AkEEjc6}SPS4v)(9HJHj1>Nk)MabuADsKi~= z^!W;d3u}jqe|wokU5u}qD<|}LF^I5cS5SX3LKX{1cLK#VAVVwK5j;sZ_3%v%53&SxX&sI)2}i4<&Y40a_HGVD++foo95OWC5`1 z&U~q7Om-Ab5s=R9e#R)dpGxLhjIcqqSTmG^&}RzM_E+5}<)ILr&|+e|bd)Gygi*4C zvpp~VyR&6UD^R9KEvWcWS}YRS>cG)|X{Dj8DndyK|sR`xJJ0-#ovtfrvjR{~#5Sr0WMN zKj|0&Ok2yN`TU3#HM>x3zX!!!algo|Fq4AU!Q!jDp9Ot)IS@+e@0r=m z<+#*Fa8mPzB1@5z|HOYYe4;*DG~PwF51fs-Kg3X6(op=%k6kFfmgz$RlrGW!QbPjF zc6hcHJF^Ln8FJ*BIGDo0Tz#~xp`_Ix70b- zPtWr)=Qkwd2)ha=Xa3bn&{vwR41i)q=X1+q>DGS}^7@s}P42cgEX!+LYZMMU?z?ItnpmU2AI(pb{+&atV289yFm)6GV&zhh1{{0R8*d z@IHaGEj=;#cdmE+ql(Q9l2t8)ZWbbqQJ_GC&qK`(=<8GGUV2bnxa5ba(?CG1mtL^@ z9HKhT3eyGjbKY|tOAQiSb|UDseKD)oM%U%2#Hd9r-IaV^3bQ`{atseAeZEVIJBEKH z4}28P%O$=Y21x7&%jg4;9KgMAu{(D z=Qpb{AGz`4g&#co3h3I6B6Br2g1ej9m9wcndQ*fhA`OuaPMN-?HwjL9;3KakS+AMm zh)AM7IQi?L{kg;^O7~L*?OVgEA*Wd|*w}hHZuM^ADgUQ8K7!&yf#P#in_Z@pqcyrz z6w`wBuc+TFUFGk{R8)z2gNFDQgU&d1MLLjuMMZB?Lz9R2*~dt0jQ;g))VpZjsBP~= zO4uR}?NfWV(`!!!;<&)pu-u^VlmYbpm$Ym+kJ+#wqvB&Q{2gr$?DIuULx%`Esd$W`ji6m=#Ely6@y7*Y$s>+i%kV)BauZZ@kew`g%@e8 zfb}ik^)_El)?<6EK{%Efe2UIG6RDR#e35WeU8y)*9Fsi?%8H`IriKy9XnKLzxaJ{8G>v|%={xPTG z-*0=b^TP6!Bee(rDBAG7zVDItmr1YG+cjub6u9)nry+-Gf$BBoQ`#+C+O$hh zyra&FY5`-NtqbdE?5Y@D7a+!!kQ3T$pz=0f{A^DH8O0i*okcIGp}YlF$tPd*M=R^n6+qmR?$#Zlfu`I?^s+sR`PbLxLb{yl)i z|68B@@rE!+{D<}KSb#n3oJ|S$G`gow2z#O_#7f;zdfyXxz1T&zS91t{xCqZVWEQ2f$)xFh`O2!g=JmZ^a_(`7Gk!|@!yXyd8R5l|u zIQ{CB2%QdK(Q%*gI|cf#gHGEMwiyzPPA;OCpr~VmBUvDP&1Y9YZs8|sejkm3&NAx=y-!r)l{4Hgb5Uu(r z$QYS|l@W0-7z(N)5Q}U^9(^-v^dW54ci=x2wuUQ48j)Ixk!L&6#iH+{ghW}5;AD@$l#Yc0v7YVorAMbgRc6GoHU7tH7S2$ij+IHYHDW|Z^p>GQ)2 z6FyAuuACp;VvygQ_Xbr~R}%;Pk7xu+U==y<075gZufxf|YA#>__t{buy4y*r4r8bE&yB4W-wD&7_e$MO zIz=0ww%>$G>Cc~zlw&?lU0P8m--C8-`;-1vYB}#oZ?0%y9*kqW&M;ahGlSZVe=)pX z+{aV(5*yJgRF$n0XIGA2NV2e1f<|ktQ>c`B<`-%-LX_qCYb{%~{2jhnGW7XZK%{yv z0YxqELby@uoipXbCh=MO82!wjyiT0|+FXlEg`ldUE-DdH2g?pWb>dm!aY))T)TX*< zB=7*qT=Zt`Y=_)0T)Inry!Ylf$ggHoku+7~%|~1|Re-j)2;}iMZvVlzS2_`u4&s09 zb=9UGMAQU7*yY;rqkRvRM-kxlRPqjRbn`{T_>V4#!=`Lnt$3Exh_nAQAZ{|`_m6WL zcYY}oketbH_-q2C?h5e2)|a4`mWfqxmexPqEm8>>DUbTl?o>1aJd=C9CtnrCMb$X{Hwt z&8*o@5C6IoEi2bwy1Vd$PjcnukEe6bv7dfsUIMKB-nl@E3lpR+=Zx8hnD~CnP;HZl zV0LOh7S`r9N99#q8!-?`{#Ef*Gle)|_VX^gw_*+7&Uy`>>AP1RXBTG{BJ$oKM$-CUO7hD!ln-4N-UmuV)&57k6 zM@Iyy$3a{lo;7RZXqfym9D7KC-r5mKlFHP4*uN~HMR z5SOBvnbyzi4e)JKxj8h`8DV*%5B|oUo$S1kc`>dOe6l=>zkJ|09&xl#;II%ZT4DG=DiTP{s&i% zMJokXR(Bd~vVVWiq_V%ogNe5CeirWc6It&s*k{mKX|ZBn@F9>k1xS3dzxuE7$-e0p z(|fsw_{88Aex3Q0)X$XA1M$`TM)AxYv`g*egR(ci>6^}*Dnygc;UU>r&^g%rb>!#X zPUwtt?F`-2TJQWNcEYptX?%{&(4oG;z*C#8lgRE;13#^w#YEs@4OW3qczECaKE*x& zEbIKPGne_N^YF${`M~f@*^EzH?c-Y4sWCud=f0om^V$svCiUj|o(-+h)BU^FntExw zosmkH!o9c_^DzMa6#dFv2BxCmX zdhaY);$Y5vE09n~KRKuOLYRW~0v zTT;E60O{L4Z90S0pe*a7Ym_)8(~yqD=#wmUqw^Myo1$stYnom{adn>H#i~RyH6Z=H zYf8_mmIA2UJ{dyN+Vh3OQxDo0H=?1H_4_{JYwI;}N)(-rYYOT7`b+1OBn8kH$*g&3A4c1X7ODD6D^ zzH%`<-3t$`K`PnU-IOmejdFdNU>|uWfcEqU0eMOYdg(AaJ_656;eJR#f6SkZO|49L z)o=`$q@KaBsrCfF{O#Lo4geOC@GV?!!6x@QD$kHzO#F?Dw2bzzzp{;~bz1-4 zP)f7USiMq1`-ZZ(MYdWq&Fnz#?HC;Gbp>w%p2sBgbnFUE@z$Y(wZDno`usO3319O9*vX9sDDNVBn`JQJRV zNZ287rEmhdWDca-&IX+y&qF5EyLzLSkoadS?Pej``vQ1t0RN*#gp79{occ(p64xZB<$N+ zPo30WRHTS59Jt=*WlQ>O1YMHKk~*j9_7nWhgM6@AFf!wQ5>WJEvheTVfLcH}a9>S< ze`M2HiT{=Q_i@j+SnmizJ0n(gbY}n4_@)#J*(z0_+_`CmztH5fI;!!vCmVkhwWeZc z)Jeo?$Qpe0zc~}P6~T^Li?HWM3ex4Ozmol`_K;!7)t>_Ke(qgMtiFA4n~eKsB>_7%4i9Hpa}T^%2*p<%rR=1^diZM7lryQXpz7E; zd{w|3t7cQ5c?dM!#6;y68QAVds;awcl<~s`0I~nFn@nT&&2d z)BQV7nC00f_4wr)>nn(}yGnL}%AmauV*@sGSWnnzl6}A(>f? zHaesX(JTLe^s5&ge^Who)_la8E$rYy9yj%^mx^+)zE8g^@H7KhY!o<;c?a~1d+e>T zph_3VXMY6wra-_?Mw%ZE>J;sYG+sq-cV!V!>JnsR(w(SLDN-}2I7!x-$p4sN`x3P^ z25G;FK)S1}++KbeRFPwYYyI{}uawBQP41uiNHCoEqh|UN%;f|lx9bJJ>XM$QUG1h3j$uhH%&fhaT}$QhyC*ZO3RW#QrB`+~`|i`TD_fO< z;f^az?Lk`7c-HapnshM<^e~zJK5CK{lN7P0K~rBibwwv z5vBLLR+2oX*>5Kqml+AvTt1Hl5+|F5CzO}Ds$@Ca0HFOkKh{Q;rvfVMs*U* zoQGt%caV49es^>)K-J-Zacw<*=h}QhA373&@qE;K38$4haz?PhVPUS0&T9Z~HD2Kr zk(g5sJtDPOeZBWsZ=M3B@(cm4JO~&4GutMCRTPA=gf{ovIsIdP{fq#w0FEgn>A>UX zfI+tC>F!DH2w-G9AKbhAr@-sd-a&f^7s4|et?#YS#@ipGZbeJW4L}T$STgo5Qcx%| zB>Ol>rb8tvSm{WnxOSxJ$XPzXm)yR+OMkrnHHJL#)?oer^62?bX!x%bBIdK^FJqfO zxaFN}za~}a3^FJM!Y8&JwGwHh*O=-NlGN?&fN7ff1ah2J`uz>!q>i)gcmA3x^-ucs z$Ct8)-)}CyDWzAbj20WGiLn+b%Xtq7*LRAue-XCxxjO=}3$4;)dJ-UayN!Z7Gkdqk zv*l-`VMR^~UA?cAO2RAi@cbnYJT9;j7h#oZ^Fm{;5IqCx8N`T_(wbEG_U_Vont0@DY2|Qqt3_- zOYd;VT7#i5zj_`BXPYj^H>)>@3@*Cdx-AUY?LR271h5X-ce`4#y~~)d^yJl~de-&~ z1#`8p;eJ10Fq9Tl-=J%@n*ouqO#26Du_(L$jTrDQtQkZ1-dP;G#}1e%K*N8sd*rVX zp==$^V(veC{RQrd?Udn`$fZ;AI{+>gh&P*w-OC0AYGI#0dPevF>3kSe9R6HPl=zHi zLx>d|SpGBONOmcjG$wIl#3hp8JMo>e27!xQk9wZuv z)@Su*;eoJIZ+!wz!j*B1@}$rCX6|6sY9gZkoMPsV`eu08=VOdggcmViiV*T4flv4k z55$2nX+WuDZJC(v>gaRK|L7QI5UT*2xd6TlWCm3WknB?n8GVMrM5wDQF?4J2|Hags zheH{@Z{uSxid0heNJ5B8_9@vSlqDrhC0Po|*p0`M?6g?QHe@HX*tel*iZZs0Y@@LZ z24ie9%*^xr=JWf!@Av!u>u}5*bKlo?pVxI>=gI$OvHw2NybVCOIYbdhx@+^%19eW< z3Uc3Grb8phYBj|0Pkh`Y^|vw10K(yuA1UJjvGl$QOODI9o%P+XH}Z8qQv~c(FRQ(x z`+oiUDML^^O81Kq*^TVL{FG0p43ok4nnz1`{$(urZ#kMU#VF=9zbk%zPx4l9Kbx28 ziVO-S`cjGAbq0-phFYt!@K3m$+zi!y48ycHsP?lNOtlDWIeUeRl}#IZa^K^~pitjY zexNLP#WoknRUOyPhu_4f2f4zMJ&(`GvxE6N}6A4R-qapnt_4w>svCn3X@T3X)SC!eEeI~B& z?k=VhdZU&i8)L?oJN>BLkf4S*!+ZY@JKQ4%_7FNs!4rUO<*0Y9ET|$M-R?}NfZFdG zv|jFO41v$M?xVQsWE2aLH@^2^epN9V$G;Pb$C_n|o^Yj(MEr|W9s?U~+z%1f23vhL zB~dNhb4NPagi=J@lCw0eCb z_f3S;mdBNN9;>mPaj}r+H5lj%aaYk<#!Kl%$PaUd zl&eP>R~2`y2eHe|DXpf9QX@ZbW+E-~4YRUDOJQoAJQ1<56!^+|?bPeWZ_PX(X9o^Q8w7GpEt#i@NcFc+Mk->};(vNEqMKF1Dxm)A!9%1!Y# z13OTl5;wKZc_;P4s&xmdgqqe1d#UVT@FVVVIF}(a$NTy0{|`Ov{Wt9eI*NH?R1Ws< zW372|ynn{TIP_gjfR1Dav-*^%$hgaBXr9awl1;JtQVWe#!e%}iO;4LEH@na)6>bQOMG_lWPJbdBb~pE0SO z(hTe*>OP;}?JL(7iFT%<<>O01n80oKtsSqFtxcm&m^|BU&oQoedFS=^f zKcaPYR6W%%>8~D&pK&M&`M1{t7v@MUd?Izt^O_%e)`W+&;AqEWWT<6 zdeEx0x$r=d{ecEu%Yy^Hh=_TmMrhYBnLZUfy`y_tienA+Ek$V`^Hb(4YYzhB^r|R$ zQN%;Vz7Dl3Mzj_l_`V4Nl^Sq{aK*=n93sJr3Vlrc>NDcs?|fwt6nPvExNY$zpgA^o z^O69pZB)?Rz9_Xr&}Ba$zJoHN@obZS6bc6$o!%4D`bhEms$d|x|MN!!5L!@dlK|3w zjF$v3brtuo-=DgaSt|I`857!$3nfArCCRH1dEQrwh)~&{p6>SFemO8D30TyhvRrw` z1tKmCmb3NkvCOSlu^s;N`_!s4;X7Np69p_c$XnPLE}!3vh&XT-(!DILK-fEk1^EJ9TxjczYpztg=_Y zDJkZMNLZ{YD4Hk#U~aGjUYUFrH0`N8<+r)`MNN&GuObiXKl@mx#QbB>H{COSsJ#v6 zPPX57~^#ysD0hAEiB zzZKhEBFLGU1bwNKgga0Wf*Lh>txwxL@}NqcP^WtOZg)fqnek>=r`Ss0+yC~^rn?MndlLEi+cACain>_e7Ioc zp@(-Jj~P;Fdv#a)y6@Jvr*b@jz5tHLy{|Jb4TvaJj-$s}jrFO%!+}ufRD_-R_qAI$ z&9qPdaGv57fd)P?x4y<2H1LQQtiaLLt4vK5K7+I*yQ9HI^WmXk+1aFpx&sF^Kov{t zjjJLjvSwe4zJ^V|q?1_f&9JBF#Lfm!NZL_q(hX+}efniQQ~w>4>&~p>KXiJC`Q;Rh zw~>V#KG#ei&Xb^#^`7R8_6&4%PPIy;q57O~cP*HZdEexxM8Fh|c|pG<3%WqQg%7S; zLp!~8@u_=Q=vFAjuN`52pztIa5*pg8^<36c@GxTnItLB4t+3prBTxV%y#|_N?+r_j znts)Q>0dHd0wwX!G!{2880)+rK6V}VO-R`;5ZZ}Aw@!9arhCog?VEn1l>8le#a%fsb!WTZ7zscFxw9PuA4ZJc<{uiHS_pgdRNn`#M)I z%-Kj!t=d7#PdBeL#KZGy+f{`*2c7VD>tC$Z z^czU=$`jQz+@CN@&ykN=Tne$*Hfr)3n?ap|7#7PDNq7rFVRh5($|8Xo6bQ|Kaa0T% zxU#4n+K%=(5niSW3nk2UZ~D|1c`05C&TzqRVjBW5ADwSsVNN(=owsJ2G2zjT&d!$u zD`jT)$;0|6wB&g5=m}`RfV2;lA0tq7kR19Fel*@DIISm#HW7e(*7%G{B zWEo(=5fu01EM1!9^$EyIY=2;G>Q6(w%k-O_!FfMOzkRwxJ~Qf1H&i>sv*0>x;E~nQ z`)S{3ZASm<<`!I)JLg7OV~)t?5o9XC%2tnsm+#*Vs#OQouHn;D|AbM7GzJEdM&&`w zslS6{=+!tFej^4xkV|j9JcxhSaqb6T7?WboY=_`3WGLd`F-KLksL&M%CAl0t74fM? zfVQle{3i(ZRQ2>0u(mkaQT-NC`xq666kLe9&k(7)k`J|?JvcXALl3g)>eWPzYW&%f zTMj{eWE!j2{hVmGDPW1bigvF+%?n$b&&1=e8=k&3nW2an90w3?{nC~xtXTAX>bjy5lksVDN?6Oy`|GU8> ztuUtdV7*{rtiwk4g%mWgyZZfFMdg5~80Eu*S4ARtw1>W$ZVq4@HE`1T&~mZl$aNjM z>lT##3p?*S!XwiN(|@VDPI1T;Dvdsn28NX7BkCv33T(H>OAgHyF14qQ8XF;;n9A~R zrSiswQJ2YKiu@=4gR7~Pa_6hHNsZvbkTMHi*F}>hhI(e6bv~-$T!xEHx^{1`y&Me-A~c`$hWwdwDf@0)*0~hA zRZ4Kp&Bk1_&#&s^?(5|Bh9Fm^ksXjw<8XGTbSJVyYdv57wYr4}*Omn{>@QU#IJz`i z$BNRZ|NAO#_Q;@#anV15Dtix>8Yfe!dCVyzcI#-l3f*v|`Pe&#^l|ztopYt33r;k8a&)-O_#} zLUC9^wd1IEB5vYWm}E(aSQ1LmxV(Zf>h`W{KMAst!sdQDib!}%wR|pIL zO#;&J+Y>RKGZbXDQbQZ<((r|m`Sb0!F5a|8HQSn4ba-uG%>HV^;?TIaWLu)PE{I})- zai3bS%%ObWjC8#eXkIer-l#cNi#N``fDgnein&x6<_VPw%2?lcqW_wy;2BYSmA%%# ze4bdNb7Lt+t9Cm4LyegVJujHxT(K`;qCO{pke0#T1%yrl{v7izD`{@+-P`j|#E=T6 z-%Pujq`ezJx#fT=)w5-ayNF#~%{{=LOh;5U!7a#8!-$tRqHtsVfS`%PAD(U703b}3`KS%4$p!`77fraF6@ z7^SQvD-~aBfBMsp>L@?v{HK5 zUHGe1HbEb#g;clbO{K?|%E#b!XVaT7YL*T$+gOazN*2;IANs?kwnHb4Y1rPoJR=# zWj^i);ZYC#!r>7t{|9J04O1&Re+5M<>pCgH_;U&DunK>l%GfAClS%}OkN=`VO+?`1 zv%FCfN2`tL?I8CE^hSfSHl!19%2OA+|!je8bFIsXsJ%+=?WttRNC*` zUD(X?W}(i^?9IaLGX~oAnVZ+<>Y`CXJQLpgFzW+Df#QZ471qk&Y>mXTBJtMOxV)3t`tsksM!yt4j_@USD;;o9L-{d|yv{Q3w&! zwsj3Ant&H3(-yzBO|;}!a(6&Qs=ddDyLQ#iJ`r8W%D|VIcTq}DPS2i8Om=+CV7l3@hSX z`*gbMIUkEK%;z=CWfha!VID#n-SRD;&%Mct9-fG}p(_QnDn=bTP#B*s2pTl6k95d& z_W#kCAB-h=X^&;;7&lFgrPZ%x?MnGpzrW(EJDr`#;gtIT8GTz9VVCpAtdo`4mEvjC za3sp*n4``)%tIb35bmYiW{D8898RU*X&h+ilJ-^u394lK7M+0oYJ!I z?9erc>e&rgi2Tz{XHt7&ZolWBB)29R^y&-Yy+b;hCzer;j)MIT_<}nDXYQNF{|AYH ztS$CWb1glDH@ddnB$G1OtsIm#sJf_o2M5=X7ok1Q$K=$bw2Nn7T&jFYM+dl2@1bfw zUw?3JI!6a$J`72%EZlZ}jeiQ|DM#=O6`tNAAL?j;210aRhUZ2E=tv<{!B;i=bKm2)c>Xynfz9;~ zFxKjX%zk+7$frV6*!@`|g{-OiE1>JvnOiQZ2JMOT)&a&9$4oYO+R8|1Y1abTB9B4W zu-TV9^VBG)-wVvgV)x(90++nq!>9c=zuMVLaEU`E>kb763&0FT=N%YnzMfYjtn+@MOP2HhnpX|_shlZ!aK`4Y zV`J&Iu?J?MBxCf8@?Xihxqz+=M{3GzBZfOI+Hq3zKi+?^K(@OcQay zt$tEYIgG1?7d0c4D1BEtdAs+VTVQvCpVK`(N#|+;C^h4L7-RB$Q{ar0v0hD6Yitpo zvg$dNmi|-%kLm#QoKLC7N~2{sKAxoRl(%FGe*SJt{NsJ6>}cHQ)Q&sV^el6xzP&Dx zHkWdt5-I!p;_3wIW>a-i?68v6y2Px0!|+)?u8$51qf%3hxsm(wHd&eK)!#~v^y!Y| zdsfilSLB$Jw;ImEB_&rvtPnWmdBa1Zyi=$1_Jy1D^&GJgzFoc<4~O@C9bdIS{IQ5# zkJPR1=#c3lVJo8)G`pm?@Vi|cutylq^*J93$LxHtIv`Y9BO|qX^Kh4ne3U-xdd=yz z4sHMEwaQ=!3pX*Z-qWAKm|%Avs3J!rf!x5T9Wk&n&J)1)hx2|vFNXzZM}FG;JA zq4$hS>%Df3jKX4=h@{lK>?)N{NfUuPVuI3ZW3UghO_{E;#gG)`F z3~n?fW3}te$Ogk-M{ulgkn6Y;Q|-FwTz=tdttn>+L`l7D`gn@D$VNHN+kf~+XWSm> zal;l9HPF&cGhvRlMwaC4E<{;0hcnkb@pGN@I1sY7bVmQe`br6JWyU69P_xh}5pU^2 zIw=WzX(_;oyH0oYNU8-kyVdqEJ#Aruxe}pi0uwR-rx)NC4|c4B<2-ua-r~~*UkCqm zW4d*0g0PYmC6s>TFTdpJzA4kS?9#o&*v-SEEZ%OQvBer}*-_y6Nm%HCXmUjB00`1& zGf}?L!$L`jn|Sm975hnyp0J0-w3#UP08TWDgX;bmeMlU?i%x_5vsUvwmoY&#>r9Gp zMZrS{v9{HxJOTJPj~zUx4BDeC0Y)-~uw2O;iF)WM{H<^h^i5B<|#gxmPF*1ROg&Oo&- zsOmvrF)`wU>d~xI0|wq>&d1N?5tkmO9{Dxh#DL8ewLoMs{kqpT-EXs6Q1>gD%5q&# z^yE3hIo8GGQ>3O{?barS&!`54`7s+G^BKGw4M98+l$;F7-yLw>@oIUC`g}BD0t+&f&ok-@j=-`7?0MPjhq!Qt_f6H1WX9ASO!tB!MP|9m9Jb72j_*@O1 zdIl=02d94^UDjO zMCZOkQiIGHD~BN_}ZV){ol;$g{vN-tQP@hro%OCWYvRP^#r-0f`Ox99%O{>Xt@g|n5Vqdpy@?Neii8D}{?_ADC zq;?j4VB{UWf2qYS<$xPU=jY9~o#1e=oiWKMO=^Gjn!&IYf9;pDwUa9c`byX-o24E1 zxA?1JJ~Lh-#2<$85tMcCx%n91-ZzOU!#(qVt;vb7lxw5ZrbH|M`aaZu&%v$CwlWoz zmp>_@ugWbn8s4U-@r{oc^VVb)kP%`1DxaApiQs}f;@Dcuhuf@*nu3(0fQOamaxM8_ zg#>*<(uDp3_ooK&?(mpI1A`liYayX6GvlMHwfOKAKKoq1BEgYTTZRYroWjeiFysg>1$vC?*Yx8w#Bs^|&YMZRy2Ap^3m3D^7jmc+$SK z^b6UReVyJm%=XmQ%|2m8>g=1IwkgbQl}_iE>q=8=vp>T5ZTNZfTN9v8o$rJ{Gg1Ne zL{gJWxu@3T{;#6^P9K)GF&X@Of?gr?s6?*7;v?75b15Z)SJwD7N|S_ZZG=0a#CXC@ z^#_WlzTcY#ZaUHgE4X4@$59_mAh7fS{bs=Sy8liwE0QF@E^uOi_o&^6UYleA?dEUs zS&jR>#d~=!54PgP-CKH|w?`I!_GZ@lxqWmjDa z-?Jn$gpigEPX9{ZTN>BApA&4liQYOfd{QL(i3NG_N**D@v$>;swI`zIA*RD=Cg`Ek z&bq-@|F#xa*R`{=iiVTw-}7K;)>K-Z`dAYkSNhlwXO(v%3AGGvV(QgsJ70NZ^D|d( z$b$?UW|}QC@AkU-RR4uDGmrEEo1di`O`Wl25}TLgKx{D`UC6RJu@w`Fg>UI$p?wEo zAxSk?K7;HDsUWZ3QZ|NrTWtRtSw8}@RtaDG4I=&w-l&1tKe3Fdb=NP*&qG^tPU7Bd zKf5)!I6QPAvP1PDUqE{>(9%!3$>g&!CCm;T{fsBm30y6kyFjsz|HRgDl3f3tMXfQ^ zs!ir<~gHEo`<{c;&==?5%3P$FU!gnCx`oscxDM)f?CUv&aD^?MBZ<`C8Qf17Kh4iTlx;@6XaDYD zs>JprsuyE>_QG3w>(#3sd6Tt)ZD@RX8-slNcMn4KS9|OzEvv$u@uWTfO=t~2dIV=$ z9Q`t9TTHa%YxJ9;bZHFym%G`;cqmRO_9FPq7z_|gv2TFVu2;AF$Hm`0lPV7enM+Ou zmiln2t_8dvECTd24d(-K9-nfV#dT{PZZ=*N0N@(C8C zhTqN^R>mge_kI&aAu48}^F!)j`pz!a^DbZ}8e3*dimT`)t?%Tgru|Na-tu2Y9f;ri zPT=C#Q+WqBEnhrvR~kBDIn{8J8syM<%Z&xMw&g77AOi-{zpDQQl?g8|`TO=jRXZd$ z&%j^w2P=_k-?A#`FWI?}6y$Ep)L)&jxcG+=bF|TQs7~ljhR-3@6>00(ue;+hNw8eL zUap^BrB2PsElaBRTJ3+6ZbgIV-2+}r>n}*>-T2xieu5(N$W~yZ{mB6n*`1);Un4$zWX+g*&44{xy1*=DIi~GMky4Bu(xN=8GR{( zHC_JHp(J^>E))k(;lK{tqVE_l}HWpc0w(=d7;-4yqLW-Q{F{vah&>PR+Xa#%lj zq|x-4uk~hXoMUnjJY7|5&Do6m5X~|fX#OFs*i2JLsqvgBgCh{GAvjN8IF#MW5cuk%Ih{B=4F#>10P#6d7GEHlIErvg}-n zO+OCh689GE7X5M`Ec4IG*?bMTr63Db;lq*h!Gq4llh=yvN*w&0*!Ur1?sreK!!qs7 z7KC~8fZ91?0+QL}* zmB5@ofm0JuLt>)>dnynkMFZ+V^m{Cr>!OAw?7xDh%zL6sMF7!oL>0?wN$beCYIrW) z*PJQ+y5Z-r&d%DI3c~0oRKnMHiFfWYpuW1~bkdXyIqXj6`)408&b1`ss{wz5O7H%_ zJV@HycAv|&l}jq1Tb_4`@MY-=324e01DCOs+pI@29o85^il7Sx^-oKIhC1+f^zm*q z^aDE%I;A_FchcXV@Vx(s;YN^MR)qf9MbKzIUQu5`{^OZ00i6n#Od+K4C1BR@M_B z{d!{7!OrGHDwyt(`-h`I?O163aziG^131$U6C`G@QTR5E`~bY3%@{1|7Ajx=R&9(a zcPlO;^!aO@n0);;)p)XZ^JtF|kM`zTmg+{z(mlV{g=ffT*iD0woEw4~)7h`X9Ug0+ znc!CCJmAi>P{_RvZCn1bkNTCow8E1ojY4NW@+g;hf?YK>L5JBP1@ zTv!J$gpLh{J1ifc7vPs3{0W4tAa20UAtwNInfpOsK%D%l8 zDca9is~g=BKZq2=Y6<8wB{ltr;shWnLiuo%L+h`!4j6QDAh|R`uNYqjyGJKd9(1xt zB?Al)P>5L~pnP!Ocp;jQON3WFk3Mo)0%E6e)qS#Hj?bA{c-5&*@pwRPmQt}l~15x))o6qk{%EWmw$7I_r)ntq09)i&8*F6VNBU$;7XR_0eSSc29Ei0 zLl2!FiU(!(Hk+di1K9R(7j~oaIkRl)eEsgzs#j*B$>DkIy52i2Wa6WOK` zVw&D-TwkP`>|VnF@B1e(+4^XzM;&?V{3q#@_vo;)gKbCj6_iIy4#^zFzorLW$g|sN zGs^ch;fwA@aks!HbyJpehkCx=%63KSc$2Uf@Dp||bRbWPd~C#tDOpV?T$JDWZo^k_ zLL|Joe(Ponl%l9UHgu&#h_{c0mI38Npw?nyO{U3#mT}sNjOL#4idiF%@v_64gc}=| zGCf#mUp2|oO=joxsI(DjS1-v%%c;wgqd1kWiHffiavU8WynE)otffQqhT|zex(VK# zcfIx-RL~g>X0ehKE8Ex=JPz*(JpK8P@}&znttkuIW-P@#Qy+_6%3Y6?+LZ6Xw8<60 zOqIc)s-sN8)lVpo#E|?wY#v;1wfpT3M?UZJ;Ro=~?AH#5L7LUD0bQ)XG-B`erza4b z=E7cOSQ@wcxdECdSqnoZ-GJfG;@ZWKZlL_h9cCZSiQ(3qA&gE*MieioOFW>PnYmRT5tGy4c@%Q@C96n7w9Zv^M1II z%uPF)=JRGQB%#XX;R#gZ0XeWp6ngeSbSb#DdK=ydQ|;>_ERiU;OtyfF^=UP!Ta;MW z=znDTypNjd0%P}r#^fenX!iazP=$;s3XUDeh2;2Ys7qCBV{AP)gJ>7BzezrLG*ljW z)w4eYEgH%%)&LbbFv+eF(uAoZo0U~XSUA<)$u>ItqNV7$s?pcoz!uThC99o9qoQ%F z7VA;GOA1KS#7yGO%nVL~B!4&slCwO>9`SoM3bj`-;&2BO0M;xT4-nz6*)x*|Pk|2P zCK)#N!OH_jhWexUKL*bTcBx}OF8@i0fs1c!A+b( zUTBCabdyn%yQZ!q$aX8Mq6kUo29uJl6C3>Shr^KTBQMk=Cts@->B??68b4)A3xQn@ zS-FJ7s0pTe)`VE{JQtn-NvYC^@|8a8%3MZ<8!^WdK9dBw?Uh?U`A3NU*uTtke`xicKQk{727zkU`K0JBNppnzpA&|3X zk5bNKCQ<~MUfL;q1BTy}N!#b?@ESU=pUEMgr5hFx{pe=Z)z#=WQ<9=@URz_RTk-Z6 ztHO}5<0;3kwAw}!_&ENIV%A`9j(j!nK(09NyHyDqn5>wpf@|~vbA>>cW8tl|-5S_7 zQY}^};R1g$J?%ErA6w>haD~p;u~5PSeUkiTnb7yo>d&bdcefTbX-3$zyPCkO)Lmy8 z&1zRnQvHDpeA6XAsR}wlZk3id7xegYEp$iq*mk)vd-YxVSlZkkC4hhpbD>ok&rGki zivK{e1>a{mOd?YjK!RVu$;Pt1ryn-`BGZJ}o`9P7>jo~&qFW(J8|LP=K_8yAakSvm z0MB!}(53(K88k0|JbjnX6Dhek-62;YPsc%<1HIe%gU#S$7hb2MEB!)8#LnK}4GlZ@ z5htvl@~{=V{r(vvA#_P>jx*G$i5|t{uQCh-`w~b$`*x6bN3r#5xyjjV68k9Q*;VNfvnbvg~QNb3WQQ30fP!)v+YZPtMQN-yW7mB#d=?zwdRX|#Lh1SYb#rrbtNk-H$#@Qi+%Tfv8tR?l8ENTRz9%>rb$&)w|cO3o|N_r<(`Fb! zY&smS`CD2_K$IgMitiz0%)H6?n%2g`^}yIUld%%=zR}Z2n=0K-4>Ne`+m}bLw%UIE zrfZ>}Mrluh$NvE!)VzQFn#me3w!rT65dcC2Bp2gw1Cc!{&ZPvsFQl{9$ zg$9>IV11qOdC}5w86-W~Up%mmDZXSY&h+^hdfFo<&Wta3lifmBuucB6>IxP=WuwN5oX4lw1^V+h z`clFxhSH)ONQ9XvC{%oErrU7)5>>j3j!r)uUTuCeGL0*oFrOGuv9A%KuwQG4im`54 zw^i9=e@VV-FYb4d$!&IM0%?|v-DT#>yxtBOrMyDH<%|FQ>!^CJX&AfK%#%`y(wFBp zh849#w1{b*%hQ5~AV-=1%gCO{CIWY|m73_Rcr96HM#6AbuUqIjUnzNF($$W1COj_wjUr_M?5B>!N^No^A6O`Us${Jtxqmx{vNEA2U9F zY#;lwdY});D7ZD>YoV!z7k-R|3a~2m;Q) zp;A@;dV90QxFgVDBBaP}c1~j%S_PqgKVoGt6~ZUyHQCjJIAm+v8@>J>VWWbxvB~?Atu4HsegTL)jhIGm`Zi1EQ(~h>ND|uZsI}AlZdUaX7&vw)B8fXf9ixdx(iQe|E1?$vgq__zr=n1yd!2=?Dy~O4xi8d zkaQpPo#2D)-$rHQwg`eUI4mY&*KiP9EZcQ{`y3J8LdFPSo~hrkBeKEfNNIrnn0-;n z(2~AM=uRSFLB^y(sa7O`Zs5%SED7*7rsDdpXzzr5N~KJl9P*xVAA&`~M=unu^L^!3r_ieW1Q+_BolIS_S_@pZr|;@dgA2u|3t00A&GlF zluX^|IsSiev$S{DHw^)2Uv@xK1G5x&fsRCm>gZ1U(ZESVGNkHFYJ7}>yo@HD`!4_G z3%C8x|M@d0&oN2*a^6sTO)JCHqAy05E8Pe70V+Z<-Pgc5QZNHvG67i7GFC4yHps~l zEkgOJ(o@@TQDDwZ1_E^}`tUEOVa{dZ!~^;@P}oPpb0W|hE8&Z;&e#IXjhL1FjMPE@ zY4%CuKf?;h4H+TMn}&V@DT}ocl2r$zb`5WOoZM};WHOH*pp5n56ZF?=Yrgtys#lS& zmkMAm-dPea`o;SDn1z%0t%0SPiZ1M}jlWuWuE@vLLs*o*BlyDBYxq2l3S4%Jz?Wv8ZfqHx_k8z5AHh7A2&YBCtwqoCzh1;E>+Xaip4VRi%2oq7io(w6JhO2R zKbe3jUvx#x2N4M7-T=1lx;u%jb&7lByNHcU*OI!mk#a zXWmz)x5s{g!(NR?v0;ojdloIT7c3|uEuu_Ug_rwh%bU;3-vBbMGIhD(h(07f~L=G&h&^0$^Ymu|$ zbP5S2vkYg&6Gto7`>uWcwAFrA0BTVLj`0dZwn{v3(97N=CMy_GyxOzF=Ci$dZrhTw z4IqhtmlBvL)puDr0BUwBGSFjXr3p89wg;*IXuPzI`xeShTQv#hpAc)za}}!UID0-V ztbxtr+d>Cs=)PN{kQ3~1hW}+Ow80+Mh)LKAho{noME=JyR8Bz4^)S%@MpMMyWu}7< zMn<;g&&5uRxp61kuWF%%3a7H6Pwll!zIgV4fZUe5{ehXUX=smvA9F;jdqp2kVTu}7 zp)%3&i@2$ZSmLcc@ONx%DWgrd(qm>%N<3}oVgWr+e<8x-SGWvqpeGbDqbR;^ttRXYuew-Cy;eQcA)6wx^Q`E-OlHi56hm1YKo>&@&!PRDQcpO7llE=~;` z*87QhDf9!>XoU|0O#6C;d-<|bsc_wKYOOm*Cty~sgCXnM+yETA9K`V zpF$E4R>w7cbZWlf$p9tub^Ce8cMdkN8=6O7DLrRSTEw${oPtHD)%&WdhdUUx{S{ii zDN>$yC4s{1A(%c^ic%;MJY4c|(cAwgEHn1saLSZGI$N65cV&>L^vhRG!!;(=OoT)0 zj$H?+E*p_De{YcpaD&tnPyJJ46Q;j_S~;$5&eo|ppZLL zT6=~Cr~2+t5f{PXY^(VH*Oz`vL;Ar9n*gKQZUso;jXDJFVF48~; zItHgbJ_Vubq6oI{_D;$}n>3%QnaA~oK^phU8u*U8qzyOhwYQi#O#P*e?=~J&<4bbn z-z~Uz{pb4)`!!T){C7>C>+nb9v6J98(#i1!#0R%~ zhp1}CkqleWNI&@#@z8om^?&*wO5ZDm(c3milCzJkJzU66ed3u3oa zM|iuv=PdegwNHi!k=uWZG6GdP-mh^KKDVyek$(3_Z0c=BfDZDc2ih^bN@dGjsbN8v z!>K^KSay}W4b^qy9bs3hXf-T>_1m0NqA*pked`2IQ@P~&-9Pp-Co&#G?Gq&$QYOK}wcK z{1H7Jiyo&suV>$Sm`L{xVcxB<54uZ*8;bJY@&vWkr<7z+fi18@iNIe_cYGoN%EUr1 zO+1ko9?Wi!AIoh`U4_DqLhhanL<%O2>+gU1+(KT@QyYK!4($-+IPqc-qjC{X4N@Nb z+!jz*{nwJ&s0XfIa6```Mj?d*GN3j7^Plz@y3mpT2|p_49SgIVON-&_lN{Zc>pbhe z5#L4*zNQP|cOk3!)zpz)s6XI4WaA9!JA~X5l6ZHG1c`a*DN)hotKSKtvlf?S>p=+M z&sCdwM+y^?hx*F@`gcs0R6J*WhWh31YBpXR`YaiI->9v0$oc!9E|SVGaVuuy)2-UH3Bfa( zrWMYN&{^nCHAETMnD>qpi0U6^*l>Ri=pX3-G~_9L>Ya?eZp_g@5z$+zLbM$=C-R~K z+f}DY+Ov=9pQO8`o?0K(zAFliCmQ?p9VK0Sn+64B^DiIttlSs$+_Oq6neJQtr4B>L zYT=kRG`>fk0s*TD;nmqzg7dx^dRFw+L|8*Vt3Gw%RcJmTfGtjIRXe{;5aqZ7#j%Up zA@!MpS%@=$x0gx-(R5$^|6Yxz4%liNbcYC^q|)pn8YONpEjA$C571R<0G)$7Lv!ed zrZoz-Atz_(1lgbE9*X3RO1C~9FnI7r?J<`5kFz$8AOKf66f{BusyjT=g!98pgZkr6 zze7mrc;Sgj7ajVi2+A)ujZd{Qx-mmaQs2tNzrjb$4r0R{_ZPtLpjKLHX-4*d{vAHR z&FJPeUd$V}`)`r1+af*Tae`p)URZ~tezog_K1M$z!6fdO`(nGQB_=GVaCGpjbWWLg zk(x()P_!m;9m4P(h2X;;GhR&Hy>`YuB1WV|eb3IEnOt$Z>Inn#xlDy{*@8cczGH2f zxFOB5NfYKJ=SwEic25FJtn__&#uPx-c*8ul9}8K_5r&K{wQP#jNF^Sl#%$#>OMsL$Wk7>zH4;}h5KN@Fo)hvLkEe$*(6f|TU@|MaGeS9c2!e)DW;COAp9k3SC@0Y8P`r=zau!qWPc z2z`rr^&5}dA2gc*YC{Ro*S8ukB{ zrHXeiua0wkNANs!)&>m@ooy891|DDc?56EpI85KQdZ$qf|w7~qAv;g z8ZliH=>E*cfd3+56N_}~+W)V;_l#?5Yu-QuV!<9nQ54Vs(gZA^QiDnnl#ZaF1VN;O zNUs|eHGqIpEkNi25h6;F8dQpi5PFmr480|U8q)UNp7*ckaNaNX%l+LiFJBQAQ`lfH4nk3k>#QMZ6QLf5@P|V2BcAi|cqRU}@d z+%Mu8N6oU%j%PpyK{2YBbBT0tf-lmA2?5n|`x64PW&PszTjd799zEbwA4~_;X zK9lsazRpxE9||E(!s_Obb{lL<n}MU1?&N!j{0oZ%3Z{9fk(T+LgUvp z7y8+5dOVyJ7z#KRee7}*PgLBeF<)rTwJGEFD`v;#1&3!;#_bYG1vi@X`U6~R<#Xwe zdwWRG+f{|Pd=7khsPXG^AIQT2o{_AzC@~7UUkVFbeoF{&)pE2nUU37d>r! zoCTkylW&b@fEXyMyYmnC9z+{5PA~6T#-FnW58$qESSZD`2QdWew$$T& zrQWRFx}o@yRO3aPdtAy`3Q7I?Ftzt5p}z#V#l<4io48aZ-xg?gwMyqC>57_;R=t{Z zmkym9^&{Qp!(5MQ>%@%h)BbZsSpUyiDz}#w1C_Vh*wq+&V!AD)HtkQSUdHWusZ>?~+YBW<)jslQ=NlYRIDGkGL!Go)@*;bG=YNVTJY zLg>|Eo(K+%!F$L<-vSjAZ?bLgS`MhU5MI_{J^m-{lb4UemBoZMuFYy@HK;A^s~1ys*M&DZ&p2zVDoz{KwGTcHvPknv@ZA?*+3vM# zFML3)lwUe^Rj z2FJXgc>hyU5|WHBm4&6!tF$x+oa<<-Cx^!l3xp@wL%UK4%SzcAUz&7JV23{&Q&liX5~P!^6J6SWsHG6 zW3vcYwc9_u2uuoJF$Xr;3|Gno{-Bf85gZSDZ*5%)m=Y>%asPW-lAQ2|-F31L7bVGt zoxHZsTOno#+y7EHL{@v9E&gS0`sU3pxbor=%G{fg+4)= z)BrNNmt8Dpz;rS=+D*e&f)bq1a8N`>eaMhWrfTT$5(!DrJCst zw4B;G6?Dy@?Uf9-4Rml{^jvTpu&~f}46s-&m{Eo08E|zLG@R{faJ|9WB`u7j2{~oo zzUBbfrP4@=*5!f#3I;8%S1b`CRP;YtCG*AOJ=D>86x3JCosgsfCuorUB0Y~`HgXjyN9PF*)xPFVUxNZl-~4BSW)p|F9xNk8p}teB2(Ff!idg;U*DGV%}&XV7&V zO@9x1__C6r^bRbHPCUbL1t0T4f`K-uvPl*p6|<<|mO%&i(aO)YJ>lA(9Mc!J&u_*P zd|qo1i8jRYJWJH1T6n*T+NApKtk9_4mm4|cm}?C*n)4pKpdrM@#3!*-bLdvJ&&`Qb zvjP+l84CLEyoE#T`XOe@`X&*0@@ zyTPA}tI9|HSU0|~rP#q=2XOWHMjD_W32OF%<(v2cQO@TIHgLnaOF4sT4;r#&JWi4E z-7DZ0GCt=j_{yzh@U__@>nR zWFGF^n6&_vEmicJ9&Bbi$pt)lbW((Ax0jfd6jAD$L}*_)8J|WSJ%3Hu8e%v}-)+-U z04l$H`4KsBbxmV9SwY!bbkYX$Hj1>oR1$9iX1TEE?OZo2a3yy_7Xyb}Bbbny`+-J& zX#q-bBZ`XO&FQ3jq8tcqDbponpBihn+j|EM=fi5D{pe96BlDT+S+;HEZta^P#{jyf zGZbG5%F_T_&FYW`>X1?DgGf8&1;X00cOHI#Mm7PTYe4)lefF?1Fj5&i2S6o%xBI*4 z@7W@Q^kn&7u907uvj!Lgh_22BWe- zKQm#K{H7!XYSsPNgK#0q+!wJ1|v6cK$rI%^lBn^u4;90 zXqAxN&+kJ26X|p`G|Zy{!u^ZtGA+3$w`Gsxj||aXdD52 zT*24=$H`N%AUZ)RN{&-XD>simLPFFKwQqR9WCXbY zPTLrQF?t+!AexTR)#XfeOV}M1=hJr8@+gUU{pstMx`_gM#@Hp5WN%k^nJ9yvF4!za6<3(c$|S(Ox5!Cvc@Xrx8{+kQ1$(n zS8+L8-@aMpOb;3D9SZB9&7=LzbI^8=Be~kH|BN|o5tL{@oC>GeinHa3$?|fxGu4+! zUWl{h4>1={9IEr)v1Vh_agM93XiL2(K@?m(O)B351`2RpiMlty1#v3o%n+2};E`A; zIWeS_&au>|p+tU#uMG5KG~`%Nr=rWq^iwD@GMu(roVL0;B<$Z$b*kC~J>CG87Y#Q; zq2|DXQ=zaG)KA-Y=%L1t@Q0ZZ=#KCh5ZdqHzpNSK*II>qgTNi!-o|H%;7(KZ`Jd(7 zqVDP$L6+iE$aw9rD(O5{aABH1)lBhpyxhKT(l=QZ4>jlW3TO4-NoL@2o!r6Zq!u$+ za^786>H=-{npnGw#Jl^%Pd2ShxhdUiNbvcRm(J$RSL$Ea(g1HkUMQ?Q##xL2=0>P{ zxGm5QkorY~^5zDd2w;&+%J<&#f-vA%^h~}AuN81yVId_ z@nCJo{ukfDD}r;&v)vp(uZxRi5co;ZHt^~>jcdJU^9N2Y(!OXN$k}q3AqH;i9SdwC z=?+_O1~$@gP<3|>+ZRvw;`;CdfLcuuD#KE{(x|Qc*%D_rIx5|0K4e>A0QH+`&y5q{h0%`?FJ?C`>P95Uc3_ z;Ka!jz}=V3F|)nF*NZk+SD7rGyX<0b?C@w%Ez*ChEz0UYUg1A(^(#8?ukVo2;ex#^ zJ#ptCC?3a9n+Qxk>TyiFA()jGcbWyUDp^HA9;d^DUiQ^PfGx`7|IHm+vS6@i4HNu5 z+EAfV9Vvb*a+2IWo3DWeM*iPScNH2?SfIz!Hp^NCOF0;V(|X}A#{2&s`u|bk|L22) z8(}cPj^%qhkg(rB(=pt?|NQma*~Yct?+>9jt|GVo^Yc8e|Ic3Di*S5yUeGh;6NK$@ za^qk>9=oQC@=H6-%;N(E!~HdvA~lO)4sR*UpaJ?rtOe_2=H_l50d zcE)}N9Qoue&N)<>11BPXT4;lff)Kag)~3n7Xfyu|bwhMdD9W`hj)Hk*8)1v08Wze6?}=U~7`=i(_lEUXG-l7%zuQDHZcJcQYrQdV5g0-IsAWhM{O7)jy z&dl1~JXLcunuc;A@BaMomtEQX``R7d)80w1!~(oaEej2x;v5q@rjLja%y~Cx@{N|_ zElTs){wsj`5BU{tgN?^)$XoC^R)lUADg{F2nlXKQ!xC^~h`wuAwb9_eq_d~TcWand z8n!-E1+i0(_Q9b|95mjwsH=)yaKApzD+W5RACbO7Sz1S84{rbY#pVANoTeeqp~%Z^3+$=9+Z&^wEn4;u|~+d@RmLQ%4j76`7uz)MQ z%z7-l(jY85wMUw@|DD*_zwYL24r#k)|*PUARE2W^vt|;an1o@C`kP|;OGGOOCL94!I+#Nw_SuZ2) zmipJ)Anvv|;JmqpGD;xj&uCn7V+GX^^+*nSSzrqhsad~m-%xCLJD;T>yJ`TeD#W!3 zl8!cUBH%QbIJYl9I#;VubI}CLq@SY7fz=lMQp+F5W9zhP3W?Yq~mG{zNzR7M(mL6Ke@W{tN_i97bSOB6m5Sjt8#EJFxcogtiEm=2on^5 z9ZME$Zcc>ep~aitq*-5vJ}ZMr!}1sze1Ef4Q^1=Miosu5lUGF{O?lc;1%&E8j*E|EfD#tl*X*c_oomRQr~nrV2fuN4F-wKPN-g z<+}KnA^u~`>MmY$_8n``P2ZOEVwu(^)99K#OoXe#Pn2>QC~i-=A92zb2} z86&rD$4Y+$?Yg?@2725zm5jsU#wiz-p2lg6&7gwBI3iiS1gsS8WDnNfE3H5YPtsd* zS*uPF(5^Q%r_ql}HXK?5kOfY{EU!z&>gl)ARn7%h>CB20Jo}V0^BHHJlv?-%SgZE9 zL9dnxPQJa)fWe%*xzfKUSHi9f!f~&~9-QaRc)(CEv_NLpx0fTx$SKd*NVE{#bNqT0 zo1)3XR@cQ%!8Y}zRJ^aB^XRsM#5)6{rJ2DNr1$!JcdjOds;Aqh2ji6xE1LDCf!4H1 z^mk$SYAkxuB=h(qNshhx9b0_ZI&I9efO_!>gvEUeu#o2V&xvEoanBRnqUTk!#o9UO z4<``9g7Dbx>jdm1lP=h&F2DS|O}S5VqQ39J?AD4=60`CWqr3uuDgi_r1S!&rLD1z>-DIkbK2WH?ZgWac!iZLtHlF5 zQ-#-KvdA8G;Th(Kvv>v_o(YiIu-P8~t{NVBK$FHu}w(OsOL!`fgxQ zGzS%Hkdx!(qj%4G>Yz9Wphr`^Meab6)Pd#t_?`0H{uSBWsV+;J^zZ7ik}JZC*7XXJe(Cq3}5$Hzbikuh+j41JG!VFA4eB4oWr!NzTm12 zq9C45_!PzLFWu8L!te+_6FR?KF$#DF4@ieX-!4blVw3{0B3`wcRf$~oXT0o487|hP z;o1JI;e(`WkX)mNSZ)Dkcg*<`4fhXExNiBcMHHod-@51-xJQpwVuEliHSc_TSmMF! z^3=0K`b*_mrs^ctpj}|yO)Z%HoyjQ|ddiM7BFxRwy+S^rj#%5L-^1yo(CSyCEyZ$o zS;?2Vcizpu`(VAvRXhfJ?!m=|iQC=o`a&pHtPS$f1YbHF&pR5v?@@M}09VPCY@>M;ZEB%&-0=@pIHQ;(lQ|Jiahc5H*)t+hW^ zde0XjY5x4n)Ek=wV7a(w!f^=zcU=wml+l2D@96IG=1Dvt`E%L zLYXeh*493!iczBfB@$saDiu?~cs^#Gl{`J;KQzHg*_-RGJmoof{$5oyLA>y*13><2 zy+P_)uT1ZpLZxpya9|7#9HFkhJ$cQ3wp9sy+sg}5r=fnu?GaoE(*w4S{7 z>82MVvXyCTuTQMvy%6pAAm@iWlJ*1_L;@8~mLxA7-Z#SQ{MWbn=E^&PkQ7a)g4Ejn z=~WrzS!1{7Q6Asqz`je-Eb4NCfkQ{05m1-5s7a8#*|5FcW#qYG?y-KlG@nb0TCN4F zY7UR@swuAdN^dH^Es&%idv)lEZDJ*KuF_`x_P1e>_hZB-IT-O=#_PPw$CJMPo%oXJ z@;wICt>=$u;IcaewH<_qrhy_w?;y^2+~G(x^;=ssk1X$zt+3vr@LsT=1uO;k*95=U z`PuZEjK8B(`qr+QPI6bZz3qE*^kgv#xn4*|H^O@Ab#+%z2jEz(`W6Ivqcr!25qf4e zFy1e)m-|g`#0c#HE*YLthAeOo@d+ky;V+|{`gQhS*QL7oVI|bx6tSx&(wB_ z9yl`rt?co6&0#?+&*V{*@N$(a%b`osUI1sayng@GFAs2Xlej;?S6RJS5-Kk`m%L__ zvpd~tyOHw74_0+ye5c;0uCSP83KC1zPDsb&)Smqn{TFmhrNV1Po}j6%Z4#q;cjaU} z=|9il``MOv6XyA7sOs%L=7&H@Oirr02gT%G;(8aXtiCb#v}(&r_4M@!Ascf*ItjH0 zP9&(!()W0TTs?}darB-%?~8r4AL`E7v$cvlftcDdLr}YU+yzgzT*sso@%Kft8n*J~t4xApL_>4>Yu~T6$I=9CihP!Crovw9W-KvXvF{ygr+mk% zs53_&*Aip=ot#lMpW3+d?szu6ArFaTdh$wW~j_*TpYhrL2h7^%6=GW;-DC|V2I zvfI)aA(y{`6Mq}6ELeKiRLMSZC-ua4vT0TUc#&D0K}mnl&!oo=0k31}L&>!#EO>@{ zTSL;U`Iv2r%g#IIj58z#D5qs8(qZC}$n#*8p;X4Wre#{sxrZW3C(6H*0Z!apoeYg? zFqRq@)zX0P=L8*V<*Gd{!($$`&W<_O@x$g4wn(FhSF|lcaYE&lp9yV1UgtPcI^w13 zjxc?<{<28T=!q0-dVqV;WCcb=sOE0ljtWPv0vXPifwhmtxX~f^0J7TzU@gZ9i4RNk z`_+kIkg_NA)!hk~p5n}bm7y_??X6#7pubJQo~&-eC#Fs1F3WcK8L@ zhf{)yk1LEJ29>a@j;%GptRTkt>~$4tWGD^Eskb78Ji_G=_Pxxtb&beAYW^!xhi*dp z`l)R34h$(A75%fLbz@<5h3Tm*sfx4%(M8Ab$m4r?5=eL=MZHYy&c4d?@|3w*-;S{$ z-2p=MFmCeMj8yELgWMX>kES~3fg+PT0c%j`>cPkDN4{i*rSiD8igOL71?AJ_e{8L$ zTUz0IEY&#%ng&xd%at{%%XNL=Eip(c+G?C34j=<{uRyq?(XW<{Z~ZeM4b!c#od*@I zOvI9N&xb7pwf*$>$HvWzA3>Ts^&CnJNS#PC-^vx}&4tzz2y;V*_*18x7w`jY3kKnO z!R9sX(oNOTlVOS=n)T;5O4KvFz)bd zjItax$W2;Ps;Ji`*mW5=4f#A)gJduo{oLr8M!<`OpYAc}kibikzvC9Ly4{jfPg-?( z<_sR3RqMkSihX^6AdBYjPajxi`_>blG||edd|2~Vq@J#Qu{?!G?++YE$Em?3T$wM> zRx{Bo`hv3X8mVIoA%E$b{Iyje-BYhv^URSX9d;SN$78qCY)VtYv$}F&>e2D9k|b5< zazXGjNnuc}Na|3`i&PKUAtA*S%V+{rTbgxN4v{NL)^~atc~>P>q&GW;hLZkx$S- z#JFZm;*;&Nz#LwhW?HNF?A(jHb)w*|<;s`-Ax zyaQ8`#>CgbvKfJXy5B-9aH};HJ9iIqKYe$7Y?PF|#GVU`eiu9*t97@$gN90AkqXM@ zPwDNSvER?WF+#^%=z{O$zo%^_`c8B1l3bSIS9ks%tHvM{^qDIZb1J&byAo#ZFP8Czj(M@XG-pjtdMN8(GFI=>AubZL%%K(~7m(eH zx0e)a{a26ELBMM+L!jVj#6H@C!FOv`FYy8RAyP!f!Xmbd2|)3#dyf|RcVC-& zd&ij(Vh%C~c2+;>bZf|bUS)mjhx@J=Kizhr8(Vb~y8E-jNpF%i06?j5kbR(Bs>mk0 z?h&xZOjRNO*4uLZ5xt}MV~8|72e={|eU}9pGM$_b&YnsDO2m#$oI;SJXF$I{gMOpq z^5a>;hLb3mkv`8}32Z>(rSs!&EtE_B-hyLYWkuQQLu+EMD~TW}kk6$8~nTAleP z`a6TWiPFa1CKj;Lx49eYHZ^e4;GWkQA=Nt7q7Bu1X`el^E2{DNS1p9}goJnIz^jDW zRTq$Wsl8#rM}5LS_{(u!9C#%J7I|pb7c&B0smJSpL7E?sD*cgx4WNi9Sq|Ufc>E>qJ;H`9!?A|`G$Udbl-aHA8hH%ld2H)ovG*U;f*#-&Ih zCzQAcbcb#9SdX}%XD9{xm=DlejQ~;8s#KD^N6~?YccqtyZY8z^VOBC%k zX7wdf4K`IC&lX#q?Fx)OAS+@&r>cMxOe;IwDmx0Pb&F~B)C zWfVl^jD}Dohizd5+9Bt;0ppVnIBiaB4m@3tV;8pK#D7PTV=qTx&H&c_MjoZxG$)l} zR$~Lb1Lha468#M%*DR`)S_iF#y?n+_<2H3N-yBf#Fr)6N=-UC`? zmw`jcmkai%GpuoaVc>z^3#;z9AM9$GkhkYc?WwBLyHea}aqY*95wIM6_9P-LHO^N~ zSTc4{1dcO|s8U5NosydBHo5<}1AHaIG&P-gm}6_rG8F&$_3narK|_+ z?@`O&YZ6C6!_J_wUXoMynHF9B5pb_KAW`D>;?0sijUR^Vb*X)3pRtoh4ORDhq@ zGYxcIQ!?3nk2j8X6W zlug5{cNUtm)Kls5S(@@k*6{YC_q#+Hj695SpGt9T^<9%529bP_NI8xM;cgy!xEIi>f_I*ELh5(MFA za7%&WQZw}^#pbgaQ^J{s3#&{if{rRg){4i^|0rOf{ zm9pF<=UY$oSXHU8uP!7cg2D$U8O-33BV{Ehsg^G?UDV$rhUrg2v1XQ(mo(`OJYM|f zdsIZSMDDZ1D?+Wi<|>jTItivzr2}z4cq?~l)_+d;7J!Qb-#b}y32=YQ4Zt2?&MGnz?QjeZ#+!ORj#5`0d|-8lAl)XO;b*L=YQkHwu$ToQ)O*}_H|U7k#=3tk z1c5iil*_z;glG$K#@lM`)&4cBD7wgae_!L}oKb+rSb8qA)JL^^u5M!ket5Y*f{uFA zG<*3WuTBnkdj3+H9BiI{Hy$#&oh^L8@7WlwLRi;P0x|K}3-gw-1LDRjd6JOFko`42 zNPpXKK&o0K5TwVkmVtmry9{q2I9M!C zdi=eZ)DcSdz~<%Z$1@?U?>`jch+a>UF{{VwYnTC`)?BS$cKC=(!YyxZ&tpE(Mw?+t zsSqPT@JXmN;I6kc=PaTWw21QyJvj1gY$NY*M+~^(7vpL_Epg{5l}_(drxM*hJx_XY z1|IZ#2JKK9xk;xUCGC0FNH-xwkK?c4Ftur(3a8D6%A36?U*i{lsuw5MInb7NwC)BM z%c}yZAh;BtNIbd*JqqBmCM%Wv*6;+q*w*Kwr|iQc$O!brQqU1K%Jzop#99^J=TR5# z9=Vv^fzO$=i}>z`q+)dH1N5eq1HK!Wnwsgzpz0>6&tkyMiUekHU#`E3kDVs#x+cq1 z&|a7^kc{nJq(bBiLV%1YDDqS}BqcvH{GDp`3H_I+%%?aSe{U>~*SYFYjzvpxqaHaG z$*WkN_K)2{!$`RkLK-;!mZ|(JRaC#?FdYuTxoBc~CNZ49`PGh77$e}d?eSMh4_+Oy^JhJHnuN%90;nC$9$H!3nI5 zwRbcd5t-1e4>9AJzqOYup<}3F4esd^8NeB`yvXrG3e!Yd=~Qd->7ZMIYJfbIb~{AD z_U{DV71%scDj&sHa7OAT@SYFJ35g9AG5s_aEtvSK|H7&a_tmA`L>?3T#ArBy?;-`l z${S3#=6(5$6zNtS&go(75cIhb=WiH=w$Q0R0jGs8-G}giR?D@qGmESysS5uqIZx|x zb5yrz4i~Bw^?(Llm zBhjlp5U+A9{=oA)Fg(2iW*5lMSuYaOXtM9iD9ngp%mrjc3ZKdDBZU*2!p4Ngpl zw5U==^jj=+$LGv4bT457P8W&`uVJtm{;Qt|#}10}gYTEqm}cRl24Z7sp*OUIYWO}Y z6%Sw^@SK+9$Z_w##o9GlP&k(E4NQvrZIEmR{+4j&)JB+)_%*d%i)G!E3b8QXNsfrr zk)UAB;Pbo;Hzx(kkOH4qP8Rb0MBd=4yLfQpG9%3}5M!x@DgYsW&`*@y@iIuzFhM1Dw{S!2J2J@4wI1VYdZfta!dj!z*Nagg7|3akx>TbK$ml_`u%b!fkH7yIcs@ zQwu6yvMT&E2Tmb`vu}Y%Y8p?AdpF5=sbY+E5kC9+@KDPcvC!WAU|d*GC7Bwt^OT?u zGFQyT@m5iMI8+fel>h0;>yr*aE)jH0ZZ^3FLC&zG>~u_^?FgLnTK+zh;D5-}_IT_P z;USEA%~sA6s-9pAk1#^R%QlPCnDJ=3bDz3dJYEbeKgtO@bDYzEh5t?!+P^00!41ac zwPlk(wiPA_(SGsS5AI_mOExdKikmkkRw8lmFN!shF_9ZgkBomEys{O5K?J?3PwW$ob~<10f=&?`jK2U0)Q0D8(A`rpCb-4c+es3pr}< zs>JTbm}C;YswUu#NZqWDyQU{-3ewl-3Z}NaZKQ*DrI+q}3duYv`?*zmfPS7zCrIp@ zD;AUuP9U>>QU8mBO{NP}4e3o49-69GF&{;1`kgOWN4wjLouolb-iA_~F}7{Sd!2IT z#Q^JoQu*;SN~)atsz)?Gfv^Hm^7}RYzg_VCvahUQZ!NNpr6vH6;?xW(l@FZCfPV<; zdA*huq7C#xsmchw$-r=stA=n|9B7oGdRFtD*U4Y3yP$|%qE0HQm@uhA5IR$uThc8P zB@Bna`QXr`7c0s<5=u&20Uz$099BxPfl);`{Ahtk@oAlAPjivjr1%?b-?(*KtV_ zYiD|oJmH&kZ^hq0i3f=2jfZQGBh%xSq=t&ZDZ7?Z=A4A5>^fDuOa+~k^YP!cU^-K$ zB_3QtOv>hmc&}Mse@zvxnZ~q?6f@|k=gLyhDgAVjZB&TmQN1@s5$Grc`DX|j(C~cT zJ2RL~{9cq@WH)4Tvne6%z14|oV*+TUzdSGR)pC%RBiIP&Ob`8Ziz0d=C*D+u9jAF* zWwF0P_MvH?`eGyK@MrMaA2!ql^EqO)eSAA7K?kW5r?N(kbf=*tu7r%IX`DuoX&k9J zZGkDP@bZ1h98xY?GF2~vAyq@XEGTX{kPgqxAXe%jCt|p$Z9sT!yr3n(syZ_bta&%M zp7yc!hfHXMEz?+hCf4X3ZeZU_LVuTXIE66BR;#I3-y3}BqR^4tC9eojrR2I~?d3V6 zE;=FmeA=K>(b~3>R4FY)J^lp^)9KY_bYl1KA=hnr`Td<(dzv0xBilH`fD){ZD2hg_ zXx2l9BT4W3tSPr2R-2Jb47{Q_ptblRR;qYrX^_%Q2?)|7dvpl{y~y?@TDVPc=fi|iXkY%aEQ)M;c_ljd~M=+ zm1Mo>eITwalc$DVnDBd2buJZUS4uTlKOkQgdNZPdYo7oFf!2g zWA3@gYq2Nss`lLu0o_gv_JnDiuX#k8yvxw|`{e-@$zta5=uI`o54rmlKY72ZUBPBk zm0mKd#KJky!jg)ce^xt7!^e$IPW zG-bQ^Dm6#b@PHyCLBX(OkH+T2vy3-!ERSx-P8S5Z){A#IXUMM(I0|)gWlEL_iGvi# zCW|rB@)1vqm&Tq!WrmAC6fph}$#Q+bekdo^UqY`k)v$`KLH~^c>o~=?5!Uj;5cW_T zT^YR;9v8T(t6NjXr#2#Zjml}oLF)inzfsI%FC@Y;(mr87=Elb4-A^<1Y7U#U;Hg$w^;N=j7_{LcHa z-A@8ko+>_7$<}zeX*jDM_`VJo2HU1;9=a5uKIziArEP#hibykONaLx!Y?USY13|^g zGkf7S-ehV=wNQiqNgw}tYTBZTK&1bR=en^%?7rvY>ofY(rm#ETx3m^4*W}!)-J`CQ zF=C9#km5S3Xi~z@J)n+oFSHG_A5U-G-3Y!mgPHIJ3NQEfZXumu4|TW+ADFfOIg0+k zJdfQ16`}qs1E9}!9FzUyiW3zG)Z=i475+(MAg$9IEY20lZT6YKM2(^p|{tKz=X2o91j;&lQI92N57 zRha_XEWda#DDmuFu5$;jK+i^D1n`BHEJj65S<8FLD;xfKqi$Wszn)1kEL~DJ-MY=d z4P30>Y%npaKbPsS{5%d8XrMWOKorG7XFJts&31^$DMfGf@d@^9%r3VL=bc+<4vMegX^ zERi=<>)ED2mU=4RL*T}XlbPNRKSZaUXFcA!J_G50EI7oh>tsb^MymT_b-SJ5@)SIC ztjrBg%S3;$*F1!+H$1R0P*d}|@d2O6jtD$;HJR$iY9W|1*c+#4Radr{Bs~C#t-lNL ze{ZMhAEzx~MwV+9N!CM=0q9I49=tu>cF$LHux2E!DH zeg^bq>75m45tMZMOfmL(ts@Xg{-zoQnuy%GgoNV<%e}B~<+ptKB(b**h<*}b!9bco z;CbEjxBhcFXArXkQtS*Y+#$5w`@-p)iO%R@;&0%Nj& zUI6YXiHM0sZ_pDQw5Qzswpr~KO`aD&^V(0dUdd^CGq9_H`B{w&4l7vF_d0#uA`qR> zI}9@7pwsG-Y|HB&z2 zC`&yRDeqfj_!V!p(w^y2+zxuwTftby*tc#hw1!(t6qABGm*6-LSQ_9TId+K}Ocp*5>xD%hFX=H^*8fIN+nuyaDy9c#s;@@M~bqDHm*9&#Ui$v3V z(EeA%*NDA@3E5);^}u?F0Hm8gxQ4gs!4f;xWW^oy7C>O90JSh&OkSkQhAA~x=sE>PInQca!z)t3z z4Y?gg!y}?Otu$&j>4K@2&EmS985;C8*u1&8U7vFkDw0dRjMMRak>K+VTkUIRsnKs= z%BJpwcti$fah+)EW44ze99GA3?rs-=JC!s{4NmS1T-pnLq+Ew;f_Cl+^#JLfJbegR)X zMO%;u8cMx;uo+Xh+^Dc4eA~Ixh&6}+X*^u?|4JDD&44HL+!mqcVk`#E^0@n@>zAm{U_D2}_$A@TR()M0WRj6)gxm79Jryi&@$)+jGZieCr zP~oEW+j^**WbXP~cJ;i5L3-|G)Qll&*S`r(yTVlmMS&WX_h?ilIc*TymW9-Xxj}7F z8G)s>$shboo`m{9<$E`3AX=Rb>jZt+7BM|O1~Cm_AzabJQ1y@_&)$!ZUKYM)sn1Cu ztxmefAzxAL;WRyQ_HEN3N((<03K;wA^r z_)_#yp&mK$``Hy*md?v_XRCJj3$M-ClaqT_psFVHI^~5a%D_Gtk@^!mFe40S?5%cX z?R!Z)vG~d}2~Z;;ZNR<4Z}mld&>Ni-Xeb)Cd~O{^x%&+){lj7QY`1|s8=2-#D&>^7 zG^cCn9&wHK6H-U`)gI0c)}Jin%Q=}`KCx&m3Ngp5n?d^>@tbg;6%d+=!8~Ih?f}=Bw)arrme+_yD3gp(y7e1d;bK-HtjP7zi1o~m0;n`%v ze#(ESA%91cV9vcv{~15@MjgZWpPy^&F#6xiKN9$#H2#PJ`s07n w_@6ZXNZ^0U@JAH?TN?jUhW~$*;YlqhV*4fvD7m2J|7!%gS_Ya$=WXu)KQRq)g#Z8m literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/come_closer.png.import b/themes_src/space_pixel/alien_animation/come_closer.png.import new file mode 100644 index 0000000..136230f --- /dev/null +++ b/themes_src/space_pixel/alien_animation/come_closer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpb2y5yrv2mem" +path="res://.godot/imported/come_closer.png-ae13499f3f972a66c8c99d6b0a5d12d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/come_closer.png" +dest_files=["res://.godot/imported/come_closer.png-ae13499f3f972a66c8c99d6b0a5d12d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/dancing.png b/themes_src/space_pixel/alien_animation/dancing.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2238a3d1e6a95bf61e1935f2fcb0604d041797 GIT binary patch literal 260710 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

hQkkZx3Ga0+Yn1W25F~fgYQrW5_oJ4LZQh&R4ad zN}kkQA`lhJSgcldt06Nc%Ea`M^O>A9)aD>3#aFzc3HYKvS^2}!=ztQ*-p(MEhft@Q zbMawJMs*6fHNiRTPZup+7k+gKi=d?+npr!$FN!VI(o0hdu4M@PlGpDlU_>w87bgmN zAe$}P7t<~j16RL4-H!ed9Mg-G$m4WjUHf1rYj6NH~v9+jC`2auO!cwece`hoqH6EZE^I<%CluXA^usu>ew%i! zVbi(;s!D*4SxCUki1tO2lH%NN!k;6O>|a+td6V|MC41&d5BHT45|ZxKl^@@f3*SM@ z)Ne!}B3g_=vfKXqzlN-zYoykKl(YP*{Afx9OZ-oqy|2DqgFFqX)LPo;!%hm%<{-iw zjA$$r9h1gFf8LTn5^N70N=VpOZ)4vO5_#h9FiGZ2Rm_%^r}#N5+!4*lCqy10FBp~? zNZZMN{;h3gmeH5$g`BffJVitfMESI;0vcBj_#deS=3@8Gt0C0ZY_utq<> z&HU3_!`D=rlpKdV8SFoAEf>>`YPB6^1_Jz!=}7dNN;P7Cabf+`Xgx8mmmzWVF!nLxs~_VRx^Z*P5(0dU>FpWNzgyYXB_1K*@2R5V&{ z_(SosZw}t9nA7Hah5c`B_P%mu1k?xuRU%&#+0gL@w4^>|*%-!O&Zx>!-f&V)9>q_ix9a(%Xf_Is22jS z<_z6j!R3ii4x;BF7A-6W-aJ>IzDQH%AoH~run^6(D(}%Qu4l^gA*$-$u1qeJwUw~i5$bq7~zWxrfuD^Q}+YKj(ze#wuE*R+Xf9RcJ}mgET3qqm*#6h z7UAb|aSMy|O4n(|2Z_1_w1NB7gi5zt%YDTe21I-OBT|fb@B)7y1S+-y_1h#u{JDig zdM1e??Zk-0-L(~Ne0!S+F|1MLDENC2!u}?5P-Xw?DmZDh)Lsl%9sM9r`^pTKf{mAA(taR)5%(TrzW#?JGtgiv?zHN}Q65Ti_j7 z81lx}Z@Q@LKVXaB_1saI^aTq_zPIPoOlS;LjD%79`KdvPOMcs$<@pbAfTR6nEU$kC z{%P!o#YVRE%JaFkX4tQT*q5)!pAi4SG=Mg0SRUl^`{vI-A+TS5S!BOp$XjgE2j$dE zfxrgm_8ns`#LSIpz$}l1UVq)~SJzC9RsAV?v9p2I-O$Vo*&Z(x2$gI4XTk;kI$3t7 zI~8+y`4Hv99P)}kWMYQ0A;`WZ%?mORp#KAWifbKM%H|6#@oaNf80ce=w-or*X!+@9 zi00tJdd8;s{Jo4e7p%Wkz7rba^kZTFH+) zyA09K9)4e>NTzprUHfnLi_bOO%lL6P@V88mG!bXWF z@p6!oLLigINJ8Fz^n7>( z*(t9`5`yeRnpC!8pH=4Yr@QJpm75yapEln)8ue_Luc~9XLcq>VHKrX?tDOVPgeJ61 zk~u5;leWyN2K;6Q)Fn|dY7)62J{OZ_S6dO?2lmdC101*X2XG~{v24O|_vlDDRn!At z?|UrJhTW*gq=A)zqL-22pO9xi+Ph+}XLXH|3yK7elRK`oE%o)c_3}rNKj>F@KW~Fsf!Jbz z=ihN)EzCz2cuk!~XHpXK0LXWl_L#plg_}@>hCk)QaL?Sy!>~1?C#Yho?&3PLOnS>@ zo>~b)u=yd>@K)~^EX|_JKyW(zSY<8ZiSw;KP|M5IVC9ba z;}?M|UOzge?DN_Pg$$+^(=JnN{Nm+$8P@whqgEne_2c=SdDvBF$>{z8yG&84H;3^~ zunvZ0{$wpt`dGYKHsf0pTPrHY68}}XB@$IdL1J6k@Q1mJEqZj$)GQzWwY;KDTdH}_ku{ePL12cL9vBbO5-`G0;b|W zX#FQ&&Nm>7sym>`o976HTu_V!K3X;tu*>&^X8I2w(!}o1fg>Ph%i>wjL_Sp|i>FnU zlKnrk6rMm3@PVJ;`Lhcu`t$gw4k7P|tQfgm_enylw-EzH_3)A0r-+t?sI<>!A4#zH z3>2{;Ea8Sf(fGpnWH7XBR2R#p45YSnvBY<-IvkwGE5=mMN4pE$NX1-oPQr`wyEj2G zwW}r_McU4b2NIxhAbe9QLaE5+1S*DwyaG4}%!kGL99Bs~=)@P7gX4|y`~T#zM$19y zHwh*AjBsQOV{B9q&NDduuePZrQdh50Rxh0YJ`Uu>qYcG!<8O-8AfVsa zq~nAcBs4kfzzY(6p-;>O7ZAW_{+Iio5^3sH6;cj`H2A;0UcO?!{fLs_mD-imi)@$Z$9eI_V1=BJ-+y|hOCXXT&?B-W>=;kY zk3d1BI}Y8#uhrb|w`Z%8OpeS6Q7M3&4=rBfhWEdjO=YQ5rrI(ZbZl6ml8vjrG$3Sk z0v*rFl#YiyXHJr|NOWg(FzYsFW*tw0Hq&muk6jGDd8yw&?qwV*5|%x_C-&xZk`c=) zbU&t1%iwn}yfxM^fr_gpQX1QUt=f)J8Cw26__E29AX3Z;rU>BHh1=iq`*mxT?fd+t z?zpe%I}gk$$WgeS7>$eW;%X~F53S$-uj{&2#2u{^=a?Q!>}!6qh?So9!6=5x^x?}3 zrY$ugrG`xzWZm5kQH_9|y#AydKBM`GK^!@43$(wux+!&+b|Ds;-v`~t-Z=l}fA(?< zsgv0#2@05W5cwsA`WwZe^s8ee@NY?*wkSX4DwRhkE?>zrv2!Z6MGdKl2v(EHP$bc4 zUWl;j9O@2;KlI0+K|aveDE2xr0Hn+U*u-8(FOomh>5GGSnyv%@mz2!^khiLz?>OF0 z)n8cjcoab!ZW3Kd0Ye1w0lv|-&=e?dysj|>u+5X@nFa4DYyyeH$8E}T&-}TjsxK;y zXT|>cMV& z7=G!eW!V3aM@xl5*LHnJKwq3O@@CE4^6%nHmQ-J%@1?1%;n4fPpb>Y`k!Mm=wq$Qj z_kD#_XtzdzfW>U>rFhPw7%k~@P0awAR+ja)%0}agUg!g9kIa3+deUQ43ZYq$YLs*N zdlAp3xS(SZlyxg$^SlTr^e{fy#U+a>R|e58o+V@@=*AcoCl1FQ;h~xsn;;~SW|SL` zc0VgrL9`jJ$Oi;57vqEi*pIn_#|0+f7;Fyx}w%I9uvBG^B_gj{yWAAxUD8J}TOMrH9ltr0Y- zp#{XUBFoj7h$ZZ4$;#K_0P#$^=LkpxzoWG3s|_$^`M?5cgrY&Go;?l5! zRuJvk=i{;Sh`Ph$31V`3p;Zul)xLX5jSrjZlE634;SGq(+wJMXRsF^2L`w#p1k#&B z9wEDCCO)XHE_!b=JoGT5x@SIcu@|09N)6-|D`Ox9d<2bi1RQCujH*V zc#F_i@({`3kLWZ9^f7YrB`ezZKRzW}v~*c{$&Y>EA2lh;eupBKoLZG~qz)H-5>_jS z+U&R1KpOpR?`F~3(Jr{br~S=qJimWr8do^|zyrM7hj;TK=7l+bK2!ALYdfVyve->P zO?Rh8uOZNcugY)pnonOplJpiLSpwDV4{{3Tqh(1|!v=RdMSz23nFcb0N_yV>t5r zD%Z~vq#VJ0EEk%kf_2j`LdJIQph;FzoK8K|o}=DvD4UvJ>+^F0R`v7+lL_y;lLBaY z;AuBQQ%xJdtw{UoHOsTPCDe;k<|8SoGr;u>Fynf+zhC@a=4AB7n}^2V-~wsGwlX`} z{2JdLMA!vx~{I>T&NfyA^RgG)>sWXTg6o~t0B*K0eZLBR;i zxj3fP54r5alhdc?tt4^eRr8<^0=|H%8iB@S@g=UJUJnsQVjdTLZ|h+&Go=I%u~!?a z!2PYc3x;T3fu@Wl1+z;ezP$8A$tnPUR5&}|qIljAtzGbP3>ShIUTWj`;%yCQ_Q6`= zytjzqR%i};(wbrU-QlGwPgLVJrcqXFEz$1=DrC|Nv)^jQ%g90{6-bso#ZA{(whOdX z?Da!r<4@Wyj9xhpesGoa=myZ}B2mY1p>$}*3tu8j>!pD2?DkjF?b+rMTb?fi8@@^aV)hN-M zGp?+ldB#fP$f7MiP(vTS;>E8DfR?J^gn=TU9Z1Z97W(RWkCiv)8SAy6`^PK97S9KF z`L03k!ElQ=;@`hg%jlFJfc}jzcS=4{Xc3fBQl>_YM@RGu>2@dGvKj_f52W;m+~W*r=PB&_td{KNbF?cb?GhBM@)UR#;?J4V4yimV z0jE7p^&RNGO2Kw~`~lC&{OFMYW*T+f*Pmz--;~FPcfxuWSzL6;S3g3d%__YiM%VXs zLO?+e2L8M`aN7L=cO>xaF`2-KMb0#q>Px{i|C$J?lZ`{c;Tr6$I%C+qBTp8{t`x98 zgGI}FWQTUb%C{Ai-nTucxEnj_HFJc_Ga^((t?)J)l*mSbb&I9xKPuw7Quj}7!IVJO zT(Z}cq*CVV_lI=w2fDe;FEsU^fQj|uSI#|_QAW=2xncEH-iRS5%*LXIPdlEW0oS$E zvw%tY0ciXMGFK4DKc7Hx%+a?Sn-O$1$w}VNTo@+s#M=ARnfd*zIj&qF&n@Xoz`2B@ z&PsTdYumd7=|hJ|%AdT;oxL}~GfxsK;{Raz^xin#kBM4fr?SoCLsC4%tna4)Wvb&k zEfCjtoDW~Guf407xm?B{sCELY52sdhwO4K^vfjmyOx!0$oEPM^aMGMl=xMJ)ST>w1 zH^k?y1I$ZUOZ;l`S?mUYqtmcfrA3BD)b_JCunX+k7@J{TcRte4q~14NKO98xc{ ze5*qfA5xdl?`*@S_4q*KZ{X5S2E?scd=~*B?&pwSYWEm7N!MY{y zTpTi(=DSW5ZA2Jli2ch5iK93Adj!W^JWkZ+Qgeq_Z6yh}{U~c=k#>r|?D5U>_4QZg zTV4+YUD($RoK_5e;lMQ%HMC?*ZRz#>ffk6e42LC?+3WGxSFLR4)2$~Yp5Ehk(0MTq zSIEWNGz#qwN1=|2b>P?=ULu=XtZT6v64l@|9@UHY%(gu7DE3nm3;vZ}0b5X(#fQH) zy4f8iUcI`vZz5~n8)o9+=MaxA9s)EdhvMtWw;vJUU+a%GUQ7?1rxxQxXZT1BHtM?G zjU@kMTp=*eOHI@0$KF!G9!%^+HRg85=MrNlr4)qjBMp80t~=d@t4{~(86(_&L&>yY=q zQL6U5pLji1)yuM;N95`^TRO{9q*u_SE`+_BhUWn5{5b>?T11gr}F1$2CZxHm!E-vwZJC{li_ACc#XE#wP=cE z=%EQ^(vM-iKrFjhQoYHCsPtI{L2;IPk4ho=HXGSGy!)fj9OcEk%At@rlq37wnC`05 zS9j!0mC03;{pdc+e0p{{&MtY9e?6z=P+pT3sY1dd!s-patG__}+l0bmM=RM?KV5}J(IxUMQlXm_M|v9MeA z9sfYeA3@rrhv)Nm?kNjuT>ic?gdpMKVLX7{ZI-{#+?mFk4_|9;!RVd10R+d{pFtxo^vd4e>Kg^bsVRpRxAm>Sg)HJcC_ zR2XC`UiO2E>#|8cc?9uZE0oH>kBp3KV(6u&-Yn%WotJs9)baqPpRlR2G*v?zriasi z>a$4AenwpJ2cT63&=s}GFF#Jd2{lFrfW+nI##c*Q_aw$^a_0He<^E!-zTb2IY zV@mXSRGz+l#y0u=)pcJx8j!G8f<)5s&+tXeO9|*BE)g>F{hhO?xhBuj`*>w?IHpm$ z5kXWoT(VREyVuOI^K!1v-`@wIz)J*?dg4vE?kH6jsE_n{T?So%bc;_~ z|K^g4w$6GSStr@#{O98Eiz^gavW54B(5gwa>rc%4KeDRdDD5PXlUR5$oKf9z3X%WQsy zl$)__=(>1@R#f%O+~s4@p;MQ*y+OF*;gjsEv}OzWAg3sHrHP$&M=&9O`oEKb14wSz zV(i3SlVebN3%5`}zSQDbmkc?=c+Q~r%@+kh-aqeF-trY)KRRJ-t-Tm#mfC{Xf4}bh zX0vwTnjp{gHSU>Au*r@2(vPveR>^?xwAuP%j6~UxxZ#!VDBl*N207~q$VG1YNx+SO z{Q6(fD`4KAzNh)~q>nN;`v*QnXN^JwbeDDqEksGkAsI-EDaoZwg^=t^jRcJ))*9`h zQ=)^<8w}qwoWKaAEyYfB>}BIvPtWj*_2Vp(?JCg@0i`ETFgrOr8H}k2jl7KR@S(WF zHB9S@0fNgcX%WP`C}9Z49OxjiOXrtrxqwDmDPi6=V*dG~f;jO<*UAOOIElYr;oEBv zcwG)0ZE4|tx9;*2FvXW9o*cJ*`nRALKk!s!_Xi|gaI3?)0INr%tHa&gg9oFcS{5#m{3&ML95=X;St5|`@7MFQwA5tVaZ&mH#h(ASi0IV;IV+!=17dx0h zvXtE^yS6z|?!Q3&dZ%y9Oj%gi3*s;l~ zqyg)r)zz5xsK*z8MSR~qOphKoV#>b}A+{L0hGJyrUSKR`U7E8O;h%uFYPltg7D)w> zd%Jt$1ty^PbAjGN&*#uN>yqeU%aywgo>-_vD%7cVR6Q2d_Bw5Wl_Ef!W_ z0!fAXG3U%NoL2w7>tu}@Lpx=kk57VXVDC@w~4Tg6x_paBXg83g=q7cg|8~L~bFyu#1zpkOGMh@2I08kw=U4F-Zpb?}9W`>rp)7O@(gdbdAjk zEE2P&*vg@Bl8vIGoxiZ}b=M|BRW2mRpNKbu^;E3bu~TobTQCSxM`j|j){xd&^tS=U z9lH23UN0<{icA>lrhA5^wv_B>OvMIMOw9G~yWel27Iu>PW~%kOX6*u>yLQbwD(pPL*}r~~P@nRNhQu-w z_1rFIQBkZI*i9R;Et#}v@!fTcOn%ezqSF+6)zcw7iyFnceukB(~N!ZUjkqP%^8_oL9}-ydobc;eI{(djQ-oN4LtNma|c7@3`qyi&w(+>bTx za-iA)4(jveqvV&yd~#ErP>SgGSG|z0WQcn^!4wURdb@_=eQCDo>=7eIkT*ZyJ4Pwk zvT}EYnP`c~GyR&hp@6Y5Qq}HAaAzv=2L>%u0NJ}!;%v5UUJ2G@X{my(cP_7$Z` z&mQejDI5MD&$P?NlcK+MMZeZQ-b(E;DyZqe9AA!ICX`W3; zlkwXMkmZN_Cf9O-?!|VTTjonJbF(?Qi_Ixwvr;Zk&)Dm$OPhB_{i^GD72Xw6X=y*YO~%XiJ?iCmo;?TeZixd`zMh!k*}sQ2Q8 z-;g}N(ldg8&q<0M%6;=;Ho>vKteX?2q zVlP#hXkSupp^lZ4IwLk`AXjR2e)7jin4%9sjsle7$Xd#6tAhGIG+_%1Lq7~E|8UTG z6hj+3-G~daB`vy3pv#U@y9~-%KuX&|4{mzbI6v@i z_n}Oa``j`Hzxt9f1?(8v#jkaw;OT60M*BtNv<2nQ;gBwfIEki&O#qGVjel93sG$rk zz=s>3e`yV#qCLH?TTZj3)v%(t4k(n>+hX}xV) ze>4NlZhu=)Eu;gU1#%e_h%vgmM3CrR9c}cG3?8J#wY9#r6S)QVzywlu@t%VHV~Xs^ zam6iLYD;DL4VC&+NPUm5rz%J!jGF0_)91 zMe0PK$;P;`l&uEU0cNSjU1301$yW&4AeVC>2P4(f0cYKfiaJ>CgffYxyrjR4roOFX z3%HC;D0GCrU*>>;qA~!l(3QAnI@14yY9z@^xx2a)o1_tuK7PGECMYE*y#vhZ`6P!o+8AT zWtc{US8zHK-IN6JE@W7cztL=?<39+g*=Lm#=`A`rIB@hy8o4tpiHVaAyDm$;OMk?% z`8b^wS!UpJRIDuKSGf9e7v(;(@oWJ=lT+MPtLak+n2!VemvAfZp?@Jq^Bc6V9L~WA zP;Z55x2rsZd$Z^Cqxq}zjQuJ?4+}s(w$uv^rfp2|L;Yvbr=Hs^t9&0e?WqvF?8VV1 zop9}}7yI4L)M1+Rb^4yh6v}m6l7#(pHuC>14x|$i^3(3l`qA!T&b}xW&7Dlkt+F4) zI3Ms2`sb6942u-werXeYgXhja^+wMC?0*dkw^pGAt1QsVBdPI}5eA-2l?Uw^Of7jY z&F~gJvsD5yX4zvq6x%-#x!L0*K2eS;3Ur?gF7ogSmC1xvAC{CFs1B|TbfGRrlWPZ1 zjP3?Y5RssT1!5JXUqJ(v|%Gqtf{S?f=Ls z|MnPxyo#&*O|vi!YMWJTI^3ESc^*YIeFcWc#X6(0yGO`FeO*}aTT9ju)A+R+As)=1 zt=9X?1h_0FT;+`Xp@c$tzXLp#0pWdWX-z>)o5f6&O1+infj(%DOmO{ca{NSZg|m=D z-m?jj-8+j+PkW9#K7wv0{2o{h9~H{#blFp(57sVT1EC;@GJvfm_(Z5j>}&I_Hy(*2 z62(#J5s7&WFiIW&!ykoBy=-ah_dY-BIPL6uMAcmF8*v#y*fz7 zYwj0?igg}az9o+qDN*cbV}7&6#lX3XCEjyxS4_GPaYl(yr=b@g7ZDL(_M|?%1)73$ z4AiIiC@b(6Pht5MoSQ}L{m?7U%Rf3`AWwU!4r%xHA6Wuc& zDOu9_36C3uD!!p(qnH?Y$E?(U4Pf^b0Kf{>7rI{)A|fZWN>o8!M%(8XkJ!%~s3@5s zXcmyUQSZMfKtQsu3_Tj#E0C{YTDU^dxpRLio^vsNuUjmbgkK83w{?E7g_8B3Nl`-d zz-8Lv3PfX0Y-c0w`{0ZbryW{{1U(^%-&nkA2qmJeV zmuHBZ(N_kOUNo5`9CCo4l) zJm9JCuZbg6uAo>|$J5nrGy6xj|B>~g{+pnP8h-4N1_p{;hH0Uk`+pm&`5Vq1<1V6K zynk^R?7mRI`qgvuv7fcmyZ-*3nAtvuuwLZ;8kS}J@I-a)qIS5VIN?ope3L?;^2=jo znP27mA-a~@F3!fPRzgGMTM`=YLnVh*%8Nk}`fu(retj}ezp+vA9MupQXY-ED?x@D> zNbNs|qc<6bD@pYnI(0y!#!1(Y0&%*y@z1LWEk45!fy!=__Ky?$ihhBm(ed}gv?n!B zZ@X!x4h=;mvn#bF0Ca`!^?B}d65Dfz65b5j8yhw;Fhn{^`A@jlD5hkP)VVkeFbG9Y zf)ij;>IB$f9HbS~7EQu-if!0Ie&2hx1mVhl<~$X^WX_%yY5rqM z1wKo9A${lCTGE9t&sjL5|Mq-z|CXI>A+vq|XHUt;E~FH!HadQ{Cw9!)mu?q=eaq(M za^%d@``OQttaXnPn^?w}{CH)g8r7gnFQS3`?3n*`%&?CZWD*!+#=4MUrU(oL(r*e?!_0qEt|9w zvn9jr${luBAXZsT5&CT^rbrW;%DcO!!D`2zGNHeCh?dHG@%tjk}pqV@LPmW_`zAn^9c-_O~K z?a?$91gIeLbK@bM+OWlDHC@{)Xe|Xtn%UZLjw1U>U31v&eYh*Z_a!_0{gL*w8+a+w zUWB?vn=SZQvy0+!mOOE;KpVNVRh_Ww@}8uI#}MW=2g*HS32!ct>=M{S^6Qj7?6*6T zu+6%F2zE}3j6@ztu8pC--+AD_rN3F)KWURn49kK-<^=qF)EZGm^;H}Hg%?T~96@di zJdD-tcugX9mc%`&+Y1q!x)uLnnoFt^}QV+qHkEP^ZF!(Hb(@Pf582{W4)2~$bprYs@|OVS|LxI1>| z0^S3~1K;9;dN|s-hg*}*=BDmMWU5KcA|@R3r}_dgH@K?tgs^4W4mJ&Kk|sS1>6T4v}YOJ4_8UVz(yr3=P?vX77t>3o;Lf?5 z5(gqpyCN?acG6K0W&H>K@?N0|iL$MLApL)PIM1z^f$y7?^{e;@nF?Ji;hSeU7+Pg{ zPF)2`WNo{E4tG(n6p!G#p0nQiO2Y0-rPV;==@*GJ8i{cU zT<#?Yh#k&N4CI-ywIJdRfZU?fJtJu0GToLzgfbtB)}sULmYW(cpl? zCo-WY#DEf{baai97h4bl$l$MhDdO`VAr7*weE~Xigy|aE!9QJv%>t+5(_1*xUgMDu z`qEH+p1I1+fPo$uzauDhkP^5}K3E3~QlO}wH+#BzgC3ltKfWLdboAsM>d~TQPMcoZ zF_iY@UF_gyD8W9qm;=kw0`5vlZPJXlRrkS#iN$*Z^TfLtwP2$iGx99p

OTx0&e=PA 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

&M2fQczI@mi`2G3Fww@;R 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

2-_We6ys6BBk&g@DLr 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

>?m4f`NwQRV~(^;GZg!I%?he- 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ⅈo^5?z;YVM_Q1Xj7BfvQ(F6j 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%0A;$-h;oniBkrt!IP4G+OFnh1 zDpiDAbA(#|&lB`(4V45+#yWn&Or}s*$@HsQ42Xb znUg-AAU={I7xXSw-2ENyGFdlQMY$s-L^}T345J-4jd2;oP2<1PBv}m%PqNXT5AyLWHH(#GpU&9WTvDPyE|CsvNS?XE1&s&Lh zWM}vClVwRGg^#D4Azr*)qz(89{Y6(ye({P_vkAL@^(HF=CY^MBjBZ9s#S~Bh%-*$; zUr=8kr~8v>LGGUYx0y1BNT`jn9WDbhv67Q?b8-JmvcOF{S)VJB#^Nh&53SyYTCJm6 z!piqe@(6 zBKGdQagY4FE`z#p9$yLo5=5H^WGk%^bG#roXm92i?#l+ccV(fBbK#{6a+g}`FSvve zVfuk7OD!%MD_~0Vn6kTOQIqz`L8%5)pvECbc*>FOtG8c!;89FuGNo!C7-IW8E3-tm z47zI+HY@qM;q>wf^*HeF^nouZr%rc_|c=wj>R zX9)}uZxeKgzbbjZ-M+$Eu1k@Ubm8hv?O(i3b1-aCer?|CQW$RYX3}`Xm8*((qa(Be z_TOz$2^|DDUgS3J(~xR?Q2SmN9%{kLpaKAhI_Sz=DdURGDbk#!l6Mz#KKxGWC4E?6 zB`$gwp4>u0YAu=Q<10rOMhJ6zl&+8aVmHsxh1_>cMlO+&(+cqM zW0Jx2c@YUG1t*as>@MEJH#{Wg;XDYD9ytN@P31VuH&#O2=kQJk|13eqMv}v&T^lp< z2UcGXG<<6lk7=aNcLSOGuS~nGbd5A4=odItHs7uIrqHnvW}dNVcx+$!F~{+Mn-V0q z=@39;ugNsM<;BzMM3N5XR5ozfPe3%nbNe0|X-NcnhDgKoxL0|g{G~47V18mz^)w>o zLPan%Rf4TD^`v}?%vf;-oO+I9Bktp#4p$yjo=_~x5T9}3X!I%a1F5|21Y#uBuKI-h zaL-Q=COB|Let@B`dj2qE5%#hz59?q-g#XTo9tXZ&MZ-7zT4E~5lqEvMG@a1SzQumb zw!&c@wR1*nuypPSDNy7O!oN^@ZB0o$U(zTJxw0j(X)W{_hcbwL%$LK@b@a>COG$OF zZ9dPo6a&|f;c>D@D#Mj${^yQr46n55Dvlwi$6g}br@+w8nJsXe%wq=1+YzX2Ir*|g zc9t4-uf63sPL^2*?KQ2Pa@%60h_;&q6X&zfOUS&9aHwTF>>wDtK|#p;lXKZ75;`*j zCVYdao=;XM;4?_&lvcIUY0HBf+iXH&!I2Dd<8TG|EdhcB$DUyVP337wsx`$r!|8xR zM>wn)BEZvx)a|Sm5*jHuz;TzHi|Td!&Mii?H7J-;-CKkX3rBfG?5-i3&8ezx@Nq@u z%5s_PuB)zS8Wc&PYgeX8;Dnu*je8A;?V_LbV!K3zOG7~AMWgN$=K%Kn;T&xrxt!>; z$xeTeh2w8HI9TTWg!k)?*vhL2M(K1-yMv+WiaU?2+5C4#D)=Vi)L6#7sdxp#qEKUx_J`@Ubs1cWLc}(u38| z3AbKbQ>@)zbRm3%QErbmdC=Q}}H zPg^O9;_CNbDul|Y(uTEYqmdd+rV$_U-p{=GO%G!gJG$TnvSgk5RP}Si-IcE{CyKsI z1B|1_Oq%bzlqx3Qq)Vn*m9Y2HPey8gm)nM2uS`$Wll9aX6}e{zQE%o%d9RNkhP$S)9YU^NZBY zFacH2Qx^%N%{w~!UB~A9+9NE}CztThu7=kiNxN_o=M>=F&qCQ0TSeMfkssn+ z>LjR9me`C5qTIoqbWm<*fqeF5=L1zQP{qVw?fV>FQ{Qzfs3>gZ!zD!gerI%Ip8|x& zP&PkaRuD8p6!TT35(jg!7Tzj;UHwm7UdoH7J z-gAXySS|c=HzPQYNUVJanZ{{bOi!o(F?28d^6YB9tnr{p?z*7?to2P9J~H7HHW|Bi}t2 zwwvkGrOA|h(@0V_A;XT{F3csRWdEje;|RPYj%+PMQqF2-)b-XS)fEP1_c7O|t>3+w z!1iygu*#|F;`FlL6Y@d^_R%P0T1IhQ2~02M`c{WLNxy&;2jnE)JL^mXl*3Yg@*omK zd01ELAD2pmdNj`pkY{)qB$l~O^PV)kVPvdl zzv?W;94{F|{hb*>B50w3c>Bb=9I8SJhH}2e;FB%~) zWp&(fLnU{U4{Rs>p1QL20wCfTFUVdgJ_5|I`z6=sQr0)<2>Ck}SvCgw0~X(X${|q< zsAG-rP;8uhiYNk~jTd~LT%Jn0jso%dz~Bbfu6Cz(Gb{J^X~Y)Ur7o!?lSxyfQLVm= zaMQd0Gb(<-d(^_OyZSrc^uETzauEDi^C*dmdAncaS20p@YlV@p*hM3PUsZWVRZa3{ z5>@|yrM*``(@XO|90WnSNbdql5tSyr_a;?Ar6UL^U0P@fh!l}3C@8&&(h)TD&{295 zkQN{cgcbsUKp@FK{*DLF^WMHU+>r0=?9A@8-TCa-(?fTq&M^ITF)gVE=q6D4@gSpy zTRb>xk{lSsc9Z4NBz^vkc0PdXr|gKK2-;iwlQ0U)^7;Gxe}k3WcubSRhtpcO4Q9_t%f*Jd90P3-(yKGidsmxG&Nzz!Ux z#7Za|&pV;AVt}EEy1yf^7ubvkpI%Oz+nq?9ecC$tUTm7DNX&6K; zrb^xaxRq_@Bu3~mx^ zm$7SG#^_^C>UDw|4EHD+Z9lZ^&Ng-K6RIx_Q1ortWt~mVDl@5ZiWhuM`itWUXS)G0 z^c=!qw*&aLN1idn>MJV*vyod!la^)c8IX7j5(BS>FTUIGkhO5|1F*sN%@X=O$&{Jc zxL;9)xm+mqsa}^Jk5U7$%tmlUJ6nXlK<+*A`%*xF{A0h_gDySmszciCr3*h_sEV;W z;ervDd!MD#o#tOXwKJ;LiN;!cLr5{9 zK}Boj$;Q3A6b{E~0)dM?Yd)$jk==Mzmy?68&7nC~s=>$X_v_HfHunnbU*l2OWNcBM z-f%SWfWN$&;1RhA)=P%1gtt?zL*Gr@_b02>Tsq*|Wl{I{qVetY@yrDHJm>S27JL^? zO!`J+>*Rd~IQHQl^X#7^rIWAFFTe+o$m+45Q1$#m@5zr(jCftcy488Ga4b0aZTR4z z*R8tJ39S{!lhYF|X=SL&4>Qv3nNe2?F~|$IQ@HX3&dE_^X6_@set1-N`@k=*X+|vP z!?jaHxoFJj02&1g)|}~Gj4U=Ui$sqGc4vA9zdsqfVFM%;*`8klrl#N)eZP^ z1mNfujPB!QvQqG;u|C)QC*~0WS8-Ie5@Sq5zmq9~qB?jU@^0%QFtr@5s&_K*PPOVA zxNiLz)Vj*SQ{tXe9a>M3g!X#AuDVD{3MxByx`EYKu+JE|Mr#i}E;ctJV3Uu1SSxyE`v znTY!fE%9U57>SPUGA@JOp1_;;6le1E@Q_%-GoZDNzHq;sLcRK<1bzvJxK~X2Fh$kC z6|vw2@F@_kB=yY2&(v9CgVLnF=IfHtTWJei-WYky^I(*KLvzqvip|(P>2|KEqK`WM zd@HkW{pJ+f>OOU58ot(nY0+9y{Z{D+^ridTdO{6`MB*9mOQ7Rp3Pp;1)uhIxLhX+P z3ItMga4QG?!qHkNveNb9)Kj5FPOcU+uua$2#h=`~KB2Zi`h9+<`}aJy?I~K!vEEbb zVE>GRwc7#+SQstIM+C?$7YG*F0`h{M;g0PhMAbrHpeS>02~;`{Q--*jW5#Hn)aSaJz(r zfzROFm>Cp&-9zHan=Wn8LN32@jb#S6{1(%vd{qpkPLjaII_UV!xtLsb{x@CZw#|>9 z(&0?b<6@aNTj4;!l3XV)l9SmXr*OEC9lN%;7S(Vi;$Xyelwj4Aw`h-*wFkH1iH7Z0 za5ceQXdPP1fyG!prEYMXq2{sCjZ&G~MJ*=pUhwTpo`z=7L>Ov5dK^s1ibAtm^h7+h z8W;)jQviz9zy3h*p3vguagdLA2O%Y^3a9?q!ZzASzjW8GigeGnpG)sFh1eXPV~}l> zzm6Oi&hhiuPETkHJ#qqba0U3RJFfJ7#M@jS{}2dBg4CP}eSZdg|5kZmv%MioZQFq$ zJS=VQA1;}@cKqfkk`Bu&plfQg#`!YbmUC8fGLPEm8ubS=EUQ(kP{PP)9xX&4+jrL& z0jt_1D0loI#p#M2&LwR^L+Ajf{J`fwCS>!!(snEUf=mO`+0s;!0JRW;1wL6Z>z>zw z+pagUF`_R0@OiYOxASBzo_M%xNFye0a!G>CW_c4Dd<;m?mX9FD2Y6p)UYd_#dTkiC{x(O)kTzuJGSkTbsnGSF@^RJD!nV=8y7odm@a6`%6(h0;kf){nf5fLdYcT^sO>O?aW+eyg4@X}MHtk8Tb!cmpuBV@eg&$=wD^I__FvWv;%| z?(VLktsBkQiEbKVh4TqTMoQ43>(ExvHT1|6v}`;!-(q2i8(@N#X-9Os2CwA_;*%G! zbUgsRL;DlgaTX(=;g*2|h$+Pt#E3G*jvtCwD-PNjYAl!vmMYW1q_5GOz{~qDlBng%i6#gv0k9*txlkNY%Mc6kmS<6jD8+dU7RLn_|RWqrsGkH6&tG9ACr2M7xoF7!o-f zN35;RcGM{s!lznmB}bJ%iDVm!fq_R z5y%Sz2G@&I{RjntHDD~1f8AWVK=mh1wwgBCFXBipLEr94Q?=wx%c4eSWu{ zFPTTChQ5D+p9S2|DWKnCG@qvN4!BBwZc&UENxASvXH=#bDx9-MY)oGI#Y>?i`4xMQ z9p9q$yy$}KomyyHHKA#qP@=blNhwfw*Dk@mLfcc1+3!$G+S7xy!=mEd^Mszm)*mm5 zOLp9g(MaK=b_fEOeE6wdd@K|$uQNaL;}qF^M@G;8wA+?f&ffS>I1SQojYRd z+;u54#TlvieQf{I*O$^ZfG09N6 zYJ#XcdgK}!+UY$~EkZoU$SMI_3|qXTcz-=V&w2?9eRyzS@9s%@WE8*3w-P!I9@7Ua zz3^_cn3mXE&9_pbA0rLHpR`Qa`$Zu^DocJAD0|8@+FQA?$F&aw(6W+%NVK<(BCuBX zL>31_>>SBUYlE*-v$e7ZgJO9OexYI6v+dDs*OwfCJ8@7I=6J@Fa`4ls4goN0&}rB= zUc)G`!kz#g^LiN@yBvGVw>Vg}W3cTVHj_ykC<-PCp(}EW#~ToE1<2`8tCz<{^|VZz zj{XE2spfbrV2AJ{wd*l{WOptKk43-rE<%r&FPO1GQopm+U{Y1rqdzyd3`VhI$?z^P z_SNswaPVuqvdMmB*44aX4JTG0FDmc`$>Vf9P-%#o$JIp)BjI3)qi-ga%PIsvl{6qI zKPtlqOe6SsMR^PZtX#emxbk$XKHw|;00~DoBu`WD5JcLpSo0Ery-@z60Q8*}RPyfA z-dffaRIE-1Ibht#+i;}oqMWD)_m$a7=<&~GPY}^BRCD_gy3BDj5rDC+Cwrc;vxFtqfYYkLHWT(nG2HwE zmJG`6a*=qwEqX*4Y$++%dLkf)=VdKspLn2Y7sNGENO-WLr=YAw$-cuY7f{c92l{5u zU;|klpo=`d+bz-Atd#xOg+4%c@fOZc7Ejl(9}9VYevRDK*BB}Gu7EHXZs%r4ec6*9 zH_Ltyi((CmB3kfcET_Eh#3s)pm+CAtf?s$pYhAyk9wE^90VuUh+I}TEg0A_(rV3@Z zO3o^|~jqsr|M!AH!~ z1j+GDHQ_z-J{lS|H_K82D&b{92Df2DM|wRAl%*t(ednDwMJ?3=)s}BRaHk{CZ~@wlF^tG`rd#r zt`rgU`f{wv<3v|ux`M|)&OOv+T07;J{aGN3U2&4`bFvc;8MRm3#_IM0W{o#g`LpoH z6sO^+AnKQqpCdK$cyo*h&zyeYgV9a*ZfBCRou^8=?XzP*(6J{7NRD%>M^tA&#bvpN z9BypF@Q95lk-fgh&C_P3upl^0$q1M>_1rQNQ(m6pQ_%^39*}Qv-ZlwOtTPc-O>f1Wz8x1q6D__Dbr0=IxPL$7#*U}XyS^FIIY*h_>qXewg&RENc zetA^P&Gsdd2_)xRc22=^qOY$6bQ?Cu`KI8qwHgtMKwi2Ozcr()s;n=d75U@%o^+Mr zZwH!TdHp;*Vfflbzq5&DC zRRkw>3OTSGvkyx{4KLo7JGXDGYRYZ)<{}b8I&vXy;B!KPs(?`Yt)z(~RgpT1-gEq> zO?XVMrt=`5VHEYLj?a*j{>XK>RCXwvRGE1~HI1=aB4OY=l+JEA!=x=&R4R63D#Gx$ z#!4!T16Mr<*8%hQ!*TbV`kzUIg!BPg=Nd_B_#&i1sR>iZRz?B(6}Xq*)m^!5x);}z znYi4ziyGafHb$6p$_1Inp}`K@VA#uZhb_u%pDBtXf~nk!>uH{!BsaZyG6tOs<+*BH}6xZJes=Gg10i* zu82Fw+}HY|H{NdMrsbAOYkcDamM_7N9Jp@38`Le-%((Nl!w4@|1#U6Et_$`+aX1Po zuX?0$ky|kQs(-1cg@wSeyf=Mtm`)(5;bAb0Y8^K02@v4LFnN2BbkhNVd$M6rw=G6H zR!WVg{Ahkt<5~)FUBVtmlqr#3`6w@4;bUwcU14XrFpg7iCx#$0OL@6`ebiL~pETA6 zv-o`Z73tTo@cXNz02NKFSaO>^e3g6|70=D>28mIKcjr3qD8cURdEA;ft8YPOwWScP zbNhQ^tQ0GDNJ<_4nGm-#8BWiRJE1TcmYOZB-kIIJF{)a(&pVvw7`@|W(sD&FseN@r zbu+M%>&K9CdCHq0eZp1AYP?c%RshZVd0cW6zVDtP;m{S(k~NOJd`l4P#-@i*(IW?4 zW3kZoxE$baxVTd2q}Ze_$o9}1JtB&Rupg`?bqcPF;Ihv1H@6(vqfbrxPaX0Jqn~LR zp(~k1lfA^#ryz{$3wC+qREK!-4D+DSdX_L2;HS)c^^ublHpV0Nb_|g$q15-hs}wN4 zL$cFBZ?95cNje{}sf$qjN?G4$qrd50OZwcX;c!=JHKuMiiAo@!YU_9?No`CC=k$K{ zR?3ZdRMBvwC@!m7m32GOFlci^Z482@i*uf=UBUM;g%Dyq%DEs%TnHDM>b*lRlO1E=3(WZGGvL;#jF@#=*tiyA65=_um;5a2>xGoP#Bu1)ukc?5 zUGnkm#)@`W*%PcT!&<^Kt%KVGZQCXj7#tzhOyGLv7N8FKOoP5Chelkd%$q~ znxuwsH)ntB;Ml8rEy8te;l0EZHgoT7p=0+X?7Y9`ra)3G0mvsLS`&0>t6Pp zjy_Q~<)r4|)G;Ze8^l_#=r*L)0YN|IJJL^+1|IYIMCIgVc_S^-9->synSUD>g^g)- zE$~b5UktXRtSogtck?u-TjRFkbTo?aBqRj_xD8o5f!<~OS<5_q^IU}V0CW{+{19`0 z-9{Hz3W^KRAb4Goez+HFuc%*kolDeG7YxL|w=K&)G)z@33Hib#hkoyYxa$^b*`q}$ za5;>_o%BCs?Ra`KOXXX-=ZFbuPq$&*%Q4QKdHk` zKtvZMPiWHV*yhg#ZwapBxA|ZRhK4NNgjCvBNpf@Eyv_CYd@RvIUd5_++z4|j50th{ z)ClGMePv>9>@DQLSuK1}C#nKn{+Qoa+LJ=$-2m4Qo4IzGb}$!D@>?=VI!;ZIbA!FS zCL0Xghrc-2Ck%%Hxl)$Ji9)yNZZSbiK3#eKya6LEpiHxkzbs1k_OjgTuZ5p4HJHtcr zuBlk4dhu70dFb}(`1O>^^Fk^V0oQG&5i_zA?h>*ZLG$j!LN8(0KcxQgW!j2~JYLlz+qp3R zNY5P1b*y#V>b**OI0wLjQG4t*#l?91BWCxY0z&a^x*)WX^H}=RTGb?nr1_@|vK8ll zNiS1}vn@;mN0m}$!;3?XVR1#$%ADHlPZ05oMI@@eMu{#G-EDa|`zt8fTHXO@OYC+K7td>9xqGXIcIjPWRH)J9mse~OE7O*b;$E!! zgnT%(u>jCuK34T<5i=tAl+m1kx@g}cKP@mk6GU5r-Jj{$k7TyzY`MgRi5R-x3q9T& z)nx1i%e}U^(sImoa8)sF)u(G|YeY$tC{)NIiRo;$td7?Y_kl$`Yb<)WVOnaZ%QQQk zPI$J2V8Oi2rvL(`=yEnbY2mq>)=K^=){1t5ID?e^Jq68e*V zK++3=q&19g^V2SqTM2`-a+7-<(nHKku9X+U=eemYuxn0mb+|g|vO93r*Q_hZk}O7? zaA(y-RCs#`)ax8;;=2_Z9pxwBeWC`R5_-ieXW-2R~$Ida}p?3F)eTbA>~uB zk5SQ`WGwM!eZVx9u$pEvn#Zl4F(mGreP||m`c8NJ26bvq!+CKo0Apd7wqmCFyoqQ2 z`Cj{+F_mwTQXlb}z*aZGH0++ikT;#NQ@I3>_I~4I@={x#c!G&Zp($T|CD%{W< zU=yq)moi*VJSUExpX)GsLYnA73gPz@D;v$r0l$Ec`#zHDl-uZY0>&-=Zev=XsuH)X z#(gEJZtIikWpyeE73)SkULF?{1{ywauRDvoEhrf|~mH;jw6Y z?oUY@M7c*?d}$8E-OR4JC$3F>?^hu!V__ew1rxRAs#?6TC|2zMfbgvnxB!K9=`Ema z4ZAx(4P#(WB&#v^w*NuKuV8qW-A__~9cw8*3f7tEnjrmVzBe~U;&S-jh0}Bn)HS+r9U+sN+v*<{b_d)inSwtf zNTKE^r##OpnC-3A3FUFj8FZ~SXvZZ zfU9t^w;F4v=pg?HP80Doa+kyXA<5i$*zQwVn^3%RC|?b*5+KLEAaF7)M1Gh&pQ51KRo_66*Ls5Bx_& z_qX{YuEN(YR369FqTQf*JVf+IZ#0yVUb+tQPI^Q3r`M@+y!nj%OHy1T`p8kLxp&a( zk&CPq@xsl*l>I+KANx!bA$2MvBp?!Amxu1d`kyfRZ`oGLE6qSdb$VbiUKJ|+v_DkX zKZ!pCJAZ>UQ=W~!9!I(a@>gXyiYq-_FjY`bF7e-Zi9o*hxkuO$xfb3IRUG!g4ns_- zLPrQW6Kv<-yhOA9nXGat`zi%1Xduk7)5J^*n3H6?f1xZj^*fo|)5P=xqcXeX`aqed zsA^)*(VwXj2aAA&416=4MV|;Evb>rYD0&_63< zOMXaPvr4?qss6xvRfm_2JZghQl{|Gxa2F_xwnM_GdzOrkgX~M=s%64O1#r>-d{!tx z7Xfz`=L^6lI`4X7Rkh;5d4-iymXBcws6Ntu3r+{W#U3sT@4{V&L)zt(5Ee_d+BQUp z&p)fD7CQ$JggDX1?V zasB+i!iJzGA^1<*$OmlUgZkA+xkQX%FEXCXQPR|@OXvs48e;)m5b)d|79Z+-QnCjz zf9h-qxxgF+FGGGHSG^K7I$slFAbzDI8m|&my5cbtLu)aUNF&7-HRDBR-9S6fcDr}p zOm*iIDo8ARhdMl~>5kV?>)ZIwgY}@2li$xb^dcR(iI*C!|43X*R}x^LGdVYZUn8A` zoP7%16)}r;bH|>@y983Qr;3b+-egYB8v}NKf!kI_yI? zW@P?IJ`U=!^4X6QOVHB-5%JD>lfcaZT!?>6$n%Tb-vEG;3to~x$L(Fmu-^y2n{S3PL%^zaG63$_wtx2m(mjF(3S6`>+{ zgK%%gE;ygQKGVY(0|g-SzW;VG6T2}a@2S9cSn~MO$v3p^`Z};Hc7~Wn2TrP{x4Qll zMDWtoUnWg__akYb-~PMY9LgMzXk_vD;lU)}^VfHpLKzd<^yg}fLUulm$6U@$?R0tX=ac40uu{HS6#Z_~c zi9HH|{|pj^dyo8&-C-bUgTA$0BDWW-z~sK!uyx(K@sMm~($NGf*32-&S$*(^p&|4y zlM$r(;&{+xd5bHvdmC?SJLibgQO`r)Y`Qjf{tgjto75#+&42Av_i+0YM4*qoY*Wgf zX9vKBY|#(I!=r8S3#A;B9+TS!XIDJ3d#HFe2g^AUQ!Oxk2%6QsCb;@Y7x|Nv1xQO{ zQXwxpyNRn&4MOhXdNlrrmvk(xQ#tRKkSyoZp@$(ip5)qY<&D57HpgXghn?qP)(L;- z%0Tq))C=tjD`u998#g$7kDsp-p_fzVa*9*n${}rn+~3!cJISRNJ{Ptto=rhZmkS^~ z8FTR6!bgj(`lBK_CaCDvToJDBRY6eaAUPT{N;_2_XnQ^B%+7G94W{*)YZ-;MRfVJ_ zsNHn{ClJE>@Q2U5^7N->=tMjEgi+k4;lsyU?OTtS%wm>fuN{j0zR)&WkoIxjx0Ey$`7vlz2ZC4xJH&? zhiP>=M4>{jL|IyQ4!t;I%C>;JRzInNzbWM9TjkotqfH{3fE@o9Md{{i3DEIx&9<P2fu%^mCT{#|K%_1o(Ie%}2=5fFa>%X0ovIl-}8Y5`56mHPQGgTJGM{%yg1 z8>88vH;;OzIl={1Fdx&a+7L09sk&ag{qL4)kCSqngG82w=RGBT3GppImQV&?VRvIp zY*&~+GDQ4jB%OTl2G0r3%Odh2^6bW{?!ROI)*b8UJMVcqrT!;#wB=)b558E4-W+*( zYd1BL<*huw;+I_vuL5h@!kaHaTV6m#L{KC|T&WwXyJ;kT3V+TYdNuc->f5*qc6Mt9frGG(``GDxH6EJoMej}ZA<-*;@#)fHWb6pOMSy^e*&E^cAB1sVQ=EQCt4yF zIJQYg3Y>om7jlUk>(s_9wKA^M2^&KW(G&dbqN^e5$Y=$1{bssUT4zGI4 zU5x3l3aGt!rkTKGk0;Ll-<%)3nPYc3B(2BIJ#Yr*h}W&fK68hZ8cqAviG{7!{aW8v zrTKy!;CVT;P-{{>v^}T@>I&3ktTt5oF=$-W3TwnRmx4vl&FkO@!JD7|r9Sp_b{U{I zKSEot!XEjJZXmq!z)!?Ti5qjET$ej%eae`I3Z!O#8Nel8H>WKs!3KW8#1DGK2}a<& zE`+v$eFgyOD9C@7BGH&?M?&+iK}!vGg972+ISFcZlctZJ;z~;&n^>JjX!wb5toSt; z5r}|qgc7LN5CI=i2yKo$+X~FpB&PiA=0Z4?`1S)$$A$($C3*rV=g_U1pL^d*Dm3S9 zYww_)If_Ro&zDlWn9xbxejsuw5%L-Z@jFvm1&CZtger_)_R}l<*KOE^XJ#44O}hbQ z-MOK+AgnaK4Lft!t~ITB0pEka;(J{WPMd9Xt-mkJSK<~e&WQM5C2gP2$LfjCn_C=p z$8ZKBP!kIPr6JlnO{N>Gj~2$RN1ddC#aoQQ7v_yuTm7_3Dfbu3irmG zE$Lb;T|{R})0jYAT(654Sto##O!Fptj83vA7N;)v#y)xFX?B0B&dIRAN?3e+ThDrp zF1TmsY!UsASzj?^7PfQUGs37Ek69_je4fQ!EYW_RG3^gW@|DDPsdeAr9~7taz8rN? zWC_tMau8~AHaam>QtL3XbHp)~JQ1o2>heg8uXW6l(+U_$Z0xgO0vaZ>b0^>U1-x;r zPsoPS_52)1@p2GE;NJ9SuHpYCP-9>=mE5%aI=+p)#MuwcGG?b0Xg0G=>_#wTIxy;m z4LmcGE$-g|;_OYaLB@!6-n|jC4NNZo*wUn2@Xy}O zh6%;fc;1uonnO+o=Zfvc;#+>koT|Sb!zfEY$iFs<=&EO2$UydSlZCS<4;&L^KsU=e z{mf(|K8Tw`tEqSgd*CXjNvHisbEs@H6R%=p^@ z&+>U2MELq#>m$3jcD*oS6YRe!A~AfC5!l_iOPMRsnuV7G?JNiz&dO^%&NtI5yc%Erxr%YkIz+3yZwIMVq$+PD#*X z2Pd96?B7oFs=&nljv1`?fAX7IH}Qs8&S%0KZ|*!fiue-XSoak z+abru)On-qbIjCbi=PRR?hd;I#`-QpJQD?Cgg+f}Z*z8?h;M-y zrc*6i{!3oN|MKrhnP+Wm(RuW0+wfr9;viix7BhVe<&~`qP(4h6HT@_R_8~qu@vnwc zX(Cd`4#`ZAcn&e_o5E&#_G%Q5b~L^D)gv^LyUq19V_y4JQti)+O(a8a*;7G(>lrnC! zIWmZxIZ|;QL*F3LU|g+_nNY;NH1C-E8%O;9HR*ORPtSJaGQ=1Y>kOd7$tdRn(>TK^ zaJ6Wjp#3L#Jgc9gJiX3IgA{X`+VjFg5i+P@G&Ot+2EYG_4Ene6LKVj?(W zR;z>GbG~@7M#N7Wnt}zY6V8UL&wl+BkN}K?(S_k4jp{-1{O#^uWGnc0tg)f3yrfPk z$3X_nCS#Arh!^YsWZ!q6jk{Ks#(jO*8iai`B3;MY$QNh-u9+{Rxno*L_Uk)>@@2Ts zL{S?tNt_tma!I~);#zhsOzN)!B55Kzk3y?Ty-J~NTPC^wn!|}-I@>jyWNBLOU%$DJ z(O8!AgL_X9K)y#FwYSd3B}QrDD_3)K7X-RSKD;^^rB!AFiC8l_xNQlY*HCy~AIMnObDGRzrh5-;!-%og6jk)64%G%eMkuTCw&ReaWiO@EJqBk!n zBa?`n@uw`c@PYWu#ca|zOm9ucKvvh^@z!20Qd9EOhgx7%DV%G}`6^hJ{_NM~Z%ItA z;br_ux5IgG+{Cv^z$AyDzC&*y4f*Ayo^Yksue>1B%VnLkLEj-Zp z@vQi%Oqa^;>RhMq&!8oU@P*hyA06cPeM~PLfscB#8>-EIHW;@rz^7JbG5yB-u>Ei? zU-?!}5g34Z*~zzo(M#>U@ZOKmqvmdp|BkZ6B|B+sb`Z4n3slj$Bo)un7XZ`IxiUOl z>%g|>dRf`#`roPirXC65T$hm9kyGGGY;Ad{3asLQvX^y(;|n`M>Vn86{)M3^cl z!F~(Eb$<1s_q1hkyin1l;)B)IzVeIn|7*_UD8@lMzRZV4JPbO;vc8jv&F-BnzChe( zeDa+h3a{Ire1lu7+3k6CBZ*V{TLZiANh}t6ezmNE$!k$3=?8j5RV}o?6ly`^_5X>O-gEj5 zS|z5&eDD}aR9%z>nWxKJMpui92UWs&@<-g(9(dB9$$j;G&ij78Yx7f>xpJZ62;z%d zRmdN9+9Fhgo6z#%$=A+TR_b2)e(XlJ{?86Lnj(!~b*b;MR$}?S$nepK@P4ei>YBZW zc1FXu#D4d6#cxN}MmUor;yWOJiqM9S?HSZ$HXMAoX+O@b9a3psM&_y04#n`b+<2OKj*41H9~DJ|MIY^R=d2 zQoMFeQN^Mcw)j7hgwm;D?=-WN*3(*^us6cuoJkKpM?RQ`7IvyJhZ5li{#1L3kFLj4baCNMa#Wwc^L041N7#Ls;u4+H}Eiu@hUJN`T`P(FSn%59q0uPkw%>pMKwZ;M;? z2FDGSzvYt*Nq`5Pz{{bQ;KI5%HmAH}%4*TV_P#Z7@t)x`4t~e7jR~T}IVoGKY{nk_ zQ2!a!zv;ZY&3mR!VxXCs#ls$XoE;;Olvm=D?Iw8kzu9}F4qm3X@I~B@)WcS+tJ~+Z zC|Tm+)uF6VntR!Gd+UxW{_?fi@5my3V<8a#H z;7ock)rl=J7?|V6a>gT(|D#OUUX!=Xx2jt{PHpz(_vD%`&}TJmzE=IqodGAcDwAkNqlgx%v)61F=Eu-%7k8U4*>8 z&U|5Y7DoD^_n8!l>B`yR4`0*WzmG9rJpcdeAjz?Ogg}qn;)}-T8#@u7r3UD08*5c* HI6V7*u1gLi literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/turn_left.png.import b/themes_src/space_pixel/alien_animation/turn_left.png.import new file mode 100644 index 0000000..f447564 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/turn_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnevt1plysr5j" +path="res://.godot/imported/turn_left.png-f757ea622ddce5b6fad591da1470d37d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/turn_left.png" +dest_files=["res://.godot/imported/turn_left.png-f757ea622ddce5b6fad591da1470d37d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/turn_right.png b/themes_src/space_pixel/alien_animation/turn_right.png new file mode 100644 index 0000000000000000000000000000000000000000..69903a4f952262b4cc5db917d3f7926f1d1f0d4b GIT binary patch literal 32120 zcmXV1cQjnx*B)IMhJ@%wNkbAML^niD^oUe7k|3gs63pnGA>~zq5j}|*qDC7fL87;a zI)q@N44Gk=a_{GTf8QUstaaC2>zuRCe)itaeom6Lr3nw0C>I0*;kjmNcmo1qJ$hw= zaIzmgE}UjPb@VvqYkD^T0^vUK@5Kbk%@c+|BIK_b>fa2>+iE-3^z`=KRdDNlz_y!e>Cb8`m(}$-i(~ccm~2>W_?Sdk4LNI5uL-kuNsT>x@Z=F^>?ySq z>XBQ;@qj|1SGk{iz}0OXO5P0UW*0%M3dYW~l-ZU)ff0$J+aERUT7tG_h>o6EpF8;L zV=AiBv3yrK|GlZa8F~-X`|tJNTMJqo^1lz9(uUl3?oSGxy>^5Ax8#sB4t|eGOViS# z<=mNTFKW)7u^7L;?v%A$dE%K?`7^DB_qJ=KyKAmkE(`SpivykyMaR~vj^SMFRF>vc zm((hg&*Zg~#N(vzzP==?0g30>WgRx-^nsJtZs$(ZNbtre%y&{r` z7qjg@`=vSbLc4RWf_ADUbAFa@QG#OOg5QQbM|9t|mK1;vOk3P&%B3pY=x#g?ar5Ky zN9E5~_D&I9PJoTS*GP;>?X1tP2oA+DAI@;!rijUO+=~blXaqKHq2U$#hhm@O8wtqB zjis1LfakS(FuFYGr<@ zw6Hu5YQTjgvV-BUrpF<``=ISl_}zxS$R%Jy6ql~BJ@7sc@GZIq_DC~sTd9ge&?Kgt z!jPVwrKR{CvuUUPQ}rgFqrUThp8(_ag`0jD!3|@6L$W7AR!2~$c_TH**y{$^R;Cc+ zZ^ku%LLl?QUfN@n^jygeW#DDsL9NS`$f}rQJ$R8<*Sbprd9>R!*FK@>Xuq=~_XIw7 zkqSU=MrZHf=IRsiu;1e6mQwRXj0Wz~(kbPg8G!GzAs6pOAuWYNQ9a}P>nAQM*WQ0m z61#;2(n+1D-q{;x$Ha%j07@-8=Hr~|&MhwXJ1UYLsu9n0Men@ESIdjO!;M}t1M@e~ zmDdUQKAFfE+lkUXMc6^X9~LB?8)`MJ{Bd1{Wa(FeJ@-3cR`zQ5Wd%>vjpZBz@EXZ0 z=(qaX2r8%d?#8;0_B!fG38KmQYcK7j8a=Zh@y!WMumFd4Uo5^I&|1HE%w`3yHu#ee zGd29d_|5k{j;0`&6@3)>m;`ZF@?M%NR)B*}?>OvcJc&#&@jZTXOT56~-FrU-yBnV) zLOnIm?vGk!_eJz>94IKR2Z$-}OycIJ#e<|W?5i+v8xh}is4{W{^d_Z2i za+>kRmbKb|5$8wtiUEqZhmu@dl(=@gT|)I!tQ z^4}7WwpS3s?Qzx?ssblOXwTPF$b0k!B@{w!FFGf z-S0Di$s?$^N-h5Y@O&762+!$d0vhu_`qk(=gYWPwX*X#& z6E(7zHVEPlRY&pJsXsFWC;nvnT*IU8={K+0uG{ae(~IWq;!IvF6TfZOExID*=Q(^O z@*JaD``_=>0)3R>DhiX;?vzqm{DxsHRlzQ5cJF0zuHHM!F?+t_Q`OtYwkF`S*HHu~ zCe7ETOsoW9mPigHfeR{VU)W2(Gvw!o8XC{`Ggms!FL?5|DHs&Pw5!s56;!HlJUtRP zzL&s%5Q0EHVypiqptZczwW*ND7nsfC2Ni0 za(~YJ!;8D)0St_u4Oek9AC6B@sY`(AQfyjLT?y{@=R&J@8G!azmb-{s8GnbdN!sBU zLt4~wxlsL^5Rb3#Bbk62_p2AiB5jAEQ7lStXQaK#EvUuTm1MXKx?6Cl@qJ`i7k@CsJClVk=Yj9> zB7BBxh=8LV$J*2U8DMms?lR)Qma$iBJoPx?)14jBbO+0&e8MnW@J0y&nL>seQL(9$ zyyf9uD_w~m)5o~57@z*%%A%2r(O(u3bQ-TiE8l|r$&VE>W4QT}fc4?m53+cmEyXJW zGya1HSNg)fEm|=Sc^>b-6O{0IeXRf2rFTNqOUm>X8&=3rqg{Xq0hGj@0p~&92>r$R zz)J1YdQcj&06vU9$y349MSud6`nxUtJTV zXiW~uBeB6ovSY&B2Irpbu&LSm20TYZ=--)DEoDO7=z5NvPt;a3iBnlxO6UzwgRWgr zt6osG=Losm+}mIOh;dRmToY;E2Z^@j>+za9n>f0Mo@Uy)h`617@)LQ=rdbm_^Jn=1){pm((nD9d(2LrPSU5=SBVVD2` zL#<~rIfH~p!@bH(QA0Z~fvrinDiiYnLXrNffGTGIM4hZzpmT>wc_*31ukQ#(%hBQvxR4 zbaU(W)Qk0WJ-MZY#Nz!en$8KW3c3nRlh*AQi*4QE2Ny1frETysLM?WJY;fIEzZTXqqg~`VF@2+*aK+0B zpIhuJQxJDwrE?Ak9?WIYiTFL$h24c+KsbGC#y+_>vG0TCnq3LLFQ@{cR?^i8a_wQS z%3|enZdnyQsa7Xi?cy%MH^Z^*?f86FoJ}|~fQs45&9`Jf1N~GzER)gvHAgOS&T(rP z)rVeo@uuUi_cwP`Y=%%#zT)ee!qVe}V|B+_p{2Yc!y&-KWOgt?ZiZ1DkrpKESji1o zj7iueeUTNMHPE5atKeW6?4s_<)Z|BGL^f);UYF;g!Bl6WBbr1CllSN#yyy+jXd0$P zD-}NPbiSO|pLqp7beJ>o<1@fq6{Q~75pY>U;WsDG%$=|ud3Z(F63GQWg+v4i#2JCR zne>{*oHo@scaJ%bfZnF^g-U)4*p7$qjmDhh>8o{TNO~3~$PrEuKTw@duf>s8G zBZwc`e3bFPRe9Fr&z%hT2JQ0?Z8xf!!{hDaJ+w=23tydoSm zEU|gf?UTzQy6?CXYpbdgXGs29(H(u!vtyck(p25%I|hMEo{#qlOT*`>TmBH}H_lB! z?Xw!fl(RQpiOPY!wE9CKf9Ao7{n1-~?Qg&F2lMIUEO6i0hrK?z5=@GC-5kT1>cE!>q4-&71Tcc{(b7klK7t!4dH(* z`Z}B?36`-Vt7-c&9_oqhv%*IK5AxhqO0+6U@kIdmXkiUZb>dEP3w>%54>|@*#U*A{ zMg8)G@M_iBPE1FU_L2gLJUN1j=sGnVO3!T_&4dazW{mE;7(NXtQhPCw-_}t zXEP{d!sAJuIF#d*9?PB+rTv{bxM+G4o?$@6{v)prVeXFMTmU#S8smAeyrr{mnH9@f zWh6)$+{{tZy0J_8?M8CF*)i#q@fV%WzhYPn*>KB5)ENrl>I$Uq<>dvjB9xtI$QBvZ zDi)*El^)8v_wXKvmN^qYarwR6qL4_Zu0oFUmJiLlIKm|H%kb{zXuZd92Os>(dD z%k2f4FhqIqH0o-8@9KBDr3AnA zbV;Bl45VYEWLwu}h;MVn*NGa-uH`e`(vjy+)lrH8VfJ9e$w}T&zul@pp3Oy3P8Kli zfaF^MYQGn&lf1yw&>*#S!5?@qP(#>i-|)iZ58@o!%^X;kGl4B*sv_pS2Bhbb`iNSn zz=0O>1dxac5jfDVN%-Ur^Im_1&oKA1@qMDXTI&6|5yf>jQXHbSF8<`mMa9Cl>QVWa z4e;?}aC3AL+vL}@+U&X@NJjfWQpVtFEF{m}d!RQ);S58lk}+Mt7A+_Uly8KKiXb;^ z4G-5Q;WOPkCIUrkJ*b2Gdy+v`V8-v=<%e`^XbaxVvVG_xVR);c{IpjKNys)b+{283 zx8T0~c`U_Q8?)x-$Nq5%Jeb8|@ zP{(ryR0Y|h_Mwy_f|L^bRTn)1E@TV!V*p6WVJKc_EEgebABGJSBR(;yvv5vBZm*@V zUZ**XfaPuT@YFxeJNEq^#kyLf@E$}}R0h+jtt?m8%9drfd=udT?j8a|6>>+P zmc#m=-8oyz@RnlCrjhYFf7T#+DvRdVX)DY=FIPhzC>l8-(9#fDh*1$QEDP;#ynl|P zgSkjwbrk0)rQ)f7cw3tB*k6$N*={e%$}T)e4^uf-#!lbc{}SL%&Ywr2}o`u zEyT;s@wMw+YVE#pZ$QtEuGE&$mne4+#q(2-R1RSMEW_Vrw!zl#e9#ve`R7h19C1Bk zsN3&SSe);0ayg<(PyqtYCs~}!ft&-HwRqzAjRf}h>?|qrthWpps>1dV*x5BMsBQ^h zfVv+A9 zT9fd*kZ^Mcf9v;nyoQ_YM>gJyQ(C_C3-?gEl4P1ob262Y9}|ft`YdGUpZE?nV$CzpJ8x{7oEUfymn9HCH~nL6Ri?U?!|l-ytV1JO!^skckuDA)E`( zir-w!p5lJUW)oM$^eD6Qb{)LRe46z8k1zcJvIM2@O#?Mh{DHu`hp5pyXcVK~uRCv{ z?l{Suozg{$yV8TU%Gcj`R0kGppuWfAWy<=g*W})Nk1kt|9|*lgl)d%6G9to;GaBgW zZY9PR!x#h`YMA5Nuy-BmX@W=6jfhKBpDAk;FK6O@Jy@bkm36eUV=w0yVh*kfU%mjY zRNQ&V9_!RQV|jV!CYBR@Q&3n=QK^G*YZ~T_KZ+u`uBfG2 zHE&oM#3jNv9RH6MQ?tK%{5vzFo$J#7;-wRpT`&at0YNf~db6p{pW=w9c_RXOMCOT+ zx>%lQF6(qX{>fsRMD2+eQPO zHN{~JX$ozaKW0L04CA@;(@&i7s6g4lt;L}*pb|{?mh3zLXK{@~_tc;V3B3|QpdWZe zgt^wkC(!k)xLyg%eg%xvcnY@0^S9maRuRf_jZJQBN}JX_;COYolo7rqsUR=)so**5 z`t+f`vkhF5Of=chc!W#5_P%KsG3QgTsZ&t&Y5T5%=bjw9om^9haurMQx%)4M7nAoC zH+$VCafk!3$JD8d>So+=3;6j-(Cj^;x$4Z3rA)z6o8JcF1$$rCs7q(KhZj`{9ot_! zA!%$-AxrPYRaW${xe)(?R->mH@=)>P?ABw);!T~K2`6nc#gxpzAb*rUB)0BeaiStw zv7b3nrf&QX;>R(i)yKPOSVr12&HUDFDPd+rq4kdWTteMe^HQ%yNH(`HHBL@h^#S8@ zzT4oAT+XfIRi%LEwa$*y6HI)yeyKw)z2NqtE3R)}<=ORD@OG2eYJTZeqfe7wqF-MMj82^?btRz{GdTvGwXlBe*wwJ?KXy&;^) z|B}%(c`XRLQJ|DA_AuRa@qA2UCfwmMokv@DI?{V4v5@!#1R_>cukt#3_kVYUzAlcU z-u`^KLfn3brysYYs$>a1L^9UCvHomCpa?E#>XG$US1oB z|1SfOyE)6`tP&Y*!l`y^T{A&LRk#GESQx9V)#k2uTT@M4*BJkGMv`~$$qLT31Qpg9 zYQ!omq2P%;%Kks;2WvJ0vb0Sf^{>*dPP?}~*)pa(ZX`!VjM6oO-f!;pp1MM>ut^`q z1!iQJV-YHFftRPs;mJRfra3osgZsXn(98YZpAgd_ZIItjR(!_1g3w*5ikU#E$I#k) zPswFoE|EE~Y$&4L+%vf|8T%oE!%?&`fa=P{=zWpiFPvM5Xy0a2F-r2Zi#0!UN$Y>x z(Ryq4L{WSA0}V#l>N#KJsRVb2doQl4zxdlZDuGl8r_WVI{N_$zbjdXrJ=U-sHKB4l z-q&$Fd|UC8t12sSB1|ghE|DoSu?Fv33SEffU!U5m~?IA3N!<%X6} zGW2^gCts}|D>jbA3iE636!CiBV+5F8wQPbeifl^>+Q)-KOTY0yDo(PxF}2PP0Q_oH z6*b}P+hAVMCRt?KYL~=cp7{haz*}_AX@4z@s|=M&em73QxSDJI25{%h&Q1O3&K;@L zO1GOC?up0Tp&Ph-j1D_=XSb>WT#F;wMsYX>J^u2Et$H zdmLLxPOgcGObk?c-JhT~ zTH1hA&ov$;KH<0*KAd#+jv8U00u1@S4aON8{!}b0swRn`ZifXrIFz7TG6Az?}Uuj8Vs1LZMbqz;Ln@c!&iF$L5s1} z`%Wi8qsYvZ;jBA$PVm*NGuWmCQ2^HGs5B|1Z7@{#Twk7U zr%2SssX6wYyp4Yn3Hoq!Gs3g|N6;$$n>MX9PP?Dns6hm4fEY4T$C6e>tbOx( z>MgM3BaSz7@7`cIzA}6__+W_|fLCCMMU$OG?SdeuWaR{J3qh%eMe5j&pYjKBI=S6y zRf}RUJ`T9>E#cv!p=_TyG08i(gcFMeyXSB2Kd3l@_Z}!wm0wW{z`=BaF3cV{#R;i5f@ss>#d04O(O1%j&yn zLM4$`DI-?)COO;>f(p5{o*()cGL66ORyCvty$8S05LNX>1l`1&kF{Qsf<>q-1iVxU zI935%kWZ<;A;1}TQb~O!WhLKcsdQ)Nc7n~~5NgZJAKz8sBa;vlfiHl}1~zIM8LUF#58$ciNi3uI{pE)VrFn?jZp(r% z-16JsOeU$;`$I~<)EvP~qKLs!FT594HF)9PC*>gX6o)B{C(aaPmttfY?@2%~loLto z!>Tq91$V@Eomutro^~h+SGpigDuD`$+W{rtk`62tO2&*)QY8(3Zsj8(o}Ft|VwV(; z!c2J8L&3-pO^D`$An2TmsUU5ku*J=Npa}JNr28|U$g!~f*p?f|!qc7rAYD}|gRMjD zragyyN~MJ_HMRj@Is4Fz&QoI1`v+`08-bg~TkenT>d6KVei;QXdl0T(f_K-<72-|q zqvYCn{S}y@s`6u~&0vkgtA*WbjA2S}CRE&VZfN=SgBAMpU3Si)wFXM3qO2Pt523py zkI1+%hFaOGIqJ{N!$P)w7GJOAH4kBe+rZ;3Rp7eHd4iMYzt(SOS^TGh>y(j0K+M&U zG~cCGh1`@iAu~QdC0HH3U?9NMzp%qf2`H+tYMvK^o;PrjNr(I`v@Uc0us5aW%lo2l zq*sOS;e#&J(;Z6uUF$#GLD3gYSk`I*9+HC`gLB@@jB8k*iBo84<4tRk>EwY2gSa zIoMMHZ z;<=Iv#VXKTJ*aDGdIYE2C7}PiW)^3uNg+a6E_IAgSYW5sIi0=eYM5{$8xR^&6U+VR z&3HYxNLdz{Lm2FLLRzVu+wI+J+t`N_sTdOubfR<8q1KV_I4TKgThJ8S=Ht3A+zeRE)>z5BYu_%~yLP;G4&7)Shw9dUo zQUIE=>exTKk2q9LamT3N>zTw*IQ-R&%~X}uyk{x<9AVu&n&J7ezid~hgtv88r_RdQ z2|Hh><<}aosn_k^9tjJXm(UB=_E==qi?^yo>AF4~6N0G;n;%yHdL4mGxb?0{*Z)>O z0e6$p9SZ+J&jix+s6_c|gt^{%;1^-)vH4cW@Yx>BXQ_&lVnV{Q=m(i z6c9GBc`?5-df7q^S-WEvAa{C+nPzgC7K!3$)p>J~F4n9IKP_^zm_0-@+#@5ksVKnF zTs=Ee%erxTAuDY|NsU}ga7PAwOewul7TWg`G+d?F7 zWRU!s(Bnf^Gk#mh_mwF2S6@xo(^t4BPx#~Sgg4q+ki}H0Tr%KeN|W$Ffk(~S7!`^0 zdBm(`7JxWp(8i(`5ix>uy9a)4nD#nj7-h-DINYi24#m6zk~}Z&t%JERh%HJoefPu| z(tC@AqZLoYt*_Ap6u*RBY#Z{LccL}mr)WmZ-B&sZEKS4gOIvX9aNThUjB0_SAqMqU ztJqh3ib|?}gSa*8R0^zbT;?f7^^?&muK?8`$Pu**5xjMMj&t1*+j#=bB>RQR1{aSP zBjq#dTg>kiiWHRMlxtJmchHFf>td1Z0)idE2}~Q#zBvqM4an*y^hqUZQY-qNF!K(( ztOQtBaoOaRa6G~a&PhK*a11;FN!*@anQg^(D23~2K<-dp0Xjcre~zKnyx?YkI^P8= zjcJq;Aa8}mFkW?}62lGLUtK1)xd#__dIOg1q9i;LwV{j7Xq1wX(-f$k#kdIE` zc{QnBggv7iBbG0I$zdAOyTcIV+cCIH{#$So|QX)EywEzcB0r~Lc zb{1MpE^bJT3uQjf2SsD{vr51r4rZmDu0uqO%*PECqr|n{gue5bXWkq3Z49Syc%IFR zkwDnGqzr60t*m4*^kBfMWeI)0)QZ|$%6OoxchC^(uW|wU?rqJ2)aiWwdO2Bp1E1iJ zyLW@wOIEDsmRWkcUrCNTjZW5_iIas;tU5}jE>zm&vE^;&~5qv_7)rBX^#3mS>O zSoF2xEu{k!JgFQIXN+Uk3vjmozfQWm5PK*k>4&{Gi`MxjK4-|CSE55-mkMnCT}pI^ z`D~=2%F~dQhe>3j{w?%&?%=G#lkJP6=898jpAri8d2vFL~U)- zYXQ;+H#Zi_=Xx5A#K4$!YKL1xgc5&IJH(R15QtJnoW!s}Bs8mZW+KpKEQ^wSja#={ z-U5L$Cgy)E;SYtLKF6d}cABez?#`*G#ypejk$D0zgx62JB zC0mDVL?sX2UR7sLO8n_Pwvoub)HQ7u(5~^j&IE-TRpf#mk7sw@?)}bG9ck*DM#dVL zSc`2DH$?To9pZvbjd1$O2j1$~$z)Do)U-QRTsI^FJ|Dh#^MQ$N2=OrnOzDd44XLh^hQOz+pN-3i|IZfw1fK&eia&C^LF7kl;QNC=;Ldc(>01J4s9-?vs68a!j4 zJC8XQDG@>LjDA0|KD>0w*r{DD_v*vbqY>H&V>4?Bxrz%c38OrjvNAWZ|LnJ@2??_` zHZanuW~zMxLb!6n;1wY7d_5l+r0hI0iGmj0n4}&XKJKTJ|Z<%tk3-mkGyVB z&E+fMj(hydLnngkq>e*e(XteWCsP~b#0KcE#G27Tc>HNM;lg~9wjRm#B~z1@0<&`* ztghaZ(drt>;h=8t)Jnw&s_6&9Yb7*t_79Oi)n^IVaka=^Rwwn-p$Q-91uNDV>s+NN+z>^<&{NR^qg7!Ru^|s!=M4aU}K#ogzfux9)oB zk@RVsFFDS$qqG{=W6z8Mm1ZaF)r31z>gC###PTK#ufkUx3Z{#Te0e|}O?vRx?+A2NuaZ}Upd?Qrm z4bw66ENgqD;=5Pwvhz{BWCy2@rS1=XJWl-;+M3H*l~!!i(3@2pRdNH&ddY}u<`&*5 z2ADU{K?6hLsmIjAuprySf<|+nh~%6b`P`OJ?3zD)i|c=WUV1dajvZE1gH#%+8umrW zbg|;1_MWzy!00J^)~0XES2t{)D0OVyraecCCzX80B?F2D_ADQofM*-fC(kY`sSSlf zFwf6G>WrvD6n||C)<4zK-_T8O>GvM`o^oV>W~21W_9kOUN z1MAJ5`ngB z47>-YQdM$g6HCR;|2^2**ktR{d%+Wz6>_@IGa?C#DM{&>0!noR;jPJ#i&g5TM*nW} zYgEiNqj{>&7|E6^H8kYeC7#7ZR6#zZ>5A`#PQLIqkYVq1eXQ?roYYrGcB_EmP&@-O{lsLrUAzh z1H2~5X%^l7q5xyIg&DUPg^LHZ`S~OkfnyO#l<-Q}5DP<95jss;Gv#>9p(GyR^LLn$ z+emTjys4M+l$DqA0KyN4eyaqa#NLRo)Z1(j1*$*fO2}slu zn@hVnU%9{Um$kY+zK)H&u7uCHCW!R~&C+4XUCv1C*1S^zGYjj0nPLSM;lJn)Ip1JV zkqtcCDk z<@5P3WfSCeXfGutNR#*2iy4{hphzm;?TOk0t7RE| zae_Vy`CO$sWpe2$+>+_5y!41}bO+ou3amF@O^exCDV^A=TYnaz+MQaAEbGc?r@g|HXlqcL#0q;6QK#B2yBl5)`K88M zFvjF&F?w&Y+)xx7>W4UY%!H|-H%(?v{2}X2v#`1_Sy|XKc!;i)ao=o8H8(dTlQ(OZ(GpCX^v)pP1GbU~RT}-vtPXkm7;upSoC zUUq25^&eS2(NzWlch+eHSMXVt0w5WpG)Jj$~-3!x&C3UtjjJ zezLfJlk}aa04d93-GeRxO+P#_@$;Ob?-*8NWS(?rwQIs|9|^#|UnpQnaE$svoq{RnA=^Uum* zum0KJ^Q6>}5J5msbZb zF2&LDLMzT;1ecVr@45%dVWynQ5UG%2FZCIC#u6Uts#Ho~niY`ipl&azdf?5sjr-G9`hmjfKu6x3n=?dzL@1pQ-mk4Y!U^oLk_M2ZkA zS3nrpg}+}eV^yp|z3LtZm~Q16fMvm~X{#pRmT9i9n2`fo46zD#^C)1fy?}N8Q)dS{ zdwTvI-`u4mI?j{?T&008>1(%x$q&xzwX_3o9pK8f;GcVNA_K4yrGKPFbXtw@woK;22K-NZ!?3MfTCQtw%is=YIutKG)jw`NZP9&c^is zzH6L5VWq7G7mjD@#JFMH;|@OVG7nXt?u(*4kA!o3yAo=2YqpaC(P0H50*A@;Ra18AUDe(lWVt1q zg4CBD2iiWfy*7`)LYjx}*^#*e6ZS~559`q%dr?5}=iSENs07bN>6<4YW>@0~%+2h% zs*E-7Dv;0%D(p`ifMfL_?el*A{vZ5=DC9^9 zCngg{vtQwOGmXoc#^+4uN9@35m~T@di;;)|g!X`ghWaGrryVsdn2D-z{EpS9A=;GO zua;g3y`>&Z^Zu$@q(Vf?EKP66A*Qhe#X?40Wp@^aNJ#`@a6*pYE1!U~MA(AHPc#|( z8K6)qki8sKaC-<}xF^9NE($jf&=|xZhL780AK^{2DZMmo)S5L7zribI&e9g+38ylA zXiwn5WG@5!&X3NrF&rBe{NNU03icH4;~hCV7C9K{Flu9X2K@c^Hz-SlkV^aGY{T?(li$)G%Un`j&I9?9ha&{WSl~ED1^>}gvey;+xegeo* zzG@BobpsD%H-b9{>;xy;Cfe)Xj6xkPK%0|K1rW+T8M}`e5nob+?U#ENMp5xY@KV(B zPaB#VT-LkZ0DPp4(=%8Q#U&@SQIWb%y`#?7AYtAq3@pw#0EH*4(}Vu>HZW z^x*F>;7=aASwB&fX}2o6saSao^+7BWzVD^RsOOUi&mv>D2En+;`&rvtYD5?^{YD$w z*bIS;UFAUaZs^-zWO#l6FVAPr%5v39B6Y;nU0UIVj?1P9O;(e$ks>d&ld0FE@kWf^bM$v(k6kx>Vp$YNZM_kL$F ziAfYHBQGq&bTA-^7KnSmf7XyDu;)SNp1@rQh|1L~n|$ZphkNm!mawrDQRR1#)x1h$ z-21tq7DfE~4uWs|<0QNK1N>dJK^PrFW)oYE&Mc$@ah^*Jj>0=Zx^{Y7xCIhmL%uBe zyE60*VgZjg$dL(agZ;FvcCvvL5Eu-J)(hR=SS+UO*Jf$Ys_{H=7R|75eD&i*vQH$C z%`Th)3>s4#$C#A(2&$tzy3qAhc_cQoCZShHMO_8Q*~PQ$qCmUw!1$A~JY#n7^Q#{` z7yNYez^d|SqMs`tue1PH?9#~25boMT&9>YlsaDzPg6MWQ`Ax+2A;eSCsbuKp?r^N= zkt;sYFB?^uk4#wI0DJ~zwHr&Xpyg!fSc90W>L&tuCZf%Y3-O2>E>`5N4c&FTS-RdF zO|j^mOcT4N?rU>uqY3J%0%Numj0$Q1&uBo{(0E>A+`Hfi2on@gd zv3TiKB$46;jL_0AT8JDr=je1uBo#>x!2@*gSEmsIgTw4W`O$G1yW%k&9M3OgubJRw z4Q`#(0(Rpome#?>>##5}@3{GCX;P7oPK$|Q(hI6Fi!z>v~oGYICR5d4%@?v#k zYZNEP8yTgPu+9!=rMu>KqHlIk#^O-Maa;Zk6vK5|`=qUFMASkn=l%yw?j7$Cp)kgu$qV;1j z%H%QM%|~n2`)u3R{{VZV;Ol@t!^?m^j}pPjgyEzV18msPdJlGa2B-d=N9Q6un%(g# z(S^6-ur(cR{pzf}xDZuV6J^g@A+GrTNO`I@f?HP5)0Q98`2m-6?wynSqQTxBFz#XR|Y-T!Z!=J$oJLO5^7taSYt5JQQ=SQjr7{6+aDK$lcx7j#U{~f zqZnFZ)^qj@GByhU)t>w00S>`j0Y6MqW)NpPCSNbLqAjk^Mw)Q)I}CtEf(O3iy=yxn zP~i;8f)MFcF%1GH%)MmI&}v#7hnH=dptz}h`V224CSIv}`3t(_7gideAd z$!DXEApIQ9$|(G2DGyIrl?L>4M@yeRYd3!kE0p<1TSmrb1L=nXNq_1Y5feR_wec(J zUok0q>=s}LzWZ6!?+2ePIsf4duhx2*Y2p8mqR6@T&v*jE_fC>WHovIe50hKH4VOrQ8E_tOwYl&;;PkKjrtHbyCi{OA#F!EZ-aoQ@Q% z;*ofFg%F=9@o4W_DdpaG^6;QKt*3d1_zgaX*dKPoK}nCc1s}B}e4nL0v5cBp0Fu;6 z+#909#U*x1LvB$7?u&#}SbC*QdnV&XhZRI^Y`5cM2T2RH7mpRgC!QWbhkq5P1xmCS zk#zQPhG4M*3eO5U_bQ~sPZBB>O9o-1Pp^R0nfE#Hp1J0fr;d(Oa0TeVU4Mi7V1J@u(eS{U{2Fsx;q$^1h z4j%F0-djV<3?VFGlmdC;9sx|W1Vd(7s1*tMc@$qk-y`&+YH~mjAgfLJ5z?;m+xQ918n`7#=y`QcLIgkK5U7+k zd9`EX@Qi3NsX)4lo1}Ac1==shDp&*(;>4G2NxG(241Jfi`^*6^o}*jlI0txh=y?Qy z9x=7M7Lm%^-`$vy>W2vy4S7tIP+VX1)F!_%qP)!0ZKEZLZM;SD3S_}Ti9o3#qfXfM zmbz8MgcOoy1sp*FFL?#tBaNOUp#*pVo-p!$5Wx2|hmPDV;Kz5fgWZK63mw;PZ|A)} zd2&pbDrOcejA04Od-d#Y0)|JEQ?WEKeUwZN=<+)T!^qLT#-#=yvS|I!0Q3UqPmgDH zz~BIYIh%c!Lk)hdpsZucet9WX>6aS^*^kEPVwMWPP=YU$=RJ@vaQtcc5zj~W@xtWj z9krNV`snw$%G*ArWS@hVq~PWWQ=C~_k+1LN>y$@p96*vL5&p4`G=Zi;`UhKyA1q%B zXJwvJ{GK@SZ0Eiw6bEgQ-BC?kp_Wp{Su|WDQoc|N0#zB(2!d?9#p*)%b@j#Nnu@bo zAGlCk4YaQ8YtVy%XE9cI)9+++6P-Iiw*dof*2BiR4~k4%JCAQIa}(NYY-={OezI2H zVPry6Qmg3#0coRRM>>Vb`#Oyfdb(}Mt>Wtl10}Z77$QEf2;>ugL`rOs(NZyx?ji~-SJ}&Jg$n+>ps@+`)Z)Qg^&QR8- zO3Dx8_C{U4ft6kzF;yTxi>IdbOZMO@L?G%fQOch5?Zk1IVmpsKGRUo$<;=K^Dxf+? za8gx!u{~zIxI-94g0g_h&JgL=fkY?Jve`)#J?Hx+`8yQ4W*yLYVfm9<2|%xyE0^Pg z%dE4-?vB2ffh9V3Od#V_jXQIO=s(A_$$jzyeY_x5XKD~V)ys#2awY*pV+5prgHpn*0Shy$Q9SjP3weWF1L94=~-bIrHYFAfb~+EM1X% z-8$V#UqaC8GD2PriZ0e14V}uL8FZThnbzRv0b}_Tu_sL@eGCFL9m_9M1~TR+`+Apl zL>UwJMdg)!hng2yscoQx*tC? zqnt>pw!Ld^c9wZ79X+5Ft=1lR-KGNhT`zW}ha{=kGSy!#S4W+@08Ldf-Rc}bxDDEe z+jhT-?Ox4COqkD*5)f%B;c6q=fwVQ_>*6YcoIeB|dq-S03~vrZm%AYW%NgW*7(#M6 zlW!()OLZs0SA=O<%s>a_JZs!H@HGPL2VhV}aKG zxzH_!N`$^?^i9MYB?`iN5UjRK9zp+9@(Lt;APZmW3p9qVX%nDyv=au|*Im_ZJAS_-AH;YkNlg2lM>)L7XoG5Exldr=r^ zHom|ZvfNKXT$*~P-%I`(8}72CuiNkG?^A@xh_3$2shfR;r4{VAgNx5w#u*+#>tfYn zSV`Ar5VP=T-+|eS8oaeRhX{kcfNL4m0G^d*a%I>o1#5>&)7z99`V>A*S!}}QoU{@l zed4R6jGZAm*)`&PT&WtqfV?00muBqFsVp)=EztT+1wZ}7M2Eb%(k9mz{0n zm!E&ty#pZE8kn6;a=iYo!isH4e?uNO%*ru{>8q`%sw4BNhfVr*`6su`e|ky+Ir2dY zv)J{VrquB(6%}H_>f)PQej+-MdPr+f3XY<-FJaBw*i0;WV=_zrhU-*3KbG16c4i6SSi+uvu%@Xz*{7zrG{}VVV_JN%f=6obr8oZvz{a03P5QI$sk+`>1~O3bv~L;#c5ejF{yPYk-h zv@W|0g>?v@NZWTE`eZ-gXAU7{T=woJx*o9`QCu1zxiAtwhw3U~t<4f(Ee7WKaym@M znH<~dT1=vl{vD^rM!JTkeknF9Sv8&*K_s1yHuEqoX$sIc$KO@`B0r3u_JNWw$E*9D zEvWs}t(&TWPuAnV1qzqN>QcZ5_)dIlSHGRM8smyxG_8&Zw6DF(XH|AP^|J@a+XbA= z+);d44`SGAF_M=bE><2*n`9i9u=ni=Tjdjst9fqPoIJ;qs>zI4)UFOk*L`vR(+a-A z4i7VGB)h)Q^}eWnc4lv~B7H`G_z1t#N4n2I4E-^BOz`MiAce1JQc%u==X^FdVy4$4bXK z+vg}~s!>0OfjO5RCnQFa(ZT*uK{2c>yGT)^c^y<-YbuupAKOP7vl&b>{X)hQV7`v}hqglxPiO*EZ zJGpU@o97F60pVs!u0n&LS!|sM(dn4@Fp{$U8KK@-$b{a@T%PP&-3KQ>QbC&cDMxLG zR)VG}=$HL_F1quLFm#ln}DC|xFrZ5{n~+#-dOr#>*=GbgQ0(|ixyR8=~WkJHj*ICi9b(iN-< zY4+BnP<;Xsno5ef>e&!MqoHFw%;{u{=_WNyg%<62xnJXVmC!l{8Pc^kawL!rUK3k= zA|tBAnJmTZWPA5JXk`u#+oCN`B+Nvv-!MAAhHXDH@wLJ1$|18YOQ(F4l>u(+ zr16SOQcHklDA0*L^cv(=DP)p7;ikR-i}3HNQO!%MXfKi^0_O&wL|m2`D%{#PfPfb_ zDEcme6#0ov9Q+gc#WV#Td|<|p?>D7R$KaxXQO7) z)-;8TDFi8NK*tNV;H)mT_%-BAp_R^syRjoU{4o>$x%q~bq3#Y z%99*0^SJc4ORac1Z9MMhbSiAMko0N6K*yK?ErE!aI;ojTM!`}(z{=)JDaKj%DQ(&j_*H>@NZbs&{uF50 zQji+Dd)p?4?aTZ2-aItbUb-^7PQyq^5S;A=Zh=dG3Cl5In0$WF0q$fzo$Ni@!)ktQ zUF73mOrx}irRgi<(A&9c4KK(8QCGmrh|PSJJZ-?%IZ+96km|B$4B2&PKnxAUQcw{? z(9f|W5r@de_;zaVV(HJHhu%2~kH659Vh^IqPdYI7L7NtW-hqW2w0?l5f1xk#3KnlT zrGYvpI-0NenC@GPk1kU@gQPd1i^*|Y#~<*A3yPocg52N(vd+5p5}^sSobzTL4ym`F zQPh&!79UHt(CUAkiXv;&{yVnB)Z{78+xblBD7lZB>4F&TUFL zaTYSW2fFRcI)V@-cAoHUzOwsfm~wt|S?p66xDyAbHYW$?LRpTG$)Fn(f_=;m@^~l6 z=}RaH`tsXJoSHgTt|v3lPbGDV3Exo!ya#8a$Isgy)I$8N2ah%HCcP#PT%cv_9PAUQ z5v`i~=8nEsW9OMc27cM@J%(39ypuHLBQH;7Z17>&Ud3HXzuCx@rF)QC^UZ_CYT01frwp0PYrLgF5->Cq@ zx(NoZ7S=aM>-%p*dd&x36GWri)o)M~6=*}i$HB6Nm+K3w#nOa%)nCQFSOB*YmamyK z@Fh#_G~9fbwrsEFvIb6%^SIX+m!()>X_9 zhZ>ZsEB{kX;P<}d(h_dNfjd0z*5&* zmx2wnq-d0pzmL=P>swt)qTLOxiI=Rxd_O+|+7_P>EpTkt72fw?%BSqj9&!^VV<08` zW}f|>a)tqrG**9VA6Lr3GTp5O5vcD4tj6cZQ8pn~L|LHeR6L{Z9*5q{vyKAlM5x!7 zmU@m~;`ffi!<^G-Y_5QJ#`M|4ARp8hnolNI(L^H$?I^E#W~DHkJx{74o*)|JNf2M& zg|N^wGfwN#MV%tYc6$rYNH+4OlzDp6K!EyyRJ~_S>Zq7Wb1_;rcR+@;Ru1xvyH3Jw zoJT&r)ET!1E|iSg{tDZsLoFnv((X-g=6C8Vwif$`yY<;2n(FYb13oyLCrmxa^x=ra zu~m+A7zcKaE#O#am~v3J25ywC4aW34_;?#rg4Ov;m;F0Qh`TPL#x}j%!MV$a$D`0aD1nh(!Yln0DF?D;4q3!{4VD}@0%tOfi>t4l-4HTjppt4IbR#*3atiGOGUPf>n*vLv@eO}3T{qR^foG+!b z0Q?fxO!Uu0))UbI%p?bCW6G}>TFo0jzkXvI*R|QMP3Ric;UEG&Ja~THxwFi*>$y5- zStRys#8}PA@WB+&yaOj>RFqr?z8{Ywvv`Fw&g6oC4uFPO0nKM)j0F=GzF9 zWnfNHGH7;Jcw>|`DPli#t-N}T%W`$;t%KapZz&;hEZ5SK0VM}avF9Bf_lZI)y-u;I z=ZUA5L4y}Aj26~$=zqk0IuE17Grx&+xG{`50E+MX}B&UyJ7l*|r7!`(YT|6yfp=@)> z64E*$@ZyU_y;h1r{f6HJH4283!`?grY$oQ#JyaGK94D_~0T@$3dwS zZDixS<4iD%>QLmWg*r9cqk+1MgGzN&;5#-V@~}YU5xVSPuB?LwL7uWD*g9(RS%i8I zt&q-a2+)O;CfO-Id~`MiFnA0bHs9QPojX-X@E@RnMe`2*U#$sE1Y*u#t?djJ_EfS@ z2Y2mjqC4v0>r>Pd=1H`q0`O<|lNbx83u57x8M5$&Dk^>KY zDdo`uPSb9B=_@Ue)73X6ceHo=Sk@(35~K$1u2VI6G~<_!jO5*fv{JKamP z-~=&N?Gl)yqq5D+9wxma8pT_mp7)6|9&4Vm z=M7N%?B;|62@53e3tm^Xq|g;q0ZHWpfCX!FLJQLhLgUR?;c91!2>$gx>7jr<+jmG+ z1DB57%*RW_Z>K(EmnHmP3e#8MT20Y=;(|{${dQt8g*Mw;+{vS2Gj$7-GtuO2W@E}2 z7bArOzjPu1r@vyY1)?)3i}Sp!&iC_FjL=I1F`uwdM8)f04V7#ir6n z<%i2ruv1{wGjFkFcT2lBPonnsY4ClA@!p!L9yuNWx{&%KzXxDr{Hw<0QmZPm{dgs` z(ak2?{{&iwbg`V$r&dJy!8&pEb%WRSBRG^!T-&;G%ZiuuQ94I)@Wl2BFl~k5m~hC< z#bw6mBuuB%Frdhh=xV1?!nD)Kv+a)CI<*F;!JM2bI-DP(z~o0kw}WU!3qCOM^U*kx z5d3BFWA$}D{mL~9?78U$;4YN&80EF7$(gd`HXdub3V{WM&ik_WA-42B(COV9l&t-WyvBV*tH?M(3moZQ}C%WdEHcNv9{Mn{*5H;D>bg zu2FQZZa{KyK7-OvC9J45Tt(EY;RVw$9NdHvsk8jxjS{(5<{gc{d6t6O-BRh#&=}te z+WQtAYewTkEI6^56XN?Vl`x-S*UHnMWl8Tl3~=yuLCmA-QTCrZ+2KcGj|y3(kP6Hf zja_@*iUB50lmp(ST0WNpbRx(sd|6Y6!?)pCgUT}Q(d5T~J3w4Vu=Y(2{3T_b%A%9u zQ!e_W>`%-p;>fj%kW8L!g6OUP1JIK91|9VW`(FT2c_BM5YG=-x`xW}_R*pvb;TFNT zIcz)lQWlK%hK0;V*C%}{zVudKC${EMvB7rAE+?-)foJs`N&y{|dm}Z+ zWxtR`z6f7n;@?(zhCcUKR-DO}=$SkX$)^r;ntLvBwmgW}?-g7u5w|sbAzhHYGAo-A ztI1SzesSGw2pp%g|7Gqw_7MDnF-Ft=>F7|#fwEK1D{zt#?2eB4h6;OZ>g&+eQ)Gst<;W&J!mFXynAQxK&I)oStqFaeZT+!b8C_>1cFfz{H8y=b9ts=!+=lT>=-f z+{8HqvF8D>=P7!A{c8~^iG-9kKdB^52hk!cd9&S@1EtRAb;j8}49t>KD50I*Ibn+9 zX~;YW!HcG2J_(Pa?ZKK=<RH@4V=pD% z%*cyl>7wn!siBVc_xc3-Mz79mujBo*9cw$&#~uQ&PTsqdnQ@SKNsj*j$TA%!yq?JN z3>%;xoBI}FUg#I8^on&<2ZhInXc%=ec@K<*`+c}L__71)cTHAx85>fZx692KhT2Df zEpF-1o_Co0EIncaa=g3L`o)>;C~=;q=D?HnD#dl^$fwiPWfYMp+F`xMv7ydZUrC}E z|5Q^`%cWLfN#=mQh_q106T`CM98SbMbVpbdbDou{ca$oj zQXL0~N9yn*YfZkVCd(SZIrZ?9*^&B;HkEJjhxZwg+_U#@De24IBbdalIE}Q2I+O5M zdcH^610^<(W+5+km>}VZEd!#eAq5%2Jq>bY0JUWkRb}bKD=Cp5;S{^)?3t%RV?Ql@ zBy02%xY*Jro^sH2%PsSaVRe+?$x^X-BVz$uc9_J-s;<4bQiztrIWzI>p*0B)dtTDF z+h*O58ZQuo$|x;41=z@2UEHuR`f8d>XP&~+%?}c+By6HX&UGr-DT+ogqQsyd3`--r znY=Uuw|Vy|JIW(FD7(9I;H;zQ57yi;YbSE>JD+eZOiu98%Tu%5g^zw(B;~jrf3&7F zBFw&EmfA}e-l@VF0W6VsFTVnT`Z`r?gttG<3UH$JevmwvZrxOY@eEpZ2B$*`Tp@YC zVxzBRl;{vAlGVnp3=%P~bZ$)ox6DdF^DL$%EUyVIdg>AbGq6Z4(LOU1b2k1#NhVZT z#K+8M8ltk)OaIp}){}#0G4F;Jb{b<=fQ}!L=Dj(4NRe2geV^i1xwNkwPA{S(i-SGP z8y`;L2q^Y0!>jZ-(_;MDtX8Xb`e7jG3j1pwHWx$Mo;bF$5cVjO;~mdk3`{|;JYic2 z;7oITR{tniK+T3Jfw$D+oLJIB4rbZMUgqCpfqueM*fap7uG5W~beF%vv8w<)t}!n5 z&UW=}`;8@$w;3XNl#%TJ({WZ_YZ);mVZ*;>m$fNx0 zjfTF6nw!l&N8-1%B9uj<*6DA!9rxm+O^k(&MoVM9F;%MYwG75Hr)WF-ENppvo5&Pv z;yu<%-JxEuv|i}Hn}MxyJC6GNfvq%z9T1iKS<2=oW<{PaAX(EOPll5q>GiGPp@BK_ zk>cByIISNEF|2(GGK=kf33vZxtp^;vPGrixgec zi5Y0r0ZPE(Au;*uEwu#MscPInas|Xbb%7I*#CVTe<;RPd9q) zAr!6s6~KR=?OjoX2|jKG1-D(kZ>!I|*NEu24<5Kg+s8$tLMzvY#oune?>mi|VxWsX z{qB!ZKwnBgluH6cAgHe$d;rdEyk^r4djmNl@K4 z7?5o+EHy4xu()kAtqLy^PSP%8AcFPabC))9b-cAH(G?V^2ttAWJp?72^g~}jr%Yd` zSA2llZ7lUw1?N~THqq8{y}uNKQjE5tILC!vzS(A%vj||ibOiiDbE}(1OCx5Ka8rTI z^<|$KzBlqct=QW+U!BiQ@3dGE=7r4Juxry3g(1n!*N+aULs(mLj1Yl}W@6PI#p*^B zK~tJZeJQKY4f(0kA5dIck$0X=^rVM80r3vtmnuXR)NH&~EYGk>48Cz(%ZP9|Wd!*f z61QkNam5_=tf?vT4+#ZwO!oJ^UXT9u&yNIeO>G4~a7G@WmFm1eDff#)t>Jy%UY`K7r1n_;#tS->8Ze1z32#y7K2PcEaYh6 z?gaIN+{|9Y}@lNhnEQwwAKq~%=apB)LG^R|&yWYLt$^W(QTPK^ft?!TtUQ#CB{K6I1=~R*Y zCKqwiv;WDOqx;i(qOLCGdM0HK)j?3!jsR%AHe~zIUgsAp!f>d0_sHGrz`K4>Gew&} zNBE2W8Daqf&w$?ivEaAVjvs43&OJP!*0C+tl*kE3PKFL@HmX zXZDr3GvQae=3I$ZvoPy-yoH`XhW#Bl$1obS3xB;c@gFH7#bTtr%`#66V66)oFyMxlqsS!v{J^Divmjijlu;T2Ez51g4A^0@5+`cR7JBRll35w`-7)DgG;oU@Zaq*clGCDn%Z#g*~+SqyWJ-N}KC z%@q0L^a8DKVOuGSiP%GPxFe;LoDbig>l=E&|68J{^3E?$I}uS$&=81Nv*3@!QayA7 z3AIAj0WS*Q$mfAn`P%8yhC54>6}{U-~w@k$Y>{?#46R--4NtsRkhCZ5THGf?BQ0>@0m@ z&kQjMY8)7aeO#)Y4`1CIdq}@2{2SMSK!9@`ccx7XT*%6{kR`2TJ~5>G6ea|;k|iw< z2cn9^=W^gT3mbPXEMENws;(cpR|EEgv&2Nk?Rs}Tv{dP1JN8Xj2nCaULY5*0QtkTo z1);&k*TzlB4eoJ0~tXdl(x0g0;r4XS#k5X$ISh@(aQq6cL2S z<9qR5hvEAd zo`po)mX)>Gt(9B%LMdVGAH5DVRP{bB*GaSEw-=_j9W{Qlp}vAKO6z+`>tfs_@4#4O zboN}?10o%4UB(+wwhPDQ%`W87Xw)cU%F=40M%Y?dr2a zn+>h)k=EgHf&2X;@Ygci+Ho-hoOjt*&>j5i1dlx0f-6t?2s@6K)kL=x=OhxC{zyy! z!1?Wnr=A4!?10dtzoxT!dLIleV-Ke#uFhsxOWWvn;{h%LM-lO; z(U`0Lq>mWtP_l@d!P-o(Ah~RRPzeH*x@**YXkdnwXN}ynXt{Pr1)QywIMNYu{oupu z2E+DJxf*7HPr^1LIqga-xqBsOBJkfhqz{*sT)Dwm?C`K5dSPGdT!H;usiMRMo7NjP z0td<;E+CH8X`+&L< zYN~tKmfue*Zsw`I?_|M6gw%fSQY^Fsxn(23C4J`Xf!awKa?BhqMFm7L4^d0SmC8G8mDtWEF*f7vG3T@|w1GG9Aw?8P_w zpF_$YB3B(cj832}KTMEa467^Vjj1p5NA75udSV>Dd^!g9Egz2`Z1Z!z9SnR!>+AoY z<4|BBQb2iYX<1(JsPKtfI-68`XTVg<4ljyJ?65$dwWPiC|d2B~JZYtdWfR;m|{yRePJZ6v@w;e0e1wBI0`NX^QzT!QntKE3zocE%3mNbpo|AB(3qasG80o8A(yS1<{$9DyzzreWH0QCP{oASW> zh!7&-K2PW@lvCqMB#VHOZDq;4^KUBsPDRZ~{5CzjS8rR3dp$dST|upax`_+ay39DC zt9X=_oo@n<{@>#gpkjw6M=np$QAlzl8o3t;X}b-_Wn1~cfHP_N6Zq&VKTZ= zhHV@#jGsH+5vRRG=lhBXWJ7@e(Z+grMF81c{H#deP_o2GsF^Aa^-eyY7$Pvsj;nKS(6f*>_bCTZIC|`JKVa zbwaHGp%g9t1QE2hUJ@PZg7oe|WuJK0K`>&i2fT`Q!ihMvpmL^UOst)|qmS^l`2nIMrKi`RcKfZAMcKF|>XOy9bD<%xsn|+cmh8srv1&pmSKCe?^6f zbmFe`qFV;jq**y^07f@~6U`!qGfd<4pH@{{hl}hbY`fH-ZIwh^{Np=OBcx|57}w_7 z_`b`QNgNp00#h!BOGgbGujXW|jnkw$7vZDUTMFcR@xQr5^_`egk@jg?QLH-s3q2=& zX1q^3Mykr5?_Fz?x|&k4EpK+nKJ$g}p7oEU{-8>GbTsyOhfGeOBC@<|5tfHy7g-=E)J~I0}lAN)zWcS;(sdXM@Tf{kX1xaS{+~VdSBu5>pvRENJ&kFzSdKi zxyzv{s6-hn3vICc{^{PorJ`tv^O7QC$h@jyg3qAO*-m)m?{E3foW7#Ut};#R!MN8y zoq-R;B@Yx_4qNTbtgcl;>2U{!L0P+0NgjJfBsf&FApoIz2A z>Tg`*iWo!vQxUi5H>p~nCEPSf?m%T=y$E#zjdhjakBe?GEadyB_gmsv9s!&gXZ>eu zSTg3@Tnv0M_+F$TIpDw zDXrNNg_M~C{N_3&S18G0##R65A*_oNH3TfNY0@ z#}Enr0NFC|#9oCgtYe01C4GWP5$#?CR+sRwGXydk!58tmqJi81Al1qK!^H&RC=*bp z(DL@9AZbhwa+zhTZKmHFn_;V$fHp*Rs`Q3~7x$2zu5@tgU7wSqzwNf;rH=Kt%1sID zRo?4uy(Jw9n{T}P80b*cNYgoZ26goZIl*D+;t^WAooj`bOt;X6F00G^3rV19kydTjfN%XE&_)So1SU9wFN%dIe{9})o zg9C_~B}lwi+Q{0PGgI|pV1>AkGgF|Z^6|b2(aTZcxA;+GIknEzwrZhAK7J)NSOc59 ziu~KBg1dYjsQyjo{S#2AAaB&Svp1vy(Q|Ig}kEqns0T9CnE$CB^cAE@OOzd>_+wCdF(u0JDv z($l+9BrQ^c6{JGEowWKxOR8k6MkxGPr1$vawH884*ONbZH_(aahNU|CEbMrgzrt5l zybEh3Uonh5REGXYSPCD$)q2QQk&B;KYS7v1EsL(pRP+2 zh2|;s5Jr8>xI4&E`Okk)uX(7pU9JyVu0>2{+E6yH&t&`jbOgyI!H$B%ysk~-<0ui? zLXi*b)a@#H|NNIPAkWzUV^h+Rf$pOqIa-+u2XV`AeMZT}H0-|FVfDz9nlX*CERXYz zV}D!|Dtr1dtIhJfi%-y;0`7${<$11+wjPRufSTRv#s$dMqwqw8sAT&mJs`3Wf>VGr zG5rB_RDoJ)J060N4y9-Eq(UD*=ko{=D>JcOoYFz$*XJg zH|b$h0@Mhc&%eDBJOPy-(N5#IU8`m~*>mp4gzO#!FRR9+2eBvwlK-lMt^NZnbv^1O zV%UkYC+E&^%_+_qwY-#Ut{|{;?)-A}eSL^_z5OyfT0Rl=G@^A3{hX`u=ntd^JW>6P z8b9|w#B%Z59j?Gq|8LFg;$Ab?33g3Q>t2y(KVlYurmA(MGn*Ng^;15*eH@-Z53*Rn zwETbW0I)sxDgclq5Msk#G%)RD3R1Cuo%sS&(DiyY%UF)t35s0_lV9srT6r;e0b1Tn z-8R>OXii2THvRzfg(s?ut-8%SLB!CcwHxsc>t9c;SX``-J?Mrm_DHtVF*;JGt-JpK zIlE97Rmf6lUsm+q zFL^G^_fLpe$YLkUQIq5!HJz&f5MA@Ht_?i0BVJ)-m}779Yj{0xJbIe^S|2hoM|iM@ z;>pkVaHmu-LBbTnx_l`uPZ+0D|C}&2fZUegFuJ-N64YC{Hh34^s}BjW4GIUsSx}`6 zA>3ictmd_9|5i%rx5fgbuxal<_4*^_IcDEbCqqu}o)?IbUue5XYRRxJ2ptQq4f{hM zs#}siWDfonHz9)y9M)KGdoJzAy7;oQqSIzC3p(oOc?1%EK~2U}7li$$$*KjtTnW}4 zEw}d~rf-ub>Bm`|&opT?lEngws0xqqk{VWyh-)nNL#1V z)W~<{Y$gC+_y0;0xGqx2Nh2z+nVdA7*!}0M9SQ)NDlWF&BhnNgM3`F!95ZV>)K>hH zh?g1u=ng+Xzp(AE&z>HNJZ`Z&6UEfsHfo}^PJf{5qLJgC>to7$C=y&6HR1aBX~G}V zd=jYRIW!>nULR*^(lRFW`>g`03I1`13xo;CLcR2>Bm2mf5tM`@Yp49Q_Y}1m^N)x4 z<+QuCPs>@w{&`)lnaQdSj}D44Za(DY+4*EvL;l#}^jXDl%bX+I^MBxxrbCLF8BlxM zRE%ljqwxpJ{n#5oHqRIc#d5 zq9qpp^B`aDl!L+|Cu!qQ_9xHQ`(^(V0%?;CCWRf5E^klEW1}G}3m-YAmkR?Vk3OMT)rZ*MmJ!$LcB7_Si*kIOU`g{oe`t=)eNyxkZxoMzZ zybqJ%f4mpzJ&sD4`;W){_x+T_Q#T7Xz~4C?&Z|6<|G$z*>2$w0kh{@52K=4bdCEB+ cPKMN`hCX0)d;_7bQU_euH`S}YY9I6e00&QINB{r; literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/turn_right.png.import b/themes_src/space_pixel/alien_animation/turn_right.png.import new file mode 100644 index 0000000..7139669 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/turn_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cywia4n6hfn78" +path="res://.godot/imported/turn_right.png-6039d6e5da42b19d3847c7bafd4dceee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/turn_right.png" +dest_files=["res://.godot/imported/turn_right.png-6039d6e5da42b19d3847c7bafd4dceee.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/walking_left.png b/themes_src/space_pixel/alien_animation/walking_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c0bb6d7ae685423e2289bc8cfa8a5ac0ddd92fa8 GIT binary patch literal 75838 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�z? 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/walking_left.png.import b/themes_src/space_pixel/alien_animation/walking_left.png.import new file mode 100644 index 0000000..bb3a0b3 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/walking_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmj4i2dogmoej" +path="res://.godot/imported/walking_left.png-f43165cacab2ba4a5ffe86b3dde903ca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/walking_left.png" +dest_files=["res://.godot/imported/walking_left.png-f43165cacab2ba4a5ffe86b3dde903ca.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/walking_left_start.png b/themes_src/space_pixel/alien_animation/walking_left_start.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf299ac096b8f979163708489a8572560147712 GIT binary patch literal 21102 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 RcP2{$XYgjmZwwtH{|8)jNIw7o literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/walking_left_start.png.import b/themes_src/space_pixel/alien_animation/walking_left_start.png.import new file mode 100644 index 0000000..30bae5c --- /dev/null +++ b/themes_src/space_pixel/alien_animation/walking_left_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d05q2i3lt4fvf" +path="res://.godot/imported/walking_left_start.png-59c80fc89286d8a898587111709bbba9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/walking_left_start.png" +dest_files=["res://.godot/imported/walking_left_start.png-59c80fc89286d8a898587111709bbba9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/walking_left_stop.png b/themes_src/space_pixel/alien_animation/walking_left_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e54ac9506b0ca9a9711499c00e68864916459ffe GIT binary patch literal 16114 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 CRCx>l literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/walking_right.png.import b/themes_src/space_pixel/alien_animation/walking_right.png.import new file mode 100644 index 0000000..13e30b8 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/walking_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b71lqsvgm4dth" +path="res://.godot/imported/walking_right.png-5e34493648958ffc3c7b1587dfb10184.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/walking_right.png" +dest_files=["res://.godot/imported/walking_right.png-5e34493648958ffc3c7b1587dfb10184.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/walking_right_stop.png b/themes_src/space_pixel/alien_animation/walking_right_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..dd12060692d283991939f7ae2e73e6d9139bb576 GIT binary patch literal 16122 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 Bf5!j- literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/walking_right_stop.png.import b/themes_src/space_pixel/alien_animation/walking_right_stop.png.import new file mode 100644 index 0000000..bc10f6a --- /dev/null +++ b/themes_src/space_pixel/alien_animation/walking_right_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btyr8t3dc1mou" +path="res://.godot/imported/walking_right_stop.png-1b80c885c024e1efe6cb747f4df1152a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/walking_right_stop.png" +dest_files=["res://.godot/imported/walking_right_stop.png-1b80c885c024e1efe6cb747f4df1152a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/walking_start_right.png b/themes_src/space_pixel/alien_animation/walking_start_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e561f75ab2e2243d5123a669b4beb68e4cb24d GIT binary patch literal 21122 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/walking_start_right.png.import b/themes_src/space_pixel/alien_animation/walking_start_right.png.import new file mode 100644 index 0000000..44d91f9 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/walking_start_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cq2cb0wu4u0m5" +path="res://.godot/imported/walking_start_right.png-b3d777bfdd98f33db931cbdede277396.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/walking_start_right.png" +dest_files=["res://.godot/imported/walking_start_right.png-b3d777bfdd98f33db931cbdede277396.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/back_button.png b/themes_src/space_pixel/back_button.png new file mode 100644 index 0000000000000000000000000000000000000000..efcc11db4d599628605ebb257b99c6b61b6281ab GIT binary patch literal 757 zcmV^!=%Wh3J;Jr6_sBjG|)jsmCAHf z;Wb=QrAWgAKt;s>6;E-@X3&ffTJ5gAIj>KAGxpx@o~2vuFWuQQ#%Y?s;@!_z_QVnL z`pJ9D&7ls!k``VQ4CDYTec`!45Cn%J?!H_zL2z*M<7K$rmk)t*$`#i_sF{eOHYLrr7Rg*&?q{ic;rbR+;puTq5A}fHAAGF~4kyVjugS8f`zpAaG z`gq&1Qd{=Du^RPND`0(pHkG1fsiIZ^T&YVtq3wJAOTIbiHMU6(aHM2kAM<=Io^8vQ z=fBpsrJkIBWCirV+8NHro|F{O;*-*wj;?HT$5v}m`b^1wi!aM>$qqiY0!lfW!@C=` z)PRF4z{1LDuLkJzO6W&k&kjLw@DM4mZ(;0S1Q{)_oQ!hkw_w>S`QO#PXB&GeU@nHe z4PG|f#=LXW0=-uawMB5X@Av7}&-eV@LGHA7+w}b5h$%2vG5se6G(E;!ZM3rQHR2&| zgT3gcfXEO8hafmB7?8*K4Iu|Xa0r4!7bjN`m5Y%db0FGMw&7{$PC@}Q#00000NkvXXu0mjf1l4dY literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/back_button.png.import b/themes_src/space_pixel/back_button.png.import new file mode 100644 index 0000000..57d0dca --- /dev/null +++ b/themes_src/space_pixel/back_button.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://da3vutcllwhbq" +path="res://.godot/imported/back_button.png-f6b6803304c81b31330977fee6d35dec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/back_button.png" +dest_files=["res://.godot/imported/back_button.png-f6b6803304c81b31330977fee6d35dec.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/background.png b/themes_src/space_pixel/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9893ea75af6fa338657dc9522d106ab9c8250 GIT binary patch literal 96063 zcma&O2|ShC_dmYRF_U>nQZ$%T37Nt%l)21_NJ-`*X&`z;N+A^zsbij}Oc^^(h|DvI z5*dn=dFr6idk1rl9 zR`S(&s9U1gq8WVCU`WU4Q9zKMANG@E+OXlflSY8l=nmeHcyj95<}60m;{t*@X=)$G z@0H5TXeK!t+B0oTN{F+!aQN>B6Zg-?{o;pKOQh0oMD4jT5&y*+m-HrW}-; znpoD}o~u#@(GdN&z4Ju;mnaT*{KqE-5FcSbsQKXs=`xW8eh3~Q(7_M3Cm0p{pg%$( zz>h$YLHI9v#rc2!T1DaqCbaLl$FI-!msIQWIbhtKrvK;1|DHumoKoCo*%;joa_vmH z{=b>CEr7~0i4Jzya1-}ma*E4i`%*H~#6dD1!H<#u}DaMPp82_I;v)uFY#X>_#=|)_fyuknW7yd6>`S;%Z zUru1lunm47hS3sTOSwLmf0H%E|NkDPgZ?h~X5pxAg;AacH9tj0?rhGl=a*D1zj_c5 zCQL8yc%+L^7U1G29r&x96&W%s|L;atmM7D=$kM_#iUwj-SQ$|%R0Fhq=O9^`#Sg~M z*fEGij!UzATmzAktMz3(6LRJtu4sR_AX4|WYN9Y?5nFMMYxfO{KQ;SCP==0+Jhx-&3w z2k83uu-*MyqM$=3>E&xPNA@igv6R7>&naBo@Pyz2P^^}A!%x%*1vALss#n_zpQ`5l zQ4$)u2-7PGQer5)H_~ObOS$63ur8MTqCjKok}r=tiSarENS6gRls&;XI`f=>1bIOc zFZOPPWON=FtxxdBrX()lEO|&m&1(xPUsy2oOr);5ZUs55=W#>iBGNs zVN~Mx5_CrST$(R)A=G^x3-EAoh~BgwE-<=n@Rq(A{Aoj5 zABypa_Q5R&>7@^1n69I!VpKI~4TXoA|M=+%rewXIfS0u<2&G*IWs{NlP3>62*Pub* z;cz!B$)`K6;V`kKFke{p#Fb5Vm_cRn?GAtFBupaWm`1jF#p!saJO-m;vGesG%u>;g_1`OAs-Ik5IO%!4Vkb4fVfxU~>e*8H z#p6#IK^IM5!goPjT840S`S+E$$o{paW5-% z1455Q1~F;5vm-WYvu$Qe^g3WQX%f=j2eZ3>z2*7Ki2msKAJhVM+n*ROy0iE0FB)5ms|EXc@B;2Z-Nsbi4f>aQ*z^z&qO#KJV&V`$(Ne#WprtwW+&U+OHFd6 z{I_tD;xHy@!^1tZHvg*m-o9yx{?PqLRJxkE1TT0hHfTE;ybImjb(a6zeB5n%c_bb? za_SW5h~&E4Br)jb2s4r>1hEgRY0E!1%azyw0+1f8yBqY%S4w<09cGZn4D{W|3d!-K_m^|~DV}vhN3KZ9Y^6b%!zNB9 zcrq{*OqhI-IdYer#81uOT9?$E`2(uw;_+c@C0W`_b`;u;UaD)-;>1-ptFvWI>F(A& zJ~rD3Xa~K#;Em04p1GjVqvvnjGECT{+C^lkV?vXDg(JG!jtx3nll2)MDXu1ubb-&- z6$St(%&ZxznOBi#e-CiIg+NCNVhrCcE(?>X5a?#zeDdGYVC@NE8)am%`webeC%(o= z4&2pqKL5?(+8$hM>}3wOi?U-h)ci@wk3>;k^8LmfVt6F3Nn~nYGkwpR8g)BxRbR$< z+4(MxSm+&n(A-~t-jA8Rss^FG5Ag?)#o4n(MhRQ>i7cO6UsGAsEz^^HihC#Hop!q( zro7zGe9+&Z_zl{`>!6da`@5%|dVh+7s#1|(?tCRrkzYRz?vD+>ZW^l!V5QrF%;2O4 zuDGAi=OdZuB8;fXv~k;m*T;{5C7|%zV9;~kQ`ucgdtP`gH>%Oc1QU@d94{N`s74E% zugd{el=ric$I4LjyTeS&(8_~bXV~1s=R(rni5terUI%QvJie6c=hyu8qrmU;d!sO_ z&Ry47xfUEn84U-YH(YPJFJ$(sXQEZBXrz6qOJKIh#)Yw^na}gEisjD_e${d!gXozd zZgojJ2SG--Xb!{3s2EYpnRb;(do^nci+zd{DB})jfy}We5#o=>~>?Slv^Og6HLx zm9-7v00IH(XJ>qa_xrxw$>9h%9)0?-XEPV`L9xC7&H+0?Hf1xE0n4$tXS1<6`hJQ( z^0<5r1L!R*5*nG*8ak(^JymsOI_tx-fQ$HZJu|?0u1K?;xS3q8qjN>{dN4_uxCpXk zNwgtgEbDBRtj{UDj_e7Fy@QD##>UiU1;P?#FYC9wzc|)){Ih8HHa?^QWI_aeP3Sx*Iw9kw3r5y_MYO})!wg~5>zEc z*|k2IZ6C!$boB8iQ%0~eZJ(6>O&8EUHg`(*NTOOySk-*zMBKxHGGB*ZMTjEmB4_kr zexc>i6K6#oF&VAoy)Z;?Tmm&>6B`WXsXeQYLw@)J=bN*vKPsyY*xV8Ig_SzJxQ9=# zt__d45Q;rlm+C9K`pbWJq__~UR(g4I3)N=@x>vq*9U3VrO^?4KbiL&kkA**2hhStp zhvRYz!M1~JLLumF-gxFo&d*Ou=R(T*%g@=AyFYp-jv~XH4Bj4_+s9DfnlU`vZbzi% zmpSE1e{zY4TyvwS^c@>MWXPV}AOU=ZD<^YL@Re|)ckFHI8 zqFhTy2BSolk2aK3W)(cNK{w6&j>W*_?GmS38>W6))6r%Ds8i*Jym zD^-3rRT|97CuLu*7Hq{?)|oUdicCMcB)<6?B*kf9+J5>|96>O@op4W(PVl)e-H^Bh zx(|}rpY5-D;KRVR>npu2`5Bcb-7w;slhdZCSugQ19ClIx8cC7|lX{h&gOR?K(qgWl z_m4_$(eEV(80C@B{N%OSHdWWY>)%*B_uyJ#D+V6EFf&*6$O%;eGPBiP!ML{fUT2H2 z>imi6-Y^Fx0etUdl7heQeZ>Gwn?c@j-qp3sZ3{1fa?y;X(U~gz$2lO=Fx2%@zt!Q7 z6O;YRpUH2@;41^;RE+C+?unhS;1X&Yp30NQq7NK(ltWucGy?K&w zF93|d*{(cWt2QO-S-wj{E+^alOIxv^1M-^&UJs2=>)n}TrBDmkpgLam9XIE@e6J!bltJEh2jBi@L9*9^R<08F#xh8dXg^xR-s~ElMsGRXznmW$ zQ8f6`>HQ%}{|d9yDRJG6tJ-9bMiQ0buYrWN=#x1w8r#_g>0S0K7)~)t@Q<1dFW;Nz zvgDZ2*oD3UC>uKPiYFn#)<<*kc^=MeSLUu3na8-zdNEw9@0wOteE*CMwhs#w51l0+ z5H^n3@wu2!Rh79%E~V&Ph0FNYW3Pwx`cy?w^9F*}ZtLVW-{I~Uo84b!sj=_M-d7C^ zTh&Y2bGw?m9*&oeR0J*S{&wlNBxE&~)7kTuAGI+gP@?!92_)V%XR3mdi;oS=(!Dn9 z3T?g>AtXbl68t$3pSbiHTdLY#J35{p;CsF93VFcnk*vM4Ny$8eED|-kK^L1RYhsFv z_~T6=iF^BD2yMvzxB0C2&h1P8d z(O$lZb~np&VZyt%L@Hi-?>aW*Nw^NXqA6#(+M%A<5L3m2MFd@sDE;)l`>Xcs0>%6A zM4#f0L5z@+fT&X+Z$UAia#bi{bRv9FuWU3N93lq_hQJYh^y#luU9)d1LWX+?H6N;D zt(50GbuFk6bMugmsC0D*h9I11HP( z7Sa$ppN%xd2{MsIiD6Pc#i^6av`944X5)9>CBG#FBo5)Mj$H{8fu==3NTPph8bXrpUAfRA=Ya%MKbYu8Rme43mpkp&Oo&xRT-gm+ zfY}AN8^`SG4U#e#R(GIi8J3G_=X5jJpCLmr0C|#IC!>Z;4h`A%X6Z(J0_{kBr$6KM0kQBZfkBw*EQKI+?7LETo02F~qU~71pBU)*y^NCAGqaHKqL)&ZuHN-dWe3vR*#JzDx{ZC5J71Ce3or_**jty6OY6TmwP3*t4CB5^-=?~v5 zr#5C+u@VaYnODvH=-qOyhkOC`CU_8PnB6Kt7r^dLVzVAHZlXuzeZ_*1DcC*;r0Dz4 zWD8%KKnG+>&cTMN8$L*o_gY(7FBQL~e4M{mE@1GYsk_Evy!2?zz+7xo=P}TV)22r$ zY8?2!q682=woQ(jum8H#g{S!qonc|)XGe?AnK~3^@AR(Aa(U<2B{pz3qKT?-V$^Z= zMFWxLmFc}gm1D_!xJI2-#7QuQrRTqy2C{;0q@ed*^fuN~IOhvLa@4ja)Kra8r(_|$ znaZ14vYYJ1+Ke43|7ZzaPlP-p4-$8{1MC2?*;sS)n;HxmA=}P5aZW1~BRGg%_cG8v z_R9~wJ@+zt-=Ul@9(kT_ElSCIHn8oAsF|<|;+m2bJ7oLXg8O$x$8zL7(*eS-h?Zne z-bCuNlz^=;j{cPa!lOCegfA7lQsNPb7kB$vKJ!(zmDGsLMr5%F zKJ;`kItO;@JASsVu*FyA3+$`+??&DX^1N@UndocZaM^~%d*r>M!7gfT7H9}z-Ou0m z(VXHjpSU)0_QPYpr&Y_}%bTLVX76Row-0bmUQvGXbB#dyNO9QpvUz`y_~Q|C12_BE zRFno5=WSG~*(9%=ttU3L%?yJhD}x}QyV^51>_zr>*()V{N%D5gNe{;_nH*#=On(hY zVfe>Fmxd006n=0?=5V9skK8{8sW!~KXp?($VGeBs{HZ}nkqBQAm^3jZ$~qhi`YFh%*&7s>?Uwy=eT~>+aSg<;vlH6%#$n2X&@4p})<*rQrI| zq*m$C=A;KrFDl%7rX}k6{G55~%<&8h)5FTumm*;zrTFNR+v|9hmgWUI@Jysz0jL)14AKq?M8|Kouc5yL>QnTTADZmpU)+K?-57`dqM> zZ^wD@A%q5%h+)Z{^3S86eW&AdI8|3I!*ydR(v+PVab~1Y^Sh2LL_XYo{Nm5j029R9 zAa8+2g$5BC-C>9@rw1PU!eW$rFH9Wj>SS83IccoXIBKAMz_uG-J4nRa?<;HD)wk> z^=8U5kBs=i=-B-edwtW+A~bjh=@&I2kJ+jjW9&|NCUnw}U52)y>0LItR^EI17%<8DKio_vm~h#S#D=%xJL;f%ypX{^A7V8`f%sVacPiSB->jX=-e!B zOa8F6ZQjD#%G0%8%AzNdG!|*Un4_-Ec0APovF5r~q{T{6gDQlxlTzAyj-ELqJOE#@5_{h@v-LmrEW} z2E0sPZK-^|rl>n=wYQMgfRli+Ltqs@8x);=Z517q*k*f*Z$KK`&LD5m5OF4fh09BgmHjYLwpz6uar#nRdexJv z8XXzmx2L&d!V^x4K3cX#>yqMMk z&e!ap+$EH1NV~lmLR=16EKiuK@2KuQVTa=x*d3N$DWPv6c6f2%-e`jwp*p%%`qZtD z?BJV2x801%P=7$6>!&^demTSNCD+5UEkXxo_FUe62ePdfelD&V-K)vveW~QY<ki;aZ2jwOSEhIf)E57Z62zn)e6$GHYL3 z?3=8woKo8$6yj)oUbr%FmWuN7<;#bu*_5-H$Eq6B8rwp_>CcC(ZRmCSVrQt?P>Vs&e~My zKd5+SGnBKeF|ibL^~qw}RPk{J6k(s{@Ai(_IW*5cB>p?EMxVSz=+Q0Yi@qinGf9v& z*-i|rH8t6LzdDiGETsJqeOp+(bg5Aj()#R0P5z>?cSp&MKZ&`n!!%kaiUPLc+_i6? zdK7ozdL5|H_1nxw0+kwryr9KYi1d;Jm+;%9h^j+mkPfJ6ZBTKSBMA>kpy;ajD@``qmCb4?vIbLTIOCH&A8BfIYQtsjehZadd0)L_#uhb z+6oIHhrXsaLAKO(rvTcpA9Wdnh6;q(7D^$(xAL;F4AeY$-B*vQPE}4qYU2so8w&w<$-7QwR6Oi*lq*LPZx?6sgMdi%K zCJ=XJn~Nrk$KyHYJOzT59;3YI;*U5v#XZ-S1CFqqA9rEv?Yb&ssbM6lOPD$c*rK)0 z@0}(^yCqYFHYw?SN<6v)7{0DrM^@g#y z_yKs-FtYyPp?*jRksc-5JvEjhqND?YelwS2zn=7j1cjKszSEB5V@zf#A1;1dU8cW? zqWaEzw|wx()o_tf=MiRi*K`!-i+@1}GVLd0zMMkI z8ieG)#@#;d2?QXlXbe&mhfX|i<$i-CqFb+>dcT@7mlnOe0^kV9fC-(vRUMC-b0Rp8 zIlC_!cXl27Q)A-h7ZS^N0MiP0xNSW7PQSXHBLv%F_MowP^KEdwq{F~rQd+V&A+d_j zFi;r5bEwO2p>Z=z4SWAA>qbz6TVBt`G$j_vl&Y`v+!AOSbP@)TcHu&eRVaE?-T3p-Mk7qcaKVQVP_{%-gt0 zNgL!-oW2$a!q}Fw)~oY;}CXWnE5 zC9IGrMg^gKw@1c@^Oh^TB@L6h*7BEss{T%Wy0+XdV2?8%3V}O@b58TDqWA|`GYB1_ zss@ZrlXdE=&!j}xPvuMT@S&lJQWBZ@udLPo2Fd!T9y*h;jk1fw{5a zuX@pdgkSVp2lK;5;#{r?m{hRDu4S!`U22>1+$l|qEZ)qq@j%Q-xz7gc4T}V|em!;w z7O-C5)bBf=2qr%+CF6X-kvfAtdD!n-PT_JTyL%y}mV_y4y&|Gtqq9arVC@gN`F`en zZX5V&LqLUY<2^s)Gw5yE33OTSBQ^nO%reN=rkrz4BashR<$4_W&AP|t`L_wx-?M@h z>2_CV`5;OGo?(`pzP38{uztz^@$9BYy%AiOpS3F~`_`x4CR^sk@`;9Wu=o^-o0>oQ(N99>O;f%ZNR(c% zS%WfK(zR#5;@fjdS2r#3VJTNP;H7FuoV`G(HSIpcAV*`+&hCC;tZ!f51tzMd%kHgG z!>GHn`}TeHOm)T7WGF^&dH#y`%pk5-e>Y#a8l@krw{jlQ7e3|_qtkVoo9wrolDI4R zlMJF<0x71|xM{QZNeT_CO?(&=N2DtDTyFzhJ|rnoctsQnwnBrWtv@?i1pA8eiChJ--&hEK8XwC{=*{oY2Xa{kmcfZVbw}qAxvj zFP>OyaG*PASuQrxPW!}q;?YlD-`wAii{4AkDah=&@qOloxOY0DTwWIE9SON-Ce`xf z=Fp2=KrhLpEOqyAW`s7vfeK!)%Bac_FEo}wgjx-Is!(@6w!hUTB>9sVBIQ%_>z5oH zGJsE`NffoKdQ=ZZeLBjk4nHu1kE$Tml`UZ+LmhZAbk$mb?}YNa6oDKxlFFB|kMyU) z$<4n@$@BThFC__`vsyc(Z9_!}D0;lEXl=qY<9)(EwQtSH^41{5E!N{zD>Kub67lWx zTpeDB1U4)5(h^55oU)fM;C73Jg zlcG7|OONOeQ;ddgzD%}a?OZE!4Mk@zuL;;dFw}Kz%_XV`V(Qokb*Q`*o=&?z>}sr& z9&fE{{lIAHf`R@fJv-Ct@ukWM#_Op;uO(Mhs7QBQ?~Dlz3N{gD?@y;>dH(opOAnR| z?kL2;haJ3=sBAk(M7k_4FX-_0^`2`=lOD$U-tUqpT=>fm>IgspXbVKIFe!q()4@GI z$wRa!B{`(h?SYBeOcMbugh7eQm*;A;F#8TQ0!oW<5`D)Y-(7Wzl&A~Ca&W>Ljf>B` z_fp|976MCihkAytY%#loX71|H+xnSmcnDBW)BLmfU5+jYD@n6Ztu6(W9nVcEb6+B`K_bM%qR`2|IQtgMEA4C?iR1vg@u`Uy0@WPlIe?S>^W^t zqDoJpoI-j_&Hv`%4qlE!k*O2t=w)6TU-FRE~KHvGqkW z-r_#+d)#y5?&YO|b1WIx+)RNm%7B~yG9(B^NNs2XYIkw6$52pb5AX%*?Sn{r3z_~< zt@7dHdkL_!(H1Zt?$s#IMxLn!Iu--DdoMgF*rWFSS8iqdmBp^7ex;)x{)_5?^2IYi zLojSd*P0{7<9(kVN;TcLFsih!ssI16J-5(P%SK9%xMOe6n-O7>d!*0A|{B1W!%|Qe(65XJaC#)IT(F${yi*UnE%!nGw%moRfoV&B8Hv>FjBme zA>e#OZ(%{Z7i{#89a?AM!+%=IK*w=i-pbGRu9MSbX>0k+I{;piCpEw4fqCaiZo_?a zze&^sSEGF3ymbBrkyGM-|Je555MjG}nuFxp9ntpI*H7Xx8wGV?R)RzE>={KQ*e z#P53Ws0-gPDl)O@#nSPw!zZrIH9(~pVROW=su4TA*choJN5zV&6T{EOnmJjeoSzFC z8=s1QSW{fRl0AEg57BGV(Cvzk7tLl@$8mjqd%xIP>KYSSic9Qo1USP=@D4#FPKGuO zlr14WIO^ieaaq@e7;{@!*m7Bk8Ofx-$Ee6$ui)6|A&qv=RiP-k)0wtR ztMH z!*4RFK^u(;DR>sGWjn|k7G6%QhN$ej)PXtQH5P3QJ%dsAi1 zDIvqA{b8-0CekLrH!Psz=d`r zf*`X0w{NBA^sm(44pGAhX^IS{y{q~zbcm?FYP`Sv@sfqs&9Nt&p=QhB?s`%`k33I9 zT6B(!YV9)2qKuqG$QMF=Z$8h)zTGXl4;revk|J}jv9_5&TCB}zvRb7y{s}K^70#$# zM`3%Qh_ACftA}zv0%suN;%WdlI|l{RM}$*I<7+H-o4q=FnLxSEaJUyHjT}nxRTc=* zyHP&-1s1eD7F%$3CMbVI%L3E#7JzZYh`srlS3vwq8ynl-qPLux7EX0HXl`JTX?h;k+%}V z%tQKB`%8W+iuZ}sojFC%-c3t|*zjIJZ+bY*nB@QJ6>H+*#`2Y&Eyqt#q2}wGv~*YhtTfwb4# zHjwP|*yrA-b!80*krLH!U`yA%=&feQ`@;qbU9PRABUOVrUQbplBFi>zLe9hI&P@ZK zFLX-NanSqJ-hC#SCL)gbr*|U!Oz*o+7YslxVrWKZepoBm>g{8dtyLc*A{TS5Ls$I4 z$FrHm5yPSiP0up}(wM+d@MFz+^hU=vz~tTtm*tjju|3I^ES@KFuh&};Y&ovA-4+>y zr)-zhDs1ezz~1yWJ2~rGmgHaiQttiXap=IzO@ZFld8Mf=0hG0S`ZA7T*mr2ow3OU3 zma#9{LZIr`p|8VuH^+#Je@CW(sR|+;zvQzPb|n4$6T>ZHgNSTkvNpIjc4_slXEC=^ zoyBC1aH0m?w8LF9OFLr-{c$`NnqV}9K3ozFo!4mJVW~m`yGGxr4KmZ zY&kIt=NIYw`B%pWiNpyPE5*b6`ItBBC_LGKw*Q(BtpiOwn@s}*8*iZ7o|E&6FrCn6rNjiSHFi&$P(ywwWoB#h>ws38b6kuKS4Crf7BPq-^7jWUmmc~8 z0VPdXU0I6B=$!)(Kz;t-8dJCKKosi^iMD8y8-~U=)Eg3={I@&KK>iGhwaUgNC5?&cbrzocS+_W$ zw-N({fTJ($j>sSuk?3IMxwLbhF{bEDVq;M(Ca!9qPt?mMU@M?Rt(S>n_KXeUYG&cS zLx}VUh@>L77)%;0!Y}e<6iD~EkhB4iB7A&M%ER8}#BjW1W|kV|o>C#3VOD0;c%W#5 zF;3}iPi?bGJPIi-OOXONE2&Y1$UrR7oLxdAMgNPu;&D%*3sO?aJ!kFTNVWzhJw#Ll0SuV58N@odZaB61Y5^x5^ayq7OsSI zmby&2cMA@$%aEowa3L~Z|0JO{_07JkP<ReHPg){6 z8YSCJxP5;-c((l71Oz#{!-I&BNur3XPgIGZ&Y}b|( z>ZHXX;=eUyp>yJ0;k3X)QIq>|<;joF2#7R%ws7-tXh*vK_4lW@Ob>lmd*q<*Cp$V3 zXVmIBF$7@*lnKYwBR8n&HJ$MRu`zj5ch~fDpWodNBF6-$oJ;9ZY|uP;{zYhdNqzs* z*M$+0qjW@cj6vS=bm1;k>J^#INRNs;W~=(#f75>Ebf*}{+#wZl`=(akD%}Kxxj(e~sV5CTY10xh zXz<*#4G%9y?LS77ak8EYF~h})-Jz=fnm#TD`X_U9Y}KH;t-aoA_a@1b0nf$e-79^t zdqlqjoQGnY@hMLCh<#7EQS`? zb8}JU#YuDPlyi1|%|BcuL9c6H&hf2JK=QEC3p>$b!R>e}Phz#x$SyiwhsYu*EMQDl z@yjLDx{mI=^W?-ZsKT`Jyz~69Fx<2uEmUo{^TFvhRL(+anT-N&Ru#NU$t1-LFmrEq z5`9a@*yc5;Fii2P8!8^HEU}rYSn2$(RA4g^W7G9dk{3t{GK`YU6k2|wC&U#9F`B66 z?bZg%3$oMWE=$Ruy1Z4DWFxbPB%Lyqt_A%9yv4EPXiay`t=2ZG!2^}jNPUx1wTCB)^cy^g?!j=YGi(nx}i3^j(GZ+UiiFdNE37Iqt?>6#-htoT{@ob*4P!Y??HPVD)z^7u=EjtU-X z(HbZaFal&WLTm(l`!e*k3A{P{Y(J5yC`KOqzE zu@-#g|BT876OQaXP^gJ7ET?LB3JA>>xOW?VVJ9|Zx7E_8Q}5`)WIK6>Uz>GxeVkqR z*KA$4AmpNSd=*m25Kgb(^}=F-)4;@@ZBiKEjNiFKT4@34?sXIp#beTO}*Gku0ZBUjdR# zIZ!o@^*Utxt3U;a@DX-<>^p(PWm0@GqP_e6dBFaql3Mp>Z>pvude-aF=Yv|G_>m+0 zc6;BYoW{|Qe4J&}{~k;lI6oQN1+}E#L(8$bG#Pf@^hk|fKH=f#+@dgrwqv@MdXfVJ zk8{5^yEM=8dfG@E5l?3^$n=w;H#wg=cRh6^d`3veG9L3!Y+Bx8l!TjbWvJ(9s<({j=9!aK&xgGvi_z zqvTAclFgz0hudcll$US=#VJhNBOlbsP=HT3e1u)hNm5pO+I#5h24c6x}*XGkI2JAcp39u8J44x+gJqbHtu>m^#$&@z;z@^7;l z3r5rFC_3&6o%Xh4QBkGy=dSp$H^8K%Gj=g&ve|>Sy!iQT^@z&T5*D7Vr@OmY@oP4K z>K8+qca)zMAqOVl{|gOj++-oM>v&_KU`(kmk12n+W1rom2l>k{I4_>ntgJ;(aGI!B zW{z~^waR+ziU@p=hT4l$`#d2lYVuZJZX3U*ZA@@XC@Z;8@^ErCogm&S2AWp4EHE$? zmvFy)5t_OLNq2+N;~EI4^Ykf3A?Q!|u3ai%9tQt9R6`l!Sq=x1c;HWh#{`Ytc!|q}-Xx`w37!vx&7hiwl5~BD`R2jvkqI(Kg}T$M z9{Ci&${69U4a(zrDxKEzcV$lqmI1jPxHyKyi{`4%ET=dbXEtcYw*+-mmsF3Jz%tX` zx2tYlbEh)27u^}cIKBAhE1NOiWV=E~Zf%+bVh8Gku6w(mm-^DOMc}U(8wozI!pbE! z+yr-kM!t1aF1P%wLD5TFTjxIlDS{;a{HFa5U4qZWUOo`yr=Lt3Q~`dCGMo1;{irg2yUgBtzZNgBE;^3_P?s)Yx1UIUX89A(T8gIQ&*&#+hXjOs#W)N$7N)@&#Fn1a#c&pU$b7LH4z6jqq(|Zdn1cPVrBI%+&^3?dz@uzfFD01_qZ{)zy5Q12>NIu zpIE;$I`imy@Ltp$l>F4J`l`y0(gaCZ*sGuM$&%K-v@@ItJ;8fWkZG^Q{@e5o`^E6x zV@y6pNLwZISZ>@#QD89LA_1e5-Q>=0E&TkSmO|R3eB>~ZhIbh@P`qQlM%?+A5hCxl zW65$+TsY$k^Ee(q(Nq3?FVZ~PmZUHTiZ5gSWP?%t*VlBr;lgbtQEk?IK~Zd4ji=r{Knir`b^A*Th|iKdq(l6LF5jyURQe56E3TD>6!Ek+#@Oal_*_qRat-6y`B{biKq zvH6F`XQ$oE70@>3BOwpE*nIi!-Ky-()&l&lzp!Tpo94Uge2#xFR;dlV552*WmF;5l z279h#r5mWo($H*g%_O4zB7=x5+NfCMP)B`J%JdN;#p3!Yd9L2b&Dgs3XnFpNRGXuY z5c80UzRQ^eM2^g`!qJ43_;_c$FgW;c#-mkzE-H)#`aNfjRy#L1Y6d$Tv$AVtaMb`z zV*0PfrL64sDxTyVrf#@Ygle62l5Yj@p+USqC=%1k7C;sJQs)*}Q7iHMU4;$1F8AB1!V9Id1I;qaABQ?T}+gjxBTOdt!&k z%|A}>+E)KkJa?dViYWpjVaWd<#EAIVD7-pCT;0TeJ(ZH@pIM`;UNZ8HpRJT3=f!5! z2AAK?H!UcX%jtfB>$6{W(9=3Y1kiio2GN1=>g+AS15kKy<;Zv`lvn(^<0-C!w)Sve ze7w74!=qWVTV8Hjea~WC>!o^&Oy3#!HaIVq5$GYPfh)r;mt|5omSVaYHS6Jc@&>_R zE|;le9IqH`HxcL}5|Z}~=AW2|8vX(Yg9F+bj}#`dq~5^1fjOa57(nfQNP6RV=2ydVV(g6nd5N(-C=gMDKJIFs~r%HQmKJ|6&ED{5)C-aCG zK)?^b@#GzO&|>Q5w#;|&hO%C26WfHW)zUAb>lt04BVU?qG&oI6rIWV}qF1e^p|XB{ zG7>bHMIhAyuZ5v&_*PNFok-n1!`7CxS>K|Vo1*l^HhUG*V7;yiQTusbV5`ON$N#wf)Lqrmw8>946^XJ{jG0Nr} z6e>BbIaWpWOIx50vLEfcS_e+sTEPjZwUU(PL+NlA=*!G!NgTD+5 z4Z4+{`6z9#KbR%5W%6~fE^iz;Tq;SS{wEXAb5#aQ!M%woP+eeeiTjnATS%Cx3T34E8UJ>22d+^-(D9WYCioO8W z@CE><&9Vm6qF~Ruri)t#s!}W)cOpuezMj85vs$Xm`1>BiLNg*u_w|B&L>dxNC_8*Q zdM9yFIhyTFgi0`UPRQsK(W9d7pSwK9=;TO!I9Nca<9-yb0Udo^3&llTA@jsPQSJN? zko%OCGOn-xPDI_Lk>14>KpjiK@nGZbwpnPQ#FNO87wjPnEY3Ir14Z7DS13US{r7j? zB4S=WeENF-ae2uwA?MI_UjsUS-jo#<7hy)U7lyNle5M^#u{=_AEL3Y?ZSX;)IdynT zw0prb&aEmU5xF<2nA>p>g31HydwhaNy`yj;_1lm>NL~7;aTjV5Y3FxkOeb<_4H=@^ z`Adb*)?`Z$h*pSzMq#cWe=n@1RVPAjhT+#uZj|s-E@~8p3Ln=G7iYG0^PQ4zJWTah zFZ3H2N-(WRB+6Ba{cSt9AeWhCY>OUKG>8!R$(9%IjU5D8u)x2v3%I}yU9B8ozuJj= z`7ZjM(v^o!c+w-8Q8&mQ!;`gklkdo3?sfmZ2mo$2Reu)F!t?JCJl%e^OgJE4%6s6r zGLL-3oA%Ouj>0iF|GGvD6>lu1(MHrIG;w0r$=L^HkjBB>G80o);v_3x!QE?;2i#_` z{5lLb+^)f;Kg9OFpGHJ0<%#PfjwM(3RzO4`3;lNLG$Ms+|Flj)%KDYAHo;>5w5A#3 z@tpuHvIY!H)DTWXw<*?eAY6Jg+*KPjOjBY3f}uT?)S_ofRUj zr+2Qh=u&j<;AI|U>#~03+hXao44XIoj?d4nI_GiLwm?^*AP}ChW=KO3U-^zLQ3ZW~ z-Etj&8O-_|E~SbLA|B~|T*RlJHdzTzZD4n``!*FLxf^fsz}RH^iO9KYzO?$?PF`RU z@8>>RHgu#v&lz9}SWgG$VkYUpO46estEYc>(UFH(d3xG@$l34wZK*Sel z-2JGwxBHCR<&UhlVM0uWfv3w}J#LOAkC|vUmJ|V3MN@Xj1 z^zI(NJn3UJn5nB7O(V#Hmc@3^(!UG7@hZBx7zij^Oo0p{eZTtA-vh9V+sD^m=8f5Vjh!zD#;9yxZT&dP+=`+XURF$LtVOU+A3i^mF?KH5PY`F?qRw|6j+*Fxem1oc zlMPj#7IY*#>Zu!cJZ^$jz&(`f=3e>?IdO&EQ4bio&2LNL49;@z@aqQ!YRFAzv1-az zIc)Q+Z!Ro`&A%DmqOsnZv_!v=fNzUI%jpf+6#Z`P_YNCsAtAJ(HIESysdv##CQmJG zxR*Jdc5gD!TUGSOyaK2$o6V$$yXVu)sn?z66IM$rDqOTfuCfSvML}!W84*Qh?PBq- z$}%IHWLOwbT6=4{jO&a<#sAOC5WvVzrW6dvydg%wtbtv!4R&?%&ySl}RIAiPIEk2a zDi3>6p}I{cW4DW5=L4_?^L1i$)x?Q1ay(W?)xnjh!F0e~7_wQ05moo~mfiYVW-HBa zGg0`?yP42*fSH)iit!XiCP_uY#Ig{$)K zdtjB7Z~ufZE+zF14_1nE@y7ZAfIj>(@1F}Lc(X{fbLO~2a=BskRLQ{GU8XujxO0Y( zt$_&@hn2;H%PT>m~)Z)8s?pntn_lb%CGFh0NkZ!3ONwk|{ zMd+*3pZg@Z;`|jLBg|{_mx-~Lv^WqT$!Ly!(MX$w4}{TEbM1v(9f>C;5gB;?V89oD zD?j&HJL`43s!3z~-67oTvGMMfd6Ai(Jnt6KP?cwlBoCWn?f~p1rIzcj;|#u($r|Bi)|U{Ffnf zjkUDt8ta=&(LiNQ79iZ|F_gn^Ek1H{8V+yr=K}iPest@BnGfv0ZC!Hc{XP^)s-c|u( zZ8(5D<)AuXX19HpFM0lc8T0Ige22}K))Sn)pT9!)RsZW}C4>K#iUq~37u(E_T~_wj z=C<)1DA2X6Hx~bjZNZOk{0oXss}4Hkt2*R6Kd+=V{BN_8f`LK5i}>o1E414_Pk@5% zgoFu}9hx_~qP8qP&i<;fzG-&-z0k`;GrR^pFBjcG1^{IR|=pjM=Q@>_p z5#+Jj07{3yy&x?vdlw?%H>}@`3_|V{oP9IZIV&&N`_FYnR}4%?k29A4Q< zSifQSSzu-M#y;zZN|&jTU`e1E)5@Da%~F4m0>^5o2duM=pZc}DWm6w&l8zBs29L$K z6A{Tb=RN%c;~von7}_f=j~hDs*6Ydak__%C)CWuHp(QL@`@i26^UsiiEWVK2tt&XK z9&|5vC(c~5y=1+)2MLJ%P!&&w4T0{0Am=~kf_u`Y*_`Py|Vu~2;Hwi8U7IjB)};j`jvIN zoPh3exA}kbpHZcQ@1Ht5G(K>l@zDOiDZn15aWSnY1|84&^in&|7F35ohx_Tx?44n7 z6!^V>{Qu7`LLfAN0cVD1{O`?H65`u`3Cwr`D;0)Se2!X6in=m{2{&Od* z8DpH+pYr!SbhX@(>nS}5rMC)JTrnXYWYg#z65Pd>WMI^gQsVwv0B3;+aQ?6Rssxk3 za|1}*U|gXazXEW+Ap)NN>fnEtaCs4nV7aO?lblF?gLELZ6YXNDVxU@$g8kSzyi zeJ1SS{Y%e!G}EgUv2I8KMp4yzP4&SRP>->smdWM%jMz27G@ZjGfbi~rc!M6zk!;w` zgw{Ujh)#;a=<#t=bO4`(?NQ6f2(cvchyPqWay{gm**A?> zgl=1nmulc-%(tMu&v)5^~fj5)An`!1y!3fx8G?LRC|2 z=3!~+j^Q(GG0MM&>(M)DBJ{iV>P?O5B!gN8fi6=Ragpm#!9=MGrj~e@vaa)CqtHNgG;$$@X9_f&R+jv46OU@cP;-gY-p@eO)d% zsz&2j`%yet_zM;ECPA5>;h_L-aKd!uI8*AeY4akHmn1pqM1Ak#gn9aQnGc z+y*s;K0Yl3SJ5((<4t)hD|iHfz&BcSPCoh21!yYUdsgwG>Fw{|cM~L>Qpr8^(AjYI z^YTfBcEb_e6fJ)HtzlH|7GOH<}@R=dhekpLoI7=XjyIH@#hru^x!vJY&@uoxE zhu{!c2JMM6u?*YpH6TbP%|N?bE zWE{rP92U%Q3Y`!xybvxH?q>?7kL56kQePv%@(3vZ3!nPGekCL&s68{z;mvR6*I^P( z_tcLwH;#L#{mTI=TE%78@6V7w=A@>voy*@OI%XF zVN$ASF|&Af4ZvzRKe}9_l2u53|CbvPBy58K9nPEoQbCA-w9F3S16MRu%mG9S1zlGP z27)DJGU)`D8=eRG)CrAVhOts0VNh}+NQz<%SXuo z>pNhPf8h5?(1svTc#e#C8~$Stmh_7j9RP(FpcDcWUVuRf{8Xo#)N(Khk-B0H2wv0- zA=yj*U&ZH0Q{?SEKsG4l6q}ewdrL>Dk_p3L1wN3@57fgNTL>5>FbFXI8!v@eu|3nU z(n1r10jw@V*{+K8A_cIl7EpY=2ZKiAxgZdRefRP$Rn`9r_#nq4%Ge&h|Bg#hvH45B z@zc+tze7(ndb}gN+`pR7?l$i4i>eg@qn_fR2v1zj>6Xclgt^W{kN-;07^3e zu1GVowN=3@y3V(Nb)8OW9a$^51h5vIG2j#c#2w5(PmBrt0Y1~&-%X?b4{?=eIT8ob zR&&5TCD;?{G{`#6ecx2D2v9cyM-uHF3Z94Rqpy=9ocRe2o_rC%xk~B0=9~4Ulddw1 zq35$K$QeiQ^Fru%Jh-m;;dsb&GY@74b)#?J^-?qdtXYmmH5B~)*aHTc)D&6^^2&sV z4e33-0Kf3+ottK|kN4ff3JY4G%9hp=8gUJV@|M9qdL{yaGCRh-^ot%iL7u=E1AG!V zCBPj8`>Mb<1AT-Kx{o!TKQ5aYb2VJ8+`&Ap>u_;NsRvwA&{?S9}2g=%yb&Far8@pppcM zAb>}W6!}l*6LiGK?b*L78=y-jwlcJ`w8N-1ZTt$t0zzDH*5oaU9X7D2Dd^Us1u`UC zC<43Q7o2L0Nbmo1jj)#B_?~_Di}X+Q;1`BJAC(-cb&nV4qx$6>i^SoS;Bv3O{|X#} zh^`R+?MLAV(Q@2Mu~UO5R%?hBg!+lbPy)v6WI*mC%lohTe6keqVJ@}q=mgZ3-2UN} zpq`%R57+Z30qwnh!(d%qSLwe&3GgW# zRGCd5`tzTl{m(v{feI=1rJsN{v*l6&=m?N4fEzYjR{?oDaD|zV$|@%*3!BqaTmSe~ z)QjLKXpH#r_H9{vNkKT8D}PWJSQKrOe+?ZA0m;%F`%Onp{ln26)GUMMY~UC+?nCJ} z=(`3dKu^OHRei7=5LplhgNxZRqf{{P2f^b(A7Zq{lNSvtW=*Z7K8eK2uzI*ui}>%H zMro$r2Ho-DQ-gf3fHe#v(<0R10n!+4No($F>fJO9%>LN`YB{P*Q{g6NFS+7@w`|WL zPU>3^M2?4t_jNZgkaRF#9!`B|=zc9okQA|h_Q%w#H$?XdkBXW-eYV30_4enV1J;`} z=+y=dKj{egQSAEAinq!ets2Xrr8-eCO%NJ? zsK}&{ntW_lersf~SF~el=DK5|$JIHwnmK=??)>G@NmtK5k4mXvI2J0F0woRH#hW+U zJQv<}`%lJP2NI73Y&J`*-0mRshlL`nE4l;tBCJCuDb*Dw3E~p<|Di;FXnTZ73ft!q9&8xE5rQg}DiOFdc)Gc-X*U^O*7@{2^2A zTA;{)9cPJG8zTDqq;SXjmNEHiW8q!i+iapGKUfMb;sKn;bgLRQZY z?=NRGt1H$eJPN4hcKQ4~;PIg1C?LMBLLL?gVif6MiaL(0L5-%-El$ls%8sd{67h{FzrY7-u&& zb=su7Uuwsra>(#${k~c~qGv2Pt^!>|LSI@UONyFmG;jJUE}kbuT1e>*g0>P#i%KFT zsiU%?0@?He4{tVr2*pT{Qid9<2q2!2l&>)e6(6!WQYoObHH~9qvlIP;1m4+BcK-%( z_tC`YZ^i`;vwwis2DJjnB2R=Eglqukmv8VVcw!v(a*)p=RjAY_zN*5A|MiaCH^T)H z>qRFf;PFJaZ-YlR_9wmr3kk>>p*M=)8mNKP-<>>P&i5|LsoKUs&@X@@H1}o$H zn5Ha=i-rYEj7;$oc%W$PjD}0DD_udr zFz^fG63kmWuUnl&*!vGslY}3d!kMyV6G1Sx>`ez@xaY0?W4>biXxGhNc*Nr?`l7;g zjOnTYczlY{Z$e4=03!CAqIXHxP}@9?pLI14XgIvJ6Z3ngN} zmYW9PhW`SwG33+k==+xfM!6^)DLK!|)k0$vYn9S1VLYUQS$?y<*o#+s``gP)Aj_qH z&J2?)^N)=6(AcAK(>BK+W>r}W5_sv}bhMb^p4UFMa-}AqjVi>SF2p|r5%>TMKwA&r zoe}xMy-1|Dh&WVGQgbuFk{x8LD3iYD)h!I<^Iz-#^ zl>woDzcwMiBr+*4ABRJMuIZi^^Y4$MnGM&oL)qQPxX*&Ojej)i;X|f;o^lWiJb@Hv z{lmXSCWuc#rn%rV!J*d_9s%){9%It6HNH;V2Faj#Le0;RXp15a-9Y$aA5zjs;R)mnKoT z?b)63TNQX!s%Zp>c0*xSm;v7&rzL{2wl6F4>V4&0%M2C@lg86xJfk8lR&Qk8Oz~Yio7;W9uDoD@B_3>le0aLixW2G2C6p z4W6?Wz~e*V#!NA#)_2jQ*>NrMNrgj&$@k&6J_8D zIHUB8LAlvAcZT|%kT|>hl+KD+DzxCRJ?pb>)P=i;K=%s;jA+J&YpyA4K8H)i z18e!5LaIwvwnq0Vb5^Lw0m2!RS7kIH{h%thLZj?~M<9+Qi+)i1ftKR`6XbQe`C05} zJJPVIL@?}?Zb2F7GmCi&LY!VIS(p6inJR$-aO z8ucQLHbC)0ko(XmrM{$SgJh=NTm>f@aj$i_M>@p1BOL|QMaY6_6(o`nkUolLji0ij ziYnoizoq;>*%%JVyc-${!Zqw0H4f;Bsd>2RP46%ohl3A|eZ>Lufg7eHp&O?6VdduKpWbT3PKTxgV)n ziPl7(0Hr!?{xRg_bVK`Zv9{LVAzC!?TGB=ws!|+E#TS+SW*!jQ<6vH#1G_%FJZo{&X<5QG-Fwf3t3LQr`3iYA%^(9av(Y zKkUmNG&>ePIpU1?JpPvDSsQ4tm_o0ogAolACwXmuR^|Tm5U@f!L)c{1E?lCJAvnTK z&Fj}9%_90BvK3HixZK|9@6mEwy7HD39gt~|D}kH=3%Jt%n(j9Ms{fd#TZeM3jY?`i zfy`8m&YkE4^@yGvIM1h#7|_4-IEU&D1!5%wVnwF3ByHc&(5d!vNmz=lYoDyy8aWjC z2EiQfVRUmBxZkw+?d)u6Bdt6|;%q!i+X`G@UTh@_CU^voG`d$(pT+sJ01xnM_gSrM z2Lcp6E7d%%w2Yy$4<^-Eg>Ru+hy`NMb2|m~`Kby^$5zpH(SD~Vubs5q9Ncftc=AnJ z*5p>-4Gay`K;<|JY{g-6Dugo(?j&k1^$-tKSAM&_a~OiWGB@(j#@E)Un0uI(aCXO6 zb=xs3pFcGKx`R7riCyn+72}0_Z)mS21+*C(4{zysh1XBdC+(Am1#utCykWU}#yajNx7nerjS~3q2mTvIqC~5dLI|*)nU!YF&8*Jd~ATffoU^ zW8^}irAyJFjrRr4eV;?`&3$oUpe0U7q~X?P!`#hB0<}xSjiv!4We>CYnF;*6xv)W) zj-Ss;Y4H`nhHt80`F3r1Xk}Geg#6DS3}TqdswR&~frj^cL$!%tm6=ia0<0_A8=Er{ zPXOG-u*{-uavn#dTd+OlgEDL+i=ACxhr=HGjRm%2eDCPQ%c03xkd1d+UvPg2OuoMx zcvuUh9C+`n>00=JdF**^uSW$$HRY)*dHY)W!9&b3vk8cS1-v|T_kXo@zS;u??+y2x z3HCSY=Lh#IbFWQuTKZd~M1QYTXsh$7x?iJs=D2|Td%2oPVDM2Xh{3XgyfnIc7#qTz zkyF*{k6W^&#cuqVR!Py{bLV1k_)#TZen`i2>xZdo%6{*`BVqF9uDJLtKl>WkB}4Uz z^GQ63UkWU!@E!tSX=_zEnqVr%236iF+1xTR0xjbYu07CqrL$7i&Da^-RC%elqyiiA z<3?-~8wLhR1@hy0dFp1p^FWAK{Y9sta*DYqpZXJsY?&v>?u8Y3>58Z5wC=7)D|zO# zwoz6_YQ;zpfjVn{dl%nze6h)oQ3d%F8)*HZo%!4CRh0Xc$#5hdnyUziQhG~tUhz!n1t)>Q6C zV-oUs>$*bY7m#Rk>M4C^WN51$-XuG+&ekbNyiN*6wkO9t6h0iT4J~{^l(q#M0HB0A zJk0aXjTIXMj9SHxvIagNwI!v8vkP6)2Fsf+U@<*{a~2`fQMr0@4ycf>`dh&uvv-em zC;<|m;4wC#u}vHg=Kn&v>5Xh7O)+bwe=CB>x@C6d4eUM8%#HClS5BQ9ESR$2>GsCK zq#dIJE8v6ainH5z_qhYGRa`t=QTC{&h(MLPsYb+ts2c5c>ac(IwYya?G!EAGC9`9I zov#R3_jvE*8$@;rAIn1kPct$`&q#cG+qSWNHOszUIyq>-DF{6ARZ0jq}r4<9qsfSh33rcn=P*8#guFHRsWx*$1 z1IMfHhO_rEzWgq_R?KpYPD!eNtM9FrGyAjVvxE;xj6SlcFbA@eiWw4DvtDcxzd^b`<4Po zUb_2DQ3#{@*Plqmcz_T}I~(-cP4*AF!3arnR+>+8uJ_)@jlt5$KbW`qGEFzQM>B!@3BefdVH}$g(maLgVNqK6=7X#q~(q9+o6od8^>; za$Px=oX$#%K3q$h9#z08r1-(Q@+$#j4_?UE;BJEH4i=ll>IQ+}y2|$|yOjuZXUhv3 z+h{0O=RThD--nbA0c(>~%^egfUf=J7E1~3+{2Veq^L9l$x3{rb0~f(0NQ9&Z5Ti;$ zC)CeO!<_Hb#U!%r$sjt^`ll9DS2kLxb}6{445qJa=_b1rA|g5((ny%W5#w4s6Jz$X z-NJ)|MpuSi4=yW>JN5hgb9WZNgI9eC9s|-c{RicJ+mlG?CKxoOLql{F$Tz8+?;3yf z{f;XX6Q!kL#?d)~gyA4op^j&cKEG6F1mm6FqR4i}p8UK=pRZDBz5ZmGzX-}o)l5oz zP#{hH9kjEgZdSz(;$c<~@R;Js6A+pXxyw=TJ{k(@und=mf(hgTrHlL_gVkNf8Y(Q# zR7vA|dEf(k>gvIO@{^oL`Oh9Ktf6WXLo*AYL$lNv3jo@==#YJYfqa!iGV zig9M?KGOg*5uXUEXX8k62?ySnquvp>)Nb)My3Gq)pb=O$2aC=DbkHF637a{0S!7f9 z8Z0D`mgOGUPE|&s%5zGci-Adi`~s;wPGqVE-O ze5TlB#Hae0QGhVHcYGkHriR8u#aO(^lRvuNkb(J6fe}hqO!vhU+F=#6BXYl+Sy^xK zUisXxu>Ngpc3^UUJhkJu`;3c*8X zb}1Y4(9Le{9Q2Q92mJR}ZA?8$%o!7q$n5fWy^y|Yq7zD=Mj4-D&_3i;P9jr*-7MY9f2bqI-?wK0(k#iJm zh2!mMDhp?xo9smo5hF{&L0JzIJ}%kG1#CnLKw4~hVgLsOMhxon%GyUMeD+mXQd6yU z@;p0(5N#77u(Hg#>cU~$%zc9eS4|!u>K}n3eWP>n-7kggSwOJkfz)h zcBYN65D_d(I7!sROc%XQNGjrM{Ol&M!~XgFdQt???!8gO-JDL&^BZ?OpN+9| ziW1)aI5Z|()&t#(5@RODT~3E32SSs+zqOaA%%E6A$~ur1nnup={`C!M#dJn%V#Aj+ z8F!pVS%!DNjyBrurBD-J0}`zv!QcD`{4LHliDwsO@AQ*<-7_76wq`>zCalWbNYA0_e@C!c@XY%7_qL_|d7@2N*( zTNOfYda4_Di_VJd=hbI4>U7V?rv|xtx(0Jo>XrVD}6N`QirTs0Gj=mTg%Q`>O~H% z%x`>p4%Z916^Xl=6>25l_5&Zz#YJJf3TQ{93g%@&ORcQy7a`of*-4#@ork-J+sfvW zKd*wr69t)IS(S%lC^Ad9S+nq7?)G4v?{02R*B$Ofl&F2WPO{vE9pG1*&?Vi+A=`C( zU;EI<@sXb0ZT#e5(-e4uG>TdnZ(*KhBa-Z`|jO=O~Shoy) zG~hhvb^LtRHh9;5I=1N$l+3#|sdBWs{05cET*&d-f>AHwAo)OHB*7CwiG{`d9;=)9Fnn}lp7}~$w?WWvYJqUiJ*1h`JiTt4t-sz|H z40a7FLex_?g*W??`{JUK$YVr*`x{eS?>Mf_UmP`E8@#6zl-O~^+H!u%@^Jta630|L z@}=Z&NXG%n>wc}uku;qx^48It0iI91*M$dd@7T9|t&=8$%+$n6CXL{%DuDl&HcNL~2@HZam8c`tbz z+nKdSnuBKg(NxYA-GUqwa=v}dS@?}7`4q@c$eiwW16^RlP0|9@@K~eO1*copz6<^L zDQrphSW7OO&XYaarlYy%lZtVFu;~&GLXTFw`KDBws-N#|>1%XMr{4}nygWZr|5~bf z$%{Bt`{nNdTcLu)k+MRvZojHRzCrH=*wI5snK1L%RXfBV`U|2o)C8jOv0aGOdEW3B z9pFER)^=R+hFUKjArwBS3|I&4wI56XE19jWl3wtT{ zmP&8(j*C|bwaBAa5A)BXH1cgOb8O0Xi0(?Q_0wIKI%6#?7wn=>vH!d>b&-L4bS{tsiGvYc+Vb9g{2C9@(TT!f{;s>mvS^*x81} zZI9cZcioYZg@D&xy^6hy^SPhR8?q(TiOR&a(1+9qzQ${I#67~?@y%PRgISB+kAuwu z$|XfQdfgvS_pP5w2TawQn(~fBu9|k6)sEM&ApM$_)VENtwd4i$t~gq3@tXb0w#6W7 ze%=9J>mGwzO1p{3ropR|xrhDf5@!3CE&XO82=vFu89US|c|TXS9_)%1>P;(=X8a)1jgc<5D6l*t} z-Jhj*49Tf4j5TwO;fyP0@~w@vhbHKCMNpgNVA_^2LRr5cwx4?4hX^ITxVCq@m?hb9 z%(4(0IO%1&E1IeFEf0*H(MjXF(e$C6`3UHwZ%8+8b!`;2dy!wS?|$1>Q=1_4Crv+K zRXMh`@ul%T`Z{oe;Y%jz^|bMmz}8KYr;>)#))i_D@BQ)4YZK38DKu^;^nHbL+}o-C z)<_F%C9_@bQKxI3M1R(gxu(z;8yz7Iys@MSPf56*;$~cs5TcXxXB_X%qM&2yzw zDb_RN(4A?_KmTRN`*~twv>dPdSWo1T*}!5mi4UgYDTL&7Q#<&c3F8(?&WlJAQH4i^ z)XgUG#r_Tz)9-@6lN!g?rVgFdi`q@4ii9V887>d;gZ2xl%)f=kZ<<)xiepK=NgJ)! zIv)1#ooe!!$BE$SXTOWHf-EJkos-_FD`m11x=ojve8S&8kgh|3y`?hEWpv|xc;IaD zoAbyd`5c<;_Yv_qT@Yyk4-bt&=*ChIUGQ8fEG*Wf6gjp+3LD_*|0o(IG9hzb7?xTP zx)y~%OqGt)&aQhiVbg#9vt(d~{af3`6}4-hR^@3%vEw!*2%t+@1nqtdG;q$DK4p^K z79Due^6bT!DDBDI0DEYz3(?|pU3L~D2D4Kp>A=b-+;LS633t2BX^~F-utrN0nM%?pj!)Cx~7B7OGgoIvT`JX zOV@7m(g=i^zE5U9X{`*7|NL1InqdyhuOwddKD?&osZQ0+i}TatgUkGNVqJOg+AO?} zT`E13C?VCULfh|Pg_`{iy%B8Tsr%hv%UHf2PxUB+cctYU7^rd(m7SWHZL#WvgqMzd zrnexDTl|xy4)zp=V|)8QudHEWK^Q8lOCM&izfj($Z_4yDS3)ljR8QZ-K=?S@}7k_1VXwig zChgU~mK4=?B3)R5Dp*7T8}05l*jhBs`+cw7+e3dk*KF5>q`0LOLb`NfEmx{XtYzpZA3=^Eq3HJ}6 z!g{lMKKU-lXtUUA|F<@!P}r4iXGHZ$^_{!*@rNzW5chUA+yX{gkaU^JSC!yAtg<-cL#jtN>w(B}zvAyO%w4%6~SSn;B6vzhvGV z^Ce?gpAp4wL=nBWG7-@cqHGQqOCWZ{-F-jAiiyuck!mpUOB#+;_!EbczTfF48WW?) z_31C&ewf_hT*Xh8r?E&IOC|xW;bC|v0V_iB18E!Lsg5C4FMA~W2;VV0$LgTq_!-T8 zl2JJ4oYW#fQ9`9jx*;W&G9$EEYLDbUqyAl%MKvc!b`cTgcS6*c<`Oy^dUi%s3Yq*Z zlwW)OoZ6$-9yw9_q{xvxvaI1^lbzNoA+Ri2jWC>xr0v#E#B%)tT(O96(c{JFgUhzN z{PqO6#Nny10t~#;25X9lb=8Dq6Nd021ciG`vM`V5$GUbsFn>wC|G9>IY!FNAHl2n( zUgt|?^|cFIN6z|mg{EkpDQ8t=aN8rT)jF)fdLZJbIq1BT{)D%5{DEz$mG3nN6;Y0_ zfnNM5;%+Wy7oht}d*v)b5$>RavxCfdV1o9`rs{(bI|cuGT%yc!sWnGhMyHR*_tk;^ zC*P#sO{eC_Pu?`F1!x5j^?m#?fNpP{dC*Mia}HK;l2CNcE?b2vt$J&Jg7#pxz(M(U z*?hyAXJ*o0VQkTvG_UWW*{mM|{J*1}WpH{?@?ZtDM!tw`=IH=!gY^y>iO zW$~q?)#m8P7KWFa)jTJ4h6zK5T0*Lab(2#RogA`~p$&iG1Tc45QGb?K3>8}ijKooN zqJKHiZwQy}HM4n@5w-ZFgu5R1^kT{P z^6#;csWp%OXk=tMM#Eic?f-s8_Nwkv1(>noBi~Ry*ZKIbn_rS}!v8i8hH13XtIf#H zuNrx*_l*=+jL0er2ifqoGiX@3Ay9l3ku{I|b$N1|UKPEe3f`_u8i@UKzwkU#G;CFh zxZ2Q$>Nei}fp_S@-;In>A|V9BdZymyW&+QEQf1sD@(@9ZKwiBl3yU9Zf^zrwwjpVmoFB5LV}f4?xnRh@W~HM0@eBXTSIk5k=E}gm~1jx z%4;cI_uFPHqvHO!!2D2&pmHxd;%jY?RXDWAC9K3LBex!0 z+z<6kSsIs~fdy11496u62n*{+EO{-{f@Ix=R*d#L(6lW478p=TWfbU*v)b#yoP6u)8;DcL$y{SA0g1!HQ{R&9fa z_)6I49s6ZkODDyffZ*2YY=V!A_sdHv)Er4)xQ(G>s%XQ?XeBmO)4Ig_Ii&RmEe&Zv zi7-KIu-7*yg|J-a$SzaJ;{VG&1XJt_)Icbj?g54ua9g$)8ud zPE|8CRrVhl+|N?Nk*nSdSnfm) zy_@#ZB|h)?%q6<^C7Mb|^OKzN;4p=0`5y$TuYw^6+e2<;yoQ@9KlndG&Qqv(^JEM+ zE|_BEYt#gCos9eh^;7pA+hs1>Dwtu(Q=>N>>rbl278oXhg;_1`1@n1bM;~`_Q0LqU*68# zEbYoR@cGmxscLN%A%q2lMs^jYaMShf1-+6i0fWJNf8&{@C|X*i!D# z+En03)vx7h;DyEY@{Evb7)q(F)9oIA=CG@f9`{ z6Go;}o4dRw;}}eBF={U1#zc!gf zf6~>M(CN`FfER7s6ACyJ2zZLJO69A8qAB<)+%UNDKIZ=W=Ea8l@ry#$=+^!c>gN5Y zUSCg1%FHT8Eec*f&)8!N_syGg>xj#o<&4I7?NQvTdNbK27hJA~kzz%Z$w6lHJ_Pr2L&W6!p$l6|)< zna08K@2{%=3a24+{Y@-&foJHNJ>&8`cp5_TljxaPMpN84nx>)tkI0yx#CR%L5F*u;0w8~~U5aZecfGWNS zp)&z9adt48rrmku_U8DbD1?lZQQYB^aP`a~CVCs+^4am5Q=iUq&*ci@T4iLYb)U{h z?kTPM;riEBQj%s^2###{XABoZt$_oqLtjnx!jOkja3zNxry@Z@Za#3%FMN`eH5e_JpC(BE!#Lu1W8`r?mxOOCwp_8vF9rln zP460f^-?CL`pYN7mPL`!jBe2Xy#1vx-a0KNNEXgPJf4)CrlyPjqw`9qV1ObpDU|KS zW)nP$vE$O*wV?Zft7g|7CKaVnO!=`44-Ad&!dA2+MJjH2Qt`Ry86tjTbhUbbncUG^ zaTu39V|fKn#)qLRN9vZ#^~&3<=$C@psV5)nmR{52$|ySwyhvRQ`kf%|XNued#|0d8 zbY4unP~8vlmhaW1BP-IBr(ai|rwpP`m3Ei0uCv^e*d?g;Ae_=|av4RsDbq?56ETQ; zaNc#4mJ4?a5e;1T>>ncZU%G&oWC<@h665XLPCQXdfPKxY)Pu=Lmi5M1eI(w>`86`#xSDkX#x)^8^*R+s$ zc<95a&pYhAkCem5OWx(#;#|?{IQ+rLabzcSN_N3#<2fRM70j0x2A1kR0V%%H&)M^~ z;#mJ^-DC~qAN%t+R#dN^G|8vMe5xpj*Fh0)=|b$9PPZjsmCraMAjdO`;J{M-i6w4I znS`WyW!7P(nT9YtZymbki}STn*T66M-Eml+^C z7gLCjl6BMq75zicOCJ44xwAdek|Mqvh98HQ{-trX+;X}NZN7~W0S}iYs<(HP_){4} zCi+0~pr|D3*-@{R<=NjHh?{>i+0J{FN4mAqJq1(emebZ!eIvBP31|7cg3|?OZu&mM zQP9JwD(@v=;SB7sA-ZTzUZ5B+FMjWZv9{ouoI5Kr5Dg&-NL(3JLKAJ7WuTRhoo3GF z@0dJarlc&poUa*boa26d_Ap?>JWg1gRT-J+XCmC zS~=*@2r2Q#6N5ZU?lUXiDy=h{fQU8}gW>emAFG;wpHRJi4#CdC@qxD(&z_500AY(%J`K zZn;3pa(DADORLs{q}Ej8+oZ|oJbK?ha9LUjzI;BJCm$+5_dUK4+dWTdc}C2EEE)iI>ei^ zsAjcYzC0&pG^}dU#sxgY%D)y5b*O_W!n1iA|9Tq|CV9)LCGcV~2%!pBu9itGSQ8D{ zZ6*#7R;L!oldaJexefYu|QD;Rs z$MgK^8Rv6&Y1B-{Of?hNZ;(39Lfx~3y!UqwHK;!c5y?2F(|nQdR50sN*h=QE$R+2t z|KNNXf!+ME_(xiFdRbS+ohr7v1p%7wbx?5S9uciWWnbN{}tY|{q^$p zl%oR6B%Aou#=7;ik^7^o0auYz$rcLc=ig^1f1G|-PD$}r;#IRXbXcui9cyPkWp0dl zHF6QBBQZ|!ee+QDr!pKG|4cxQ^Jgm_>{Kd_HA*K{vNl=_bZOvEA$(VrHx8t6T`_A$ zgrjCp)AQ|c@Bc-Rw|Ga?kfk0iM#(X*v|qpBEnKl$Hu#PBsIcrlnaZ0QKp=^hI0SS)2ZQU~l`r&zDzA15M zN;REe9$_*6_~Qk+9&Cm};UFA-dUtb99pCpx={#XqW@TSwsNJ}eTU8==KgD7PPt7;?LX z6FtxiHilbfd?@MJFUe_oQ16U42=U!vEn_G-J;y(YPEgEOPMi1=)n#O4%GFQq>(bwG zn7?Z{peg^JLaeIz`PBBxw<695AO98lui_4r+e2QTrmnXSfod(y8RuS&sd_ni;$g9s zRTaOcxn#o{@Jv)CD7$4e!6ahEOPz1SGipZZd0j+KpVreaBcbs(=w{FAYKd_Z+l+2C zAnrtgg=c4q&LsKn{lH1eRgqE%AC|b!G7Aqui3_ni+<5U9~)IXEfF5g z#+5Ke!8h0{IhWzBDyRC)uqEX~)#$pTFy&E%7-c{Dz&Yl}s)A>nJY~AKO5F6dcF92PuwvKP9$nd>kZ@F%7yQJ!#%C4uxL^d zVXM?qb(F`Q9peM}c{4TEM%y`}^L`#N#h@^4u;Mtr2(@(J>!pii=N|25?8+_&VmWy= z}LeKDgInGuQRdeAAIk>Du%KwQL%aNV~uz4QW)*w;otpZNB@XAffSPq+xL zktpgfZ5tH;{Qg-CVH9bwoPFAsL(|YX{^zV1WfIElPhEQf-SpOBll7lG^_5M=aK{s3 zKcjVXzBW@NDhhr(!RFiDwQ^E=NlC82We=AKuVYrUv{aWz9$B^c?bS~q@3X=J3<+si zif=BfDs%zogOMV_I%@vT#~byk-)O$~UnKqILCuFxr?E5fT+(=LIK_5rR3Gv;;(KNC z=(5)rN~yH5%%AAg+!B~}9lGKXMVJk8ftVC24Yn&Hr|q+%Tk|6h$S5KfJ?1KlS%<@^ zegiccS^O`z(zV~Q zGQE+TY}(4TeT@@O$0u2M?scvSxf%b>9DS~GB+GC+Je2v3L)HEkL83KuTa@fePCr1 z=BBd?g*JKS*9&0|;zSt1d^U&M@I%*N>(Gw_OZdyq^U|uWJ5p^q%BHeCXxmz^d9w5m zcMYP^eP@to;>0M|g(yf=KQ>J(@tvwiG?eXyWrZ$_sS&Cn5lE6o^Va1t7lmx=p}im0 zjSITn$T$#JE45h?mRn7TO2EeE;=4AT`?B=R<#w-Z)Kyb?rG~B0$bea#vO2oRAY_U> z)pHfW^%gk3AMc8=JAbn3BZ~_}w~BC0p=%dR5DW>POQ@#0%AL z%Hyx)o#GSPS{d+IU)Mi4zA2I8t`wfnsX)(f3rN5ikPx9v4KqXxra237?^f|0TOpc| zF0;wFouGI}H!l}KKshBIK~UAJ!!XHGzJHovWUI2dn;Wu5zGfD+hY8n#;`?F4N%(Nw zE8rB1Vg8TA6QsAaS*w0uQ$2^5mh$a?dlOyk*iUYaH*wM1PhZiNg9sVBjH|oU2yQn3 zbLkM1RBi`*K!tF~N*s@#VF~w-6iZT(kaK7{RSt2vU|GfYFNp>%E5ZdN7qq>v`h$5~ zYz742yja>#iLhvsd{sXJP>b^S^EZ5A(fBmdgl`Dfe*iB#kVxz17eS3!aKkXY62DtFwOItfWJegrhw$~AQ`HqJCtwG9ZEU|ONlyc%LV>F8T2m@5~V2iaiTD3Sj zYP;`WW;6n$j^SsjI&@mBmA9AaUm=7st#STN_c8gVY#eA`z|gb3I!Ubaq&l_w^Yrqc zzVe8lX%gWQCKM$sb*K*WOeA4*udb5278)mVC;@c%S+@_KcvK1Qn!Thmd`dMA$^Bjl z-iL|eW2Pid>6v|r5pzENbI%X<8P6S0Tjom?w-PvDnoHOnRAhsBM}`f@n0UQ(3ZhWl z*WtcL@^>RMh&%ACKc=PHSiv*q?A9UxO^#SwPe>&wp>@C zvyU71re$jvr&H(29(hO@9wYS>7AvYDx+8k?n{bX7s$F_N+sarmBqTER>dB*O+wfPz zlV2`}2X_R9e zp3+V%-jsr}B`wc(E2#p#(VwN>+Os!vbP-49=7(atIN^$>(u=C{gFltRI?v`6ukyt> zLpz-sxl#+qpSv2p4vR%qr6pQPo%`#%6-K%T!vSNxlQ|B2}L$#=ecSr3su z%?bU!!Px}JLIagco2Q>>T++_9q6EGq7id-;hbQADVys_buIn#nM-m)~#)v9B9%$xO zUUsvjL;n^(ZMzQ2W4Uul(2Y9u0NTf`Ivz8&#IfNK$`E1au?nN`Zht{5T~^<@Ov8>=P%95A12Qj*mHkR!j1QXSRveFVzq{8efvu5) z@$!hQI7Pzqxb)xLvY@aM`67{*k@w!P9a;yGwGiBp8{ccp&j~?pR+&9+QW^GgZb~AN zcw*4`K-*@GWVksCa6J8k%1?90{EI=}(|M5-8z_Cx_LFKYHo6eB6n5ASj)t2UdEL){ zuggAc!I2*!u{M@A=hKLdXk2Xt8C#zqQiGqjaeaQjDi|q<-2756@8>`FJ7FHy7MW{! zeC|hDi<}dZ*`#OXiCdH)Ki*!^;cSue(KPCw!-e{U1kAupp zrCp2DSdJu)a>cA=72>^`b}sVpSq-f$B0Srk527DM#>%MWA3d0phV$g(@r#sOg=f*! z+K!H7?R&ak`}_O1%-Jg<#^_Sm!L5s26PwCQ!LNNoo>YGL3%>n}iD!VM(D~z!$qc$Z zMM_sv8aX;;%L^{cv<#Zk>&I0Xv`Ch<@oV2q!O=s?#oDxo2;t$aFj79A@Se772}3JG zTLGhxgiIuaMsI?V%zw48EeHtdq~qTG(#5RR{;?x0^J5+_%mOf^F{eMEfqnd&cvYzT?7 zqPA_J>=zg2udMW%lklSiWl} z9zC_-SaL7Y&Q`<{i9?`OpVY~X$2OT7M%pvbVE6ZYALWtG7UA1vN_qP-*tyDc0O4U1 zEInZ_DJWRqTIxU2nIARzTdO;@mXHlCDEYN}++7N=M=OvZTTG_MqXt#t` z=BFD!wu44`|F=K!WghzSU;XqitWm5}9k^WKO*auDG%jQS??@O^tV6P!yh!!B{(d1^sNAcRNVJF7Dr@XF zw%oYP?4M}moR*ERq~Alr{KwWF{P#2;kMar1$ydQ!n%hg5?B7f*O9n*Rvt$LOm4Sz= zA^0oFjW-KD8aaT{*voAx zyxe}vzLYT&jWI_qs2zjWz}p_uK?+4|K3*^8d}9 zee+QolH~@HvBtP>QE|S|KmU8aMO*s&_x*7(^F$)C7YmSbLyI@O6wZ_H>5OydpK4Dttk1T1;D3r-9bSldzo>T3&5Y{8s zCen4iHF?w?;#9Qk?(x-suyd6&()^(;F+BUqJ{A>K40+KQ-Stgff z$r?k#!AXqBn%GQtP^*h{7al}k=2k927=F1MoY?C ziDk34(?tAs0`Ilo-1>nY?o7k&37&FpbsLve@1Dc6Ytn6vNM4)Xd?pc){2*eq@DQ=` zK$e_n>ncyzB1g0>buG6Iu8mpNYnEoN&5cqz>nP5LS)l5HPS3*+esr+y-w*X1-0yC^ z*V5tstj;ORPdM)u9ML?rIHy|`)R9-nCK4@7aifEshk3Qqq{IayDqafdLDHZkh^CB= z6u&}-5K`lf2tkk#ChWKLiYQ*0$mlbQ!>b@M6Rjp{$*fkga-w-#q(&Fa!w?kTG$F^s zs(IX{hOWdJtxVQf!dT4UK0p;=i__22fIGPC83o zQ+%y!UN5U$eQX_6jGiSwZM&Id_2JFabFFpFVa|I5v{;ceX+&6vCIIZW7RPJdaS|YX zTf1$frtNMP63PR;1|3vL9kw_dBno?D^s4yTmDZVGo>vONf z8*Z8*7_sq`WoPkj?)SeJFuBbYoY9=9S(8N4^7@?$)=GmV#PtpdNLvY`ioLahA(h`l zx>z5Zm*wKjPg?PdkQ?alejA^MlvqXa+*zIc*FW_&NDfe<$2zQZdS&|K8HGb`JPi+7 zF}*cxT=qR-RcjM#8%kL;pkb+-l%~hpBT7J6;deo3G@MxJ;*e{_yhcg%&V2{MoKHZf z$f4RPX+ZSZQf@7~(y_}J) zWL}Gk!);G%Iq`WWRPX$5jpdPW8VP?Ocs^BRO5<^cDVLJ_r0xbeu)AAYIONR};#FQP z(y;&4jYJ}m*d^SSAZ2o5v)V}FzW+Cx@CFaY@|W~V5JHd?Ge(ll5SbGYG<{A+&^)IP z(}{ngCo5r594%Y~hapY0w$nmzj0!+Y2u#S5MEgLJ^#+f}1$OF(tVRyeAQA#R3b=Ol zIJchQmKnv5pSOYHv@G);Fpx4wDDN)GiYQtus1kV{A(o?)rk4OYDEM^Z30I!!kC99j zStOwBEB|p4;;7z&Lo!k2W}sd?Uu7l|i9|D~*XJ?rWi%Q4J5uLX^MY5)^gUeRyqn{a0`o@Ta(9+@rg}01aT26fJ?@!}@Id5Az z3cSiWA~2+bTctBJP+k#oU{6HCp32e|TP@sjy-QMXJ238$cwhcw!kI)KCD)oDJ>&RX zY}l}1-Ti&JYNA}w5RS=il5xRAHoN_NM0Qq6*w4A)r<{B;xKr0m?8EKW}uv6O+ zgqDaEweaDHM~(*O^P-0An6R4b94)Iuzc{&FU~>ZVVV!!Lo=^axbCqH-0$-8Ev8+TB zGY}yqv^4nklD<(HJVZ<4?2xvw(BJ2^Za6Z~JfN}H9%}}PDUX)RTUK(c zuuE5qA&ZR?X4qC!RyI&LN_wDT@VJaT;mLB@gAye?@DkP>Nsi1!3%O+OM;I8n)#adb ztfD6pEg%ihq2+ZYO{t%2V-OD;9cQHY9@6!M*lNB+izdSXJVeI0driV(4;BVl@+4%q zStjikl|B$^<}mBjO* zMhIYxLN8c$lpxUhgg$qeuo$usu1pxB60!uzL((>w-C>u7+6Y+}iNvyym|=++u(r@g z4^z;}6oE3Q%tj9mJw7QQkHxGhP#pSWxKWP8x!!K~(&1Zopmm0HhDy!}@pdkSiS+#` zUM6wqKPfMXI7us;L?V$$><(;Fo6KRJNvjA)lq_NC4qLp-N+5|hxS>PFgn3t5P)sBe ziKhY`Ahp$7Yh@RuLC5Mf2iY9ZXG5}}D03&BipP;2f8PknQQE+;WwwL^?PxU5C+xmR zLF;tbD{O>EX-eOqzi&~A^fB+)5l#2NcmePEmTf+fNF;WEiK#|qI!fH(rWv&2K+pD| zer(mLkS26hY4i@vuC|0nSMCn}E6HEwy`{1o9nZ2lnn)Z9)_5-Y#+Y-<5-ldUsCv83iA z?LDS`b1(>$#4^RZ{f3sG5;fW6pNJ4*4fM-@Y^f3@PJ<_0Mco>Fj*-r=&`1tVcc$(m zs|k8T8c!VEI>K&t<9Q?i=m)U2Z`E2fSRY>sFBHR>&3KE-A|NI|&C;rkdwk-fkPw`R z;Q3vjtulDZxCMbzgQJu)kOsq~`3a$}{HPJZv*0$mhLA2GksTa{Y^}Lui=d@3HjI z4#RA1E#gh9G(RD0$a`Wm{kfm^_X!qa|NN+15Njs8p8fT(SAmMx#5pNTZ9&6hJR;-^ zu8EZdWUUmfdywa&@i(_vJ!-RyC?Bnio`$n;Azia@@F@E{Ow{^=lP8*gl&px90hJ?> z*c>7+fmnC1Fh{jbDXy1@Kx3?B&WOr@#_j!%oBM#*tP}a&>ll(Eo$$FRxnTiGAl;Ox zE9oL*B=`!v-3Wz2B1vbRXR?5(Qryd7bt~A$CXS1|5_YMxZcZxP%~@|S(vDi-BOVshBUhI7(EeFC{fSc5)54>E8whCv@pT_rFdROAgJt=-01lB6_P+9OeR%81ZI8}AWGZQym(P*cpmpkY@llf3z7gy zB%Tv!x|G}yv9MGbio?XsB8ZE1MekRx>3l$C0CkE+Y=$sTOEGk=) z9#4Yb_s3FEzfL_<=4NXZXKx%$BBNR%qUUK?1Wv59l=RNh$(Uf{{;Vu4B}FFb z&V}?1rTo}ItDa;>0<)$u2&;zH+62!_x-sSjks6UUzcH@mO#&v7Xgj4KFzosJ-)Kp~%uUN8D* zA#Ajjh8IkOcc}^~#*t?!%}80#fHkEOiR|anyV2%GWCisu{xq%PU}+7U1fe8}#wfD# z_Uy+m{Jk;pF(HlaX`rV1d;i#&SZHDGQA<|LB{`n4YbBl>%;G_tqv`Vy{!W^D2;Cw5 zyF(}3EHaEmOfcYtMLC-ZjaTYbsFB6mL>yY(JEC^Mz0Fo_00Tqzn?JuB4{ zl0sQ{x5^_;%#(DaP9hdka98r2q$`Ev6W843kAx1dWnyF=Q&zGjc{<6wkryR5goO&O zJPcWPx-9fEgM1jQM6QE9bql07O1DfLmpX*T3P<^_s3^;?eN#IGekWEfd$pKpQLeqd zTNDvpXt+9C2oHxK))_`aiZvgR13NDUX-mlzn7&j{?IjL`$zh_kb9_V~D)5*>00KR- zSml!QF4JtK;%MPkg;w8^{B|WcECLQym{jS~v)6CQK2t17(7Vv*-B^yaL<;Fgy9$^> z+m@pd7w8aI?M57rMMzqVYz$35m)tZqo-cZ%6(%l>NfsjXcW4y~7`7p@Ma(ENaqtYw zZ!I4luQirTd(Y@sOivQxIig{#&PU@EZ%Xz7X%i{*+|8r(7t-R55g(cYI*=mw@N1qK zLaU9FEu~D*pAbAREDZhb)K3FS`(;5zeh#t4-D}FB#gW?Lkl+2=NOc=2%Qf9E|FOD* zN9pZQEr(G=KuGf&J&(epk4@t9cxciFmS>|d(!@;48I0@(x#(cc$M8CN-#+ZJpTQv(?60KC-^OeY2`N;=)-eCeODiT4t7bwB`V;(^~H10 zDox8vm}uvM?ETD^Q=+EM=Zv|v6C|4NFF+oU7LHIl?gDy%CbE)|Rj8UgwAF#y^b;|7 zR#T#l+lte(>{wX3l6qAZUkb5sWt)lOI3hMA0h%lK44mkAct>)h62#PET17BdoPr>79WMt>ZK({B#x1nR2C_Ym=+kr5Q!Fj z_czQ36{?0kN%-eqrUOsrZb`|W zqj!O@eDNs|HJp7Ikxt|!-$w9|Mbr(OrLbF6q{)FWmnAK=@<_lv^|w*E*@?a>UnX{l z7UzUW0i9O1?mB# zPQzq}S|9y_@jJ&pb^-iA(#Z-rYg@&i=3590>UVo4{*cVD-lgPuFULT}2tumqSM@-NqW*D!V=jbg3KF}iH{VrT+c1VpT2xT6W z$!^fIw#(ZjuRkZztmdaZbGP1m$fzXb5x-Fo?TbiXt#ejLOV9yEDe9Bs|Mq9TEcW;R z=BK{4NtqJ!;UzI@(@HD_iB;CLde16FWieVnnj@_|kz9zvOU4qGEHtT7UeJCj3=d(^ z++|JDTHzw!wG}k&GqFx*5hUZuO)LfzIU)o|+q^2oBR>{)vPYc}98|Hp;`dz-MlDSF zHSN3m@BO3WxI?~ZBBFlm>p9l^^wvLK-OgQ^pRMJBt7dSD+;?a76 z=_=M4H+NPiG(JB^Wq4oo4)^q5JZ|@V%QtvKD;~=CqtNP&ewP<^?esX3coM8!EuX5^1AK)^*!8vt> zz%Ja^J-oPuK5^J>Fh>G9Pei+oW>I|Y?=}!JA_TBByLwmwPyP)Md4)(ki9nI~9>QBp z@)%b8gxBvJf~r_$YGMF=aFIYOh}M>PrJ(foCB&Q`{mgKM#Gnd%P2TK=h6`6>6?sm} zm-_wlp8@$ga3xx3yObPnvf$;-mO0b0VJxHSvlrYG}pO$P7?~wx30MiB8GTBU487^~GLp&1+&;DEQC+ z9qj)5|KyBBx3BQ|SV71Pwoy)QB#wo%ksA`JK@VCjSa-Y4+=}jHrITcSuOec$^Jw*VR9NM+VY zZT?IwX(orw2EWUj!*Zvje<5MZHOn`ro{(1-I%0uzx4z&QIkB-*7#?g>bn(Nm91mB#sT~rWnm_HCQ^EM?ag(aYlH} z>wiO7&%|k2Bv?x(mNIJfuiNZjC!HxlQdDDE8^8yVqEj7KH$}xpQLF7(NcBJk;7g@ zk*C5WApkw^M1j>7s=V@x#2;D0+ys4W*c3fc!BIiDoAuqThUa1UY6*-6imuDNUOM12 zn64B*5;lrRo;B%ghQStOXuj>Lbkc5gViL_gi+ihvV(WBDgNGO7;3I) zB}WVAB{!rrX$8?VHMYnzS5>l05>eqLH0n5JTi3U^ASrB36~TZ7(y~q@O^*QXDNjTQ z&oMhuiwJ?cG`h>*_%FXQas6|D`5$glnnX)zgg$C-lA`UMD7e2C*GR{jvZdllMUmVV zR;ug1MS$d48hz#Zkte(scLBVLIr8hOZuZ>F%#NPieDf>rpatFt27|?-cWc*v1gY`A z2(?e&Ephp8e)<ob-&C;hKckM$4mFCiVyKcM}xkUnn=F z0Q}gWko|Z(OX=0PHLt?#Y1&%8+Pv*5Ks1~ep4pW%J5nE(()W~sr&o~-0-ri9VXlku z3aYSTRg;Hr82rnXi;gltPtMGtxq}u;>KJ^9iif9ZSd3!A#){So2?hBL)`LeIpEG`V zWNNG5NdvhuPOEtncT0RmMT^Y(?N{Yp7lFSMgSbi$?%N#LY<}Ftl`dxJcV*UEv;f z%1U?X`D0E8O~v{MkPZ)h4lL1sv_7Lve28#WvY^R{`GWy{@TNqsgBM03uab>A2YAKj z&4v)KP$MxmJ0LxJ@;f5t&X&m#5Gf=zfO_%+Z&8sB6&l^CjWVbNN|*0hthKV}IcZWX zNmzPshS1eQ2w$Y3B&LY9$Cuf8@IkCbvqUS0#a#-kF~*+Rq-M}&x%57=gOVd9%sz<` zFMHsLuPw9li4eh3ptUf;!A7z`xmurm`A_I^P_wtVq8e^s)9;U#l&ncX>cbw*e&+Wz zo9)7t>?L3%j)7O}WVjMu5E31F6kUR!B)+c|JhcwyjqUZBw@PPslSAV4kVpm(JmY{y zs`m2~W3`wp9Y{`)FnvY!)C_-fIe=zEt)=~Yi3=pdF9c1T;Cxl5#OJ@Yyut-U?VL{N z-gG>L=~q5vloKWJ4(~`>{pIp=e|zjstwetOPx;DYl|!mej{uKkC95G>#0inBzFw~2 z%DMkZpiPomKSB*r(jwlUKmXa^87c;y52fG8+Cxi+#*r*WB&ac4t%IXV`4NQ(s_eKU(xLL`Ru3jJjvc>9H< zRD09+;W)RbNcV?(uduSnj~aLyjV7q0Fq&R-2@okeSxicJvDSx@1{5TCqj=ZDSS0~h zCLM~!26unB(e!Z|=loXM%%n*s1zx4wiZioC_tICja40O#TSy`>)WT$?1@T&a(L0{E;xrcr8uvIuuwpTy>m<^!%;RnH zEqX(K&6!ho*4p4!llS-)x1`m%;L7?fj z#0mmfB5^>xh=;9Ce~;t6AJj^3pm`@fdSNtp%+yoEEPF!xaJL|#SNTpYK{iJ1FcXfa zksFcO(lbfXw5@a-jj?@&o8*rSA3XJ~DysyuUYRJe)#=o>eOe)wH4zVo$Qda;Z~1FG zPHkKxxd`W^8C9V05~O@b?UoS{JlyEJ&~Kx?0DB&l8)YJCU6xQRl|d7r?|#q%BoR3< z^w-K(=iR|Mh7DV^yzNYzCwUmwp0%N6qz8h27)1?P5#h!+)tzX3Ye3|rD-C1KQIYaA zf+lmIB1%KuD(EZcW&V31HZ4*&yl8AVc=ZdreZZ^&5gz>aH4Ig6_`S4JUJ^M%<3w0L z6t0!96r`IHiGzZZA7e|8DfL;bL>_S;&ySv6h>UT6nGzz1pp6PNGocNcKTlQ!Bq2%D z8*9o?gsnO0xiXq$%-p=s4U6LmXU*BxLIvUi5P`zevR>C(*;#DbuoPe|oTsnxa8Zqa z#rd<9%p6U}6Mk@??D3n1Q~i{@26BXqA@I{73lHu`GH}(U7N~&&nK%F(3KDNygJTp9 zU5Ap2+}**CxU!`25HG2rRTwd1tsuhV%@Jtke&>p;O+rg>^A@$)Ye)izCU^Aa-mP`aC~a3;2e4eb1l#^k8u_N@2@>@M?(|h zVG*ezWOIA|{le9+CcK12O}f^yvh-~=Vk=@k;VG99)Z=IILz2>pR?>Nsqw%z|Nw3sY z-$!hWR3ObyTE6iLdUG^oi)3p=lAyid622zfpkgUSk+q)de;s>AE$&i7ZHg|>g_d0w zrH8__#+)he;vG&}lCxA#uoe@vmy>jj8aAM&5Lsdj_BFCG&AeamkWp0U8d=A!G`xbB)!;Up2%{NWjnWeIX&8?HnG!6sFaSN5>xH1Ciu&8^Y=TVhrfS`}zn6=|7k z8c+xNA!n34<`Fegb`a5T?TIt^8{^MX|Xd2#p(CVir zjTQQ+S`Ll$@vJmeLb5(pmvj}?}p6H$69VDbNR zfcP3uKFwcQ(r?*NrI-8JfD@Y6c52d*Ub1HS&b!J(!)p0(d2jb0DRF4j z4pI?6PxuINuFVGpk(F`DZ2?Hrm6zzKnI~o`Zo5Per9HN0ev zhqP(QW-V&LVNIZ(RwuPu&4dDl;py}E-mqGJJZ_ZGIWF^|ksHPT3Z%bqD-aZxrfY>w zBoZyKqHr@Ai4{Vq-qAM{5{^BwjtPu$Bj+RpB_F6CB0*5P8d*~MS^0Z)`{;AaUG;jFD{IfW zCF1~Ss_1N{T`z>-gxEV28HooN4ab~W6^cXs(NHca+lwi;b2RbJSUqt`LM;9c2@muf zU8k_B*;;6g2n<1h=(%+H-D-rgVGJuw%th9vA1?K@z zI029hQ^HAZ8p*<6zlEONq^;DFXMH1iF0!gDRdz(UW{T`^E{C@aQop#TE1g4X%QfSNlNO;uEtJtnkec#^w?veWF0fClAxjzT*IFf*CrE~X@Ix@`HGioOi zjbO<(T#=^kSExh<(vmt5N17R>KDXz-5YaL!@r`cnK_a+bSAw#y7@ z&lQZL1W81>kbn(9fZmmh}{vs!{~X%7gU8yAz!Mnw3aiis?yxKA9ee& zKOrlLS~Y8*#`-LhL2vXM2%<1=n#O(g%ncI$y7D$kmbgm;*N{~?NmFQJqrs)WuktZBPSliFPt5F` zmPDv&4H9!^3Cq^3<0X5d6>>!~E&oA|*Y{qXqZhXaT`09v6V6qN6zc z)h?}ux!P}}N#t6ArE%Re#z)(>RAJo$RYKk&@_jWwYdY1wFPd(>`oE?KP=8B#(A-;1 z&7<&1Zk!rku}|vup0PTjyQ1G7y}p_5U(1MlIxY&Ujm;>05Z+hNh$T$@ONHQ~(iCH}5kWpu4hX{)r1(^Tj8XkBUofu2~C}~3o4@$ytBBi*E z2BBm)+F?eUsB+h42oF(GOXF+Oq?YERt$7YH{rFoCiwEu6-$HWmn{X1B{gGU6!te5Y zB`?Y#U!Dh3JuP7}Cca4Rf9`v3O9;*f()N%W{cUKDLv*IpYV-djouCpQSxiCU=kf(G zkvVZJiIdllhwY(Z)@-vg^72+GYPz1dT=~+fwT2s#xGCvVX)<%PJXhpd8!p_Ylr_7= zoM}U96Vgz@^WtsK(#<4yG?iL?u9==2?U;Rq=8j%UdI2;5IiYa_oSg8q8$>A4=gBLO zM9uM2Yb;2gP!n4by<;#fa^+=Q@q^_sYY)X5nZ~D!b)$R;hA@=eh{(r%%`GZ5Xvs=N z6x-fG#!yQY6sA~@P;!HlE8bBnA>sW76|Mei{gxz3v~TVqGPHqCibLahmfrkV0w>84 zMP+5FWWx*~(gRKqJz%~2={6cZ`HU<`Bm%^%Z5#nLbB#3*2-5FF{*i=3Md;G<)wmcG zMw5$Kam?XJDy|tY0*l133PE223F|bT@@-sYjEv=T0N!&+G0fZSYY3G&)nzG08t68i z684G75KeB~3<4E=>7!3i;<*kbjkXslKI*#KxF)qX%dG$n4}C@as(y;bEN!6zjgyGE zjOMMy?Hvh(auw`3l<6qxqRn1hc=k**(g50BKKk6J6~X+t6~E4w8mXRY74?zb z+`b@@B4${6s1pxE&Hx$RD#PNRh6rh)$wgMoP#PVGF9@>(fkL;~D8rP8t3`e^ZtLmM zY$}oYx<%N?3rbAU+&*AwZ(j3Ylbb!LUBf6s+!6c0x2!5M>5yOYHKVPG`?Rb*F{II3#I%SmLRxj)-}p#!exCy z@%4}AT?uPhd<;N`-u}Yhb%aA!ZhJ$mwvLF<$ea+h&ZwwF4_C|ku4XVNai{L0OH8{| z7Z!oB7f58bXF}}Rnj3gm@th0coVS*QL{oC(O(Qs3kP{IF;2`*ee@6EE*`I2k=81r| zMId)i{33^Y2@)wxggj}dJhy}=T}%701Y*w&vuq!i4p2qz^gBtn%lN;$M~LX1qcivC zCx_B-lAn?GkN>GlGyL4&Zj;XN3Wx}yV3N+HTJHYkIxx3=D-VCNIcc#mNFqfvp<6iA zJ6aq`$9Bo}gq+bnxx`_1d;Tu9ipiXLLc>yKIvU7F3T6AO{eFA6$&K9r4IZBMBPrF? z&59=tOenk;jXwaN8jPtxG#D{0@dQi5!JlWYg*y_g%Hi#kfLqSK2@6U{Tve@jk64c* zf`d;S*Aoam3J;4r!u=eJNjj+WN zkbPO4)J~=nL$3GxkH7UBZsF7O&3HJ?&EvP>$)SRu25r@1LwF{~ku^uJOu|gzMki>~ z_Gj%cy&O;9yNqYL^-px z8;_hPwJnRJl)^{fN0LvqG(2)_t45}!bJ&L5=slKve{K9igAR}DAq5v84JAUtGgV2& z=CA8r2OHdh&|CD*!MsCzA(Z(}pk%;+%|bV-h$c{L6Tg-&?$_O*KuKYQRLKo8&44%^k1Q@0d+v;cGLQ+_zLHt@%hAPc_nvmKCLCjVb8as`FM*(yFOy&$t*FJH4;U$4}`qs_cnGj!Ome zR!qz9RSWBO5*8Mog8{5ECSkU~oUPK)g}pbY1xNIoi;bU=4u}jf8#^aJ%55ef9};9j zqD+D*M8_=->p-_hR;G)$Z)qJ4lp}E(Xxk<LJfN_Ex45Dwm{mdgckK z9Fcd>@<4sxQoxa)HjZ;;kmjqUqfIn5b=Jz?``vgtn$l~$}Y$hMIIOyTUgx7UPz2Lhg>IFRY=6e%u`H_ zIdj=tRBGDUq+M4ef+qYS-CmhLLTzd!g*)*2uQjvVLHsBX&^z{s%JwPjp$d>&{K+qbYdxe zuWo1YXi_z<-GsU|+X{8plrK+y=mT1LN0i{G(r>xx4dUw`e@DneddJ8_q>;kjP9q#V zx(h6*TuU4P@{_{2L?+foCgCIkSp&-08sxSD8VmTlDr}L93-d2h}i{yOxi&y5qzLE&iUym4pdxD~)H%1tm#n z9PMCEZh>+Pk|ZKPE)9q99F@rrb+_zGV87*t)*l+QL%HAqUiXh=nvohGo?3a__Tb)6 zGoM(Gu+<=*E;N5VBO)uPUPX;bO+zq2G43VJLb;iy*GN)cJ}rzLZQ?E|G!dBt5iXjg z3M$VoP&>G;IVig|RUwWPw?>eTq9%>LEjLvQL5WhsmhecYmliO*T%44j6mc{zp)oBw z9!g=nmN;u7Fqln5ltNmR`Ij7=K7_r$FPiIJhpa1pvq+7%pgd)rK3Yp&yy<;{x=TY7 z>PH&s*SESw{Eoz@aTDhR+A?FEL4wE)6o-=^$F?4c z!je?zC|xQ;TShgqSQ?sQ6#ABE`N1=bOREE%FhQ#fE0QEjnvrs=lfj&o@4+=11}9x6 zgvc34kfl0@CTV%&qkb-FDw33EX*Uv!V2~>j;#C^1em}V0^XLDrt_z{GwPDawWG&%W zgyUQ8N?)rb3HGRX1|WUYnjuRfN2IQb;`1<`b|-d!-bZNwNfuwGP$e>i+jUBWhqW(s=hh<< zX6*{1WCs<*DB&RpgOf8zG?W9>_Bo%{A*v8W!dT%fIm(;1q~I9Z8NC_Dqc4v{L`gAH zEK;K4X(^+|5f!&i*y^BhOi_5Nb``W&D8Ka4XP~>h&7~4UJ7OP4(&v#ICm>vHi{)oo zSfF$*(qfXZw4$JDby}t@9W6{0J0Q%4+eOF+hTBF3695zz&4-hGt#Vx!hDTO;sVnfU zYAVPL^vv7ctR{mxFly89;R0J!yeys6iK3%|Ctrzn)yNaAy#3u8MH(4f5+8MG{qi?{ zV>Qx*T6G{dM1XkGO`IFw_;zFACgFr<4DI6nXo$9y5hQp@1j!(4cuXNZK!gY)Pqa<0 zoGjt#9*793#pp0p_5la8TVe?!9>z+ZxghFpD4T1CGZB&MBn`~V03c;3B3~gA1*FG` z1Tk%Dt)^*#KyDiqrDx1INq<71@OXekL1H5+UMs_gGc@BZFsge&w&!i+_LEh%))gQL z!Sh4;SYwsd@2vS)gVdP4aSje@eK;cRnRO$Y!iOy-{l*7(B52!qJ!f9n*QY{gs(Rq=`;yuXNG06}D(}3$S*hGp1-h#ovlAJqOZQ4bmb?&EcNh55(8h zQm~F;lYtgASySp8*8F1$l@GVqDrP3i;Gp+HVI*!qj8ECxtGiYpc8iHwNX;Epu$vy9 z;f}&71HmMm#Tr{o*#d)EB9T}S+GH?S!MRijjYcq@oi-OptFOo}jM{^>ylw~8-Y3GN zF;^io-(kzjUBKtE8ay?=S4@pBc0*9F=1t5)zmUHsXL-`H$XXsw62@D!nR_0mBR)_) zZPCXxS(uajn$kt%NzYbzk6*MQtl4n9gc2pJS=h;VOX?nOS!8EsOwO1(8nlIt$oXRc zqv{3(hQ{%^n`R9ms3km`DXGHPf}@JCFe1&>_r0Vk4=b@yt>>-UF`}RIu`LG6lOdY? zz08s(TuRT0MB*Ia{a<6|i*PB$t;kk-=6;e~tHBz=nhtB$YK>PwDq+3x7eYiBMZ}29 znuMKLKUjkhGG%lIt<-3E!$717d7i8)&S=Mb!0-Q)*!}1KPB5XqGG0qW6in&4h6s+9 z>vZe}!_s}CB~j){?@6H=9kO|yj=v*+L{!kRnpgvtJU2t_O(T}|1b?oWk1e&z%k!(a z2OL?jY4ah4W$v*pUZx#BqA+{HdfALf-ZQdAVOnHe(y-dZF4}I}X9a1; z;MHQCK|29iNgTov(&XlM_m{Tf+(-|_f(6}vV_Cc00DeG$zhE_3lupix`@=KW^P2D8 zSZ{a=DD^ctOR0n>^*oH1K-&%(BNXd8sVtWTfaX-~x8)Yu`pUw4RA6lD|C8^ zHL>FD53e@W<0$w){hNU_v`Ulqs8F{Ke8A$);`I(HYzabFV%b{fvwLX05}AQ|2@Q!w zl9p@v2cd4%4~0u4jtWP6US;Q5t@a<;%gFnE<%_|hvUJe2<=ypH+(Oo$mOzG{5j;Yi zb+DOq&WPr}0=&X7KW`S9LQgm(Vpc8g5AX1qB?V{|lb8FJJ_$3dj8+_uXf2I^-NqUFj?C2raDmrK{_{?`g0x`ud7?5yP|M_Bj1jlhSp6k#Or&J>2l zyf^`qTQ{a?#rmL*=%O|Sca4lglL}I-P`dfe69RtrrxZ_1Au;@Khwbt3tU2!1^4>#? zcY%J7NLA`b<4F}H6fTDHIb@=RZc(wY z2J0gUyZzz<4|iAEl$w`DlyH9!_90aA>tNA! z!pNVyC+4*AN-}zAdX$hQY2Ef?g0wk9P>0If+3Ws9eAgCtD?6ZKsltET5P(L`$b0OvRAJiGMaP1j)e2XdXN;HT1`ZA z_bl^D@K`^E?BABJ3C~+W;qCv;k6LfFtJ1z7Fvr z;D-nhN{nb}a?&Jh6=F?Nj>Y-}nj^}@#iWE@m_tU_`M!m0uoAlAKgdx$ibIJD z7{F0+a|IC_k25$1Q)Mu?qegNI*9rdjmmUeJT;K)hQCgsuN689oQz>89XrQiH(ees@ zi9|K#Xe9ja#h4W|f<)>dh*9X=~3%4=Dil+3(_J41Y`@OoCi=_g^9 zCO0=We^JYlTiSPJ_2>UKvpQi)G%eE&L}{hUGCzP+8nY1JX~~ur?`fqY4KLm`5zTL6 z0inH&b5QUQ2jv^`cJ~r&yL^kt5RRoA-Qq^`64Tw1h!9yr#j--Xw%oyHjy^vjHlQvF z6mc%kSwu(3T}xCUU)O{s2lYTdraJdk?iv{}c!-*n-_e0rm#MN?ZiBQC(^S%fd%syF zPP};w=V2qWJIa=g+UUJT4Z>((d(uY|Cr0gn(>tFvqQtTa;m{_AcxTb9KiowMPKKs6 z3DC*kCt*U;!Yv@tLLYH(DRT*XC;ANeIPR}l51Na%)+ybUg8j764Pf(9lX&tua2aSIG|j>PSmRRAIrTvsiZ z@XGhABJ6~6kHQ4gY#rZB+;a%0MCwYvrMx_D#N9h3Aw>Fw>Zy_Wo7hcmLbM6HjRW*yxbaHI%a2G?m#$Oy>UahY5&IW^9FPm>2icNV=k1bmQON zxZbddX96cFJmEcl`)zD=tIdSuFa^=;gu?yrZd~w1LMt7gOhr3rnzDOva+wlF!++!% zS$*`z%7(L!7CU6MB`j@5(uAaj$jHd()D|QX)o^SvKCVSX{460J9d^gVagqbMX$SC0 z{yZG7qzIX^uyskxJZluhsulMJ;iB!nwCl?Cx=GqKX`n^C$a{FKZFs~bl>RwsZn~ud zK^iBlKICB(C34pyeL*-)^zf=-QaBf+iGj{v`_aonD3-6o{42;Sqxv-7b)?50vtD*c zaO?!34_bs{>c(uO4$wY0S)q{~C2W!#2^mW?dNlJ{cDp?OGL2T+LgOMk<}3)n^vKfM zq{<4JqS5^*t-V6B>Qln2;Ur5!7Jg!NgDgh`!bG(s*|NH88e!k|1?CJJTY@+97_e6^Z0_F}Alz`JwM6-DX3>cN?Bra?*2B=3)yuaxN)y7@}Zn%q0@h);eS* zhT=u@@whW`gZ`!PS`sypQKW^p4dok;Jir|W`GiK~)<_O#DsfAyI6iGlN%&DNSwimDDk6e zaV?ea95a`OII&TlxfMs}*gj)&OpGYmiELIUNLuUzA?HT!(R_mfvo@qyuObywBUZfO zNA4Ab%g_BS<}lnlX(%`MOn>}O;=bwu7{n-r^6wmnld2G%q^B#JS&H&9Em02B{Y)wNbDCa#wQMqX4gm(KDn+imbuB0 z`+s~$?~%0wQ`RqtB=Ks7X9D=9le0sLAanl@-ZsM(b7At=EDs8a!l(63s$3H!QM)Jw z?Pf~a6)zm&QzbY0{NsOm8vdU#qCxtO!s46>_iIO#ex3nJM@l=ojYc}B#CuR-E3^Jc zdY)|nt(9&hvmbp-t*Iyet*k8?Zvmpg6VDZO6bY0EpZO(bt0i%AmI)-0NMLxEAgq~QTP4uavk<0f+CR8C3F57T8bQ}1P!~Uol#5hSr6B5UBBeN9 zxt@wlmIBqcd@oJ8^D46uWiD!|fquVSF8$lRjy&l_wjkAzNvPdPN@FdykZ%!@h5RGd z59r()%`(XPb`rTzbGRnKTH`EgG8X?!=WI@-PXfUK#b8HxA!s|J6hPwH6C$7uHp-K4~5vM7Zk~<>Rt$F8; zpZhzCg$@(GfBa7w{hg$JOSh!q`3})(E1%=U`4njgZ2jyu4fjjVm=D zk2>QTpZMZ5nty40N!E${UKm_HfCr6({xl+l$lt>sOxWK)-<_No+FvIxNFh07Abz&O z^$df&LAVrTCDh2`lf@-PS)~3WOORs8 zzy(@s_4CXy1i71cAv$RNA}bvtL?LS$I+dMzYVtO4O(WBk&j>NX!u_+K2I&|dB0_Go zmeo9M#0o2kP99Ep5AuDpLPg>k=R-ukk5mLsoN3=f`fhya_H>^~dG6M2+;{=S_vjX= zdzy2689N@9yEh3>GvoB%gs~J0%K)(ZK#5(A$ig< za=23-1RZofP}#%Y)7_dd1mSHT=wLLXy^U_5>4i2=Eky41W-UgY&Umq=-+DE$2y2Mk zX&N4-X@QSpDyNRHUh?8_ZD&EOQ5V+tn?okJ^GC|zO!U?mDls>s2?&JY?vh!^L1g~n zb=laj={U#|VU!;8KS))KAaNA+AtKl2Bmj z6&xOG^^w0uepr*7woI>O?g_V&8LjrsCf}f!tAh$KqgMp^^3%)3jE~Zxq$~68ev{w5 zGcHwXX+Puffnrj~ltD-@B+EUGmQ}kscjalsp0JTHJRD+gQ74gz5H!{_Pypy5yhp@v zWife=KM*-bguv>fH*(8j20g41V(UGHqwRyYk(zcZwX-PeRnrc&d9_s@GeE0`Ti*>~ z5XmU?PgfV)gF+uTxKj)Qtn4j0?UtrC*DVQ4p5Wh9TlGQ7Tjx_6$#qwPL(A8)7TMkS zK1a*;Sh37WACV?=HR~O*wF{6W5@}+EqeO}ITS}XUrS5Y`m1jpGE+V8zlq@+OG-aXU z<+&#p7cN8egO|_gudk zX3jCV0pAfZ>4=aV+9VW3i*dWAZ5|kW3+8A_rt=XZkSk>zH2>`mfMDRV(X~!)L^N$``((O2LNr~+0-H{h_8^V$Nhdy@y z0f`jv$~Ac0=afD3d(8cIR(#I@Ct$KwsjIh?*c~DYy|)gd-y))XoeL0|`nP6tTnnkdBV z*((6wp1qRwnNiyZg{?7`;C%rH=<(n0fgbTkO`fEA2EJ;yII*(*%veH{{T*MJrY#Z= zcgwMV_lI6b$bZFW$!!w7X zL-!(j{Lfyk7Rd7z=-^Rq;efh{6c6E=uZM_J_rbI9iG-zJ z4TJ)?>4WwIRlj6J#qCf{5@A9-fR*4rFis=4BOk!&IuDE1C!K$28i>R=O1)4aiMpY1 zmC1XO)WS^yAb(pri; z>Kyy7{93CMixknIkt4a?W?@VwRJQ7Jb3-dPjSn?6F=w(wv!1i?o;lm=kBXsjHl3vW zX+|B=yK;9A$${os53IQxDXGq+J#k=D=>_4EDFKtVPYDxkS*S&4INRhrv(IYZ5r#*E zil>MyT-DhjV5N4{je6(eCTjzu?x>JFM{81hEmyQ_FZmt=c|o7q*nA^y72QVC&pKgp z>uU$tIpK~5R!@kikQ#+%g|TUMS$eV-KG+_5;?&Jd-j%gS$g-G`$a}uy)lbLNEVXIz zBQI>(x*!szzg+(DUu9vme7bf*BYZVhzO#-yt3c9tyqZv?@-+p6lPaRbB($An2$!0z zIG#9j2$c4yP?Qe?svxi*T)-OL>Tv)2AN@Hw>3{k+rfD~?KCrsvnn5L^k{2>MCp84; zDYPy%^~`HK>Mz5q7#0b%AE4J8e$#oF6Dh{{Ov~b~%fu|%Q6fO9 z0q1Yl9O0cnlGHlFLPtrJg&n*LtKKR)XSHK-ZLS~iHiz#0>^x%N(M6x@CjnMPX-sGUb(LUYDo>HP$G z=9b-z0;AzZ5`_!2{yN$A#C2Zp_f<1n6%7fFqo9Sv8VN@s&IpN}p?){UobQX;5t1l8 zL`aop8Vt7q_}$n;HK55Q`Yj^w++Tk8N1r+1VWw1J<11M-7+TE?Y>9Cz>}x=h#wDUd zlM-4gwZY<6XKe`{QbB6R4<2^m@x=2weIP9Ir(`M|TB%ty4Pz~vaW`p<*9yoKIeu{9 zGb3a%fe4adTvHZo`8^cHe^fL+ei6m7xY1SccTY^3NaRYSJhNnN0(9`@=wQmm#FB(9 z4&dBHS&FsAy^Y*{-z)r$3exv>F}QIn4WUnbN;^bz33z2=E4&t_f4ql>FVM2!bs1Ka2cFAgCxqc-hsLK}xU~sQql71l=dh(_R1mW2>8RVZAX#aA z?=P31{V9L&Klo?#v}*E4Zhb?7s9Ctg`tT6bjKp{&-;-PSQcH}>oeU}A-?nNGwQ`=v zGDAp%bJi#s&lD`BF>x2>1Sr=#$}c_#LFXASS-}?=s0G;VmB72+;&rVE4o{~@B=(7Y z5*w|dDQ;e+#G{Nv#(@RKis*!3>Z$$AVk3pHJNB6AGVukI7*)C3wM3nj#@e+wcBOntL!k}1E@c38%ksl)^hPXXTkC&tTzLOMJ|LAsQ zp6?>i*kf&gmV`wXHzKZCGNxDbw!%zgD*Cqw2a$}H_!P?AM$hS)Sd-o596r}^xe=Uy zLk=0$gfmoH?#92Awi1jmSAdBMizUuM1Sf*Q3ha1A-z9$XfBM&37h$Kc278N5a4`tZ z{3{!~H6eKT911u2jg$(WDVp8pD#1r2M3kBT&cuuUH*dN!&g!vSbCtSvW7EKuO!~uk zM+YC}HtIsffpNG-?5}2$spQ({pCj9RmKiGI{Pakd8RL&}L9BGrq|8^BJ zh8fc^Y-CP=w-W4b~FQ>WGd+VqLTvD&xE2{5bB}^PFmDG0!2#sPMVnvDgbExP$LJJ5{xQB zYD%N}WF(R*UlJwS&Dqt+9>|{;&@+A^R)>ab-AK?kYLJH{Tyqj)5H?u^k>kRuKW#FCj#R}2_2Id;Y83Hoqp-TWp9I*Rh~VSS5i39#6a67B{!U) z783L~B@2dgExbULHh3XvBnvw0Nueo;CUw?eCHh)%r{~P+XT9i{@vP!6*`o zQ^){op0eh%3Jha$8M}=xA;}}dPhnvLZhb>S$Gmsj=@}eL3+Iv~MjRfaVA9CQ5TvBh^w8wL`WXf_ioRE|my}5UtO&Gb zR*XoI9WX z57%c4bxhNoSgIi6L)z|xUW5@fCBMmMmd0Ig8$b$@5ng>q8kCKBt}=4V8-XN%>3B3u zmM0__SlD5F2H*bX&J-~|BvMEI+GSoYix6+p;hJpzhUZm~cj74Vy%rOj-*$I#jAz=I z>6ovy=B}x1)><=C{j9RM6PFbK1qci4%I2FJDe_P(;kykolB6F?&)Z<91jnA?5fY>E zrIF~Z;+bnT2rpr)khB&_Bs8p`m_)k2_>9;~>2&k6!z0B=N?H+iiQta7fR=h|MCX~6 z3HnW+f$~6~VSHl&z+3$iZ)2^vA%V`L7eaEwQ*e|KDvXqdqCB>?^4KFRc>@tMuo{`d zI=VubD@uaNw6%7H2$tJ#mi~>HF;-?rZB|gIVOT=CUJO!#6D}f&L9fi!v_p=o0>!_L zq`Wb6cKV%0d2v7XQ7FMMj7uy(w8g9Qd}CJEXbS)bvao1wG0`aO2&l33&OsCnsyq!8 zSILVPr`)VU$80UR5QOn`*xq5i^Bq6Cm$zy z0A%IB>(i07Sw<^4K5rfh{KIK%JpCvU69_9`;Ec$|IoUl;ayC7S<9Ad(B-_%p+Z!=@wQeu=V3Btrmw zqx4TL&W1X_Fo$}Sd26vo>E|BRk4Lq}P^lOmKQ&`1vQVOk7ET7o}%F%@IL?RKv@BYH4SI!YhY1+OMZ+eZ15!Dg|%n#_`)QP_`{|r#b z_a@i_iLMDHjOc*TS@}m*rdWs|0ZVhQf=A2Z?;8=&J!xK?0&h1jd9MN~8L1e>QPYfh z0Dmf1)o8|2Sjn;^h(GveS^C}O^0R;QvOE@+`FM4$@=l5E5z#li>D9!GKp>yQF^qWD zj+bg#1f8%tlYagXp{cMu&MiFH>UwoRpYys^N+m4%c-f`xS8zLx)MmYH84>5;+tKY_ zd|{1ly9Oeze~XHj`QdZoq=B=a6X6RaG-@z~tpcZhi&mLTD5O`PK?sd(k}k;iFhX=9 zkvIlC`%FCdwMnO)tzZ@6E!w1bY>b|q6XKbdtW}${jnAAQk-W77RcY9Y`e<5(wUVzj z&s%9*73Luga~P?RLhcro|h1-QIwG4BMARyF+e=8Y-OcQ z6&6eXcXba-LD33X`#lP*RbGqK^5msydl4cn6R?N%TS<oz%S|GB!~6TdjivqdvYh71 z+w+}yLsrHG_|8%#dx;rKzT>|o3k0uxsO87=@(@fdh$m+rbBG2nRApH)ZmQvMAn{O$ zX-@&8%*fv7IY3N|#+nW1GiDh)(At|fZQ75mzBh;1;OOGziSQ?y>ZFC!((^V8w~T-aCB3jjzJ*v5r{Bup z1jP;DJ^2|{gLh54-wS%sxOyg{f$_y!D2m+D=Yq62h8Dy)+cI@~oi~U%COq4A4fodjwP&}nh9CmfZ~SQgf}*@$SS-3$p+ z+`XYX%;zyDitG{hyTJ#J!^p;`HAX1NbHc1^4{kz0+Ux~D3Lj6@#7 z17z9|mq%fa=7r)}WOqb|L`}nr6Dey%C2{*f%~@!RLRgrW zMNFWG9xY#r>%m4!J+JT4wW(5gaBXUJ@%KVzAU(E-F`YaN{>HD#JBB&lwyFZpVigUG zen-#Xka&R$aI+?A&EK5U9JM=2AC2zbkzUGAnuNnMVqyWZq$VzQ!wD9`<$b%&)#{{7 zSQ_~u5h;V~DBt%mhmdwxM07huZI-Asg@uzS5QIeEkv4VZjw;lfM2%3 zO&C2l(M&E^7k;k{jl;Q=^FR!FfgYS%R(FOoLeTGsP&i?%@@gEl7=r;B1vmRl<;?RE`+FxE#2cUmCGZL zI~&2=Phx&vOJVPocaDr9(l_PLo^Pa$b(Xows1plmO6AwgUk*S-xIYy*hZTMs?Za>rn?cc2%nO+HWljsma_LJlm6l1$B1mSF=BQ1Xnbk@IqK&g#w14 zjcYudJFnV_`oNtnG2orp;BLN-G9_2&)}2TCoCv|>$l&WJwbb$A9qe1*{?26|@SYG! z-Dk?Xn>2fP`64BqgdEK5RV_J#EyoAfZG^#9E~BL8}qtmdU}XOt9jI zhuw-P2?K;E5iLphlCLG;(s)OMATvz1%Fy3ja0hiY3Cj*^6?NaTx=9p_*+fWdv>s4B zilr2`MoIOsxYj^N<9o|m+@gez)wfVzMM}TtyJ=xHQBk}P7^YfP@#gW6WDnktW{?qDc&WSc zAu7T{kTk$8DgmLQh77U7qH$0fcRb^|w?DKbT0D6jQEp4jhHX*ua6{X1&;hSlV0lD( zZ13@owr6Re)>5|??!frR%67RhyzB!SjAyi=$QbUCwKchZwj#%g5YHYJZC@$%Z%l$n z+3{!7N`w@Pt|oaZ6j_*vuP2RbnuK`3u?t#^@Za2x5FaB&g4B_;MQ4~?oK=QCgLm3E z=qIT|MBug3sEOlYg}v$XK{ZPJSYhW1>d~~k1e2GvSr|+98=kgi7(~MiJQ5X33vnu0 zw2gi|7o^4Z)vDtSOs?owyq9GPhD1b~jYMF0c}gR1MsQfOmL?@OLWCr-{5<)1E!Cp= zL>MTKz`gQkNbH*o;oEH9&nbC0@)nzSgF6uv(`2m!XtZIa{a0bT69IkIxuymcBPRblVTC8jtL1uFghEA zN!5cjiDprB349=4j+0EF+F2umKP5Z}IWkyR-NQh6gl)IEfvwIK1!r=lVz+FcI+YyM z?Nl~V00gjY>UBfnumri5$JpJpoG4oXk*Yb?l*@=+-PP%oS3&$a`qv5b?)VDRpY3 z$Zk6MQ}=)j7B!y>0Po(d0%+uJ-P8X)tA=B3RFsyICm9 z9Om60Y*9hEOWL^f78b4Lar4%QMU2oemJmeCu8lepRuXjfFli)C5BsJX>Ddz}5rZ_# zN@1g8*V^#3ArFI4{vyrCiXT8N5ss!S?$<48M&WhW4pc?YQo0KgC~rn(j}B!c*Yl2k z8)u#s(qr;ll4j}B6q5S(*!LnZ6rPd7=8adA@4YU2O=+ddA5$KoSVu^ZArAY_qD4x1 zcN!m*3H5PKzDVOhNt1d=O>JpZH|4vs-ECBsULn6m--~}YK#-! z!CIYYPAl{hH{8wo0Fe(>i6JYi_{04{8=KyoaU^MaXXLG!e<_29T)$M*!NQt@ zm+y~!qR^+YNDpo64BC>#ElO&LkqyohDelO~1#M3j&yKYe45VR;W(UtWxCOxK&b!*o zmE4hHsGS>7p0xlhes7E=lqlgQ|C9(ADaTY1X64|AI9j9$ho+>D-bqPpR95~DmgNM0 z4}m}!ky69~5m%GUo)Bhf?zl# zDo9wAu;^Jqiks9Aql;qe&yFZ)DH%?dpNPLfJ1}d%WK3F zV3C7S^5n9+&zeXi5^EqbyLv`dLV1@Os{Re?!;(PO7JTRLMdFxD5w~E{Q#i5oeYF`$q09@=PoS zOMflyXevXBlf>z-`f06+$XdLJ6qdZal&w@p<@tAzvoSV7?;sc>Zfk+djNN^UO7Hlf zH?uQlYNj5HbN{dJ?l%vCuR1*P{fJ;M;*I2>X@hry@A6<+IH590i-h5Sg<2Uw;=OX1 zPCOf)$MT^uhSS`OgD_D2JV9fT$E~tF)_d3TCsG;|zvG7;>{92*+|xL= z1pnUC_k7itUsz%zC*{la=$TiPmY(ndB(pm8G+~+yB4j`jZbS|-8xbQAKh}=A1=@ym z6>Rr*x%|>MutJ&F$0p8#pZLjtu$Mhkqx08se;@`Vc3VJgvW$u zx)T??dIl1umv7RU5FTD_Op61E9bSHD+2Tldgs z0rHG5a0DUogMH(5hQ+|YgQQ4BEiyb|rh1$!s?^=BrckXPdfJ-9`eOF2Ck&tZB3>u> zZi{?0g}RR%GP+c&4yHRfk+?SPiuW1rn(kxF(d15PtsK1b8fKoC{zhbsQdH$6+*3;$ zG%ih7PcxASfb*0~DKpOoB%DC`7)UjIxEX$X*nW@u7Vv1%yrQ^WsD-GYy_dSNBwDXT zT$^8j42ilGNc@&p_H%uz+LP_0`%A2|NOo{tua@nl0e2MPl(egZ(G58xcNXUl{rPDc z|CDX7nH&;J8sFqlSt;H<%-}|?vY7v^yqfZD$&^w*r0Hu)zK1yWXmT8YU>Ma0563VG zi)3iYOo0++#VV+Kv;-SC{FOKq}u(bWYEu@BRLR8RvPg?{a^BYe8CgtZ-~Bcunl#dnZ5*4J!HZj}~vNW5UBGMXuz<_21R) z`mg+!(k%Xk^x$C=2@$ASb9u;1$a*=zgnuZRd>3UL8cvrcLEiTrzJCBpqzvCfB22bG zRAZLXuq;C&Y3`+N5UlqA%E<^d)*mxEbX3+=^qmPjdLB*Fg_=V(<{aE%UEBK>v^F`2 zB}&U(P27!JpLo(n7Aey0I`kRIc`#3|paYVGpV50^<&l*6LflL~eTUtlYzq8eNXHqr zLQ$P6v~G@M6Jy~Py5dj;aeDd8n# zrA78Vah}fr$PciO$iLN<6uEVKiOH&3MmGw%^f(fksOfuKCIwP@UeoBU#?Odw!aKdE zO>nn{@9zB+UIG?{@d)9oK-y!1!buh+mRs#DHXB)+%tg)4B@|XmN2?mor_$nD<>QwV ziSd}_fs}Sh2flwHX1d4uE-jjKDW4Tzsz+2tcfNarG*)_Kd2O5rmPhb+B~bBDajhwK zwjS*z=dFyC!CxZxP&h9i{dRYQq@D+oK1ZLmINKr#jzkbhP^Hf(Z24WY%31P=4A6UC z9Zl@vY?yyp&aBx*)8R_+0o$%RuY0t_etP~98e?wNqe(b>LXCi^rGwrVt)4~N($ej% zh6K^vB!Svv2EWjIOP^W#yb=|b8g2q!JIPnPZj61TMU7_lTd0g)2%Qw3!1YOyi)tEo%7K7NAytD;zzg0&`d{FvkUgB zK?C&0Ljs2+JzDAS6|+33g`@5#5UAA>cIA8yeOc-!-|Q1|V+j^k9kJf%Oh|_-c3;87ecEh8!uZ zl-C=p&=+Cr6yL6P(dK>$mBdAp!$iH1CONtYcDqFdO&fwI<+ zV0@S!5F?WtXtWiIoxFP!NzN-#N)2=`b+LvJYlW30_ZCdU3`kwpJ1j)xUTeBrefZF} z+*oebAqpNs#nQ|t*TMilEl=&t6t5C4$>fr3UYjmT<6`Ir-h5Cvlz$CjC7npi(~DX( zp*U8XiZTH6=MH!&kY~NGF1rPQwRVLo!&;wx0^ALg@44XIOEQmg!Ct0f$)jWfj5aD4w%OsN0dzqoltfVxX zbN~HT85p)7TY?lqWnvk^CSACFW^d?c{Fa2py}x%vu=9-lp1Se~uMsOFM_<#j*TDU2 z3@K6kR(uZ{Pg^&+fAZI+Zhz=M@r6_2k)O3yeTfjUWN~X75S7)fgDAX^(z1vgtqc+& zq7hh@J|UI8#*eo31q!$np%x_Xw$gh8j;(KV9Csq((jRTD&bL;N2(yV$dCj@ z&1875Bn7}AV;OQ}&u;mM+jWXxUk71`la)_L3^zJo(^?((@8F=QdmX z*0=CJz0ZB_)2o+d-#~+^N83fqVAI)3J^=Ot!$>#cUx|=z%t1tkO>SsXWVW69{wL7SbDNCEPZN+_ z@GRX(g_1JmLQq5~+7PNN0)#TYO2Ol3Rw7kqK6|Y{E|qJIIBM0Pz4Kn{BZ{aHj8;4? zv)~2MLNWBF86i<3i=>vqi7>~iW$mUL$!{)C>CMZV&z$l|-^H3|YZusgT6(fq?Of8pO)AzmcqB2ctkN@2*BZZe*tV=Hv6{f>HRyG_5F~5D@?7E|xxq7#Xx{;`2HpOeqcj~x(?{;8S~dQPmqX*Q zBvQs&SoVsD)?8vW3;JFT#oZK1YsFO0_wsPGwfR&fgg&BG`Dl*NDpHaGw9esxMoxIh zjL0boL%Eoh#qe7i`=oTD{#)x#{Z!r{e4J<#RBX-J+>r#wQ=ye0DKWQ+^P#5A zNNr;*ZSid~2s8{QW2oCP&Ka3Y26!aK1`0q#=eY!o3p`;$1@jbouS&fEz9M2a9TfiV zhJ=@a@X+ezNJ_s|RwUPt!i)LrTy4sk;D?;mH@Jf5q?kA`TP2TGN?#bz;%>d@<%bYm&CoT@aC-L()+# zVFP>*d0-kq4{72Rm5epQJxHyUy4=%sx-$*rF{m8t20rPut zQy%vLN$8UZ?&(Vaf?eKU3CasW+ZCv`ImQiXb% zzl$Q!6+iS`+|E#k8X^sLt#WwswurIIOsiQm?r7~N(q=40{NhwTv^X_oLV0=!MgA=` za$6d|b)`zqAGt-_ZNE&|=(Z3ZhKGAYH--rDZXjVo2Xgj19V3Ed#qf&CElET1!Co5b zw>CLxLgNFpZ;R6KKELBNHu<8)qlxW&FwrJztzl{d1{w@eK9NBdmF?`pLt=0E*0;WM z|CMcT8EE4U8rL)dQ_n>U8JT-LQ^C6M2o%iH!z-kEUec05wYe1)!;_b2;a~}_nnH_y zZv;=#C$DM<9Fv7LvbT5aK_W;W$2*4~5jDy%jU$Z^nu1*XYsz`H`rjjvVoo8AJ02y# zJCj5PJbxg&~8E&1Rf4d!ZoUWK{g>}-(?lJzUHg3#`VeF@w~ERk65gE&e2@9RKX z=w%v=H^05bRe{E7r_}o5RxJWSv3vCQzuNr6!)jw14_jB923u6L0^rHC^?{t-SO0s# z$0ALTP-Vp{ZaJ|4j6ie0C$_?w1^hKJ?dRQB|HsO-WTLnK%712zHmclYRm1)fDvlt-vbTFQw;(tC*g9f6V{<$Mv9Bw-)yYT?1pB^mh-|2^D? z>R=Wl+>(T!2tP@GhxJ*luz8d+X{En!Tt}#Hqx_#8H6wa|&~_LN(^&W11EgDVwXGi7 zC64IOO&;ELj;#&b)%6S7TKq?^BTFz`zp<*1xXsx<{wEA(JVxEK950igBQOSng}5`=Sy6YRPPFL-5k|d- z;6QENL+V@l6)J3P`fBkYk7-NN~z)=>0 z40=OwG6)aeL}BgF|7$1}Hz?i$(Q zDTG(j@(8;-gxN&E6}ysNKI$XX9kGiZv!0TGH{M?0oliV*(VXKIu)S&X-_kQpr@LJK z@n2=>dOM{x=1B1pn>RgkA%u{)Ri|R! zVv!z{%&1!dS{Qwu-0zY>1aHq;Q;T{+b3Do5)y%|VP`F=IHqu@?V!ddQCS8N^%PX8F z61&INqp+sgCE@}|AvxF}b$c$qiC0f1I!cxlD-brGqD5?L$knC=^d=VKvV%q%X>NSg z3We+DWh+$b;a*i5?2|T?c^5~oLtuUakPS{4_ zL#x|r_KGFOb`R;`eby{ar2M2M#K?ECI=a=5sKQ$-AZull;&{ouCEBPbZE0YY(vZft zx$g+VeCmtFz#sW7xkbs1W1+|-H&I6Me}tjuTd-{-%`Jkf zn3gUcu(>u3F<+KRfBgrR;L{p&IB~cHjFf@=GApRgN zaOr>yXm>@dljP=`TYu@8veqF1gzIfe_<4x5ujmYnloPLlWMu2%92V_D5lKZWtfY`} zzuGdcIFZh2O1JL4+?JVqcQlo?^zq#M# zb*%2v^wx(y2KT@H$;#!qOvM*Xu0U=-cqQ!se)CtInOh{Sl(Fo$@EIH{z#=ugVZC!3 za_=kRN7yhAQGZ0aByno|p3i^A5$ahc_dOvtNsP&kB4GeQvF9cp55I@&-Abe=XZ_d> zohm|CWdi4eOH|k^Zwz9=v4M`XCLr?r_TIKIHES?-(q-$zL25ffkgjrebef(i%v~)FT*4 zRyR&-o23vXuO?xEfI!`EuXKM`N~%n%jFTZ0cMnRKOq!t3(}wDf^wxvQb%#O!U=n(N{AnewAENtN5C8bpYUrj5tenzDt);9NwvI6Sct+s*wg`xZ-aB=c>AeCKW& z?-C_L#I$OKA}bz!2`*bi7i$jC2Sai;pUAntbfqsSgSxgxNf}0{(8!~?;-EeoQTdeNVOesc{MEi`^o2H1wp0{G z$urmV!9h4u1{s#zGbt(MU4XyzHM>)s!J)$XSQdE_{qR!fnA2H2g5_w0YPO!Z2Qox5 zVVmQ|x6BkbX^Rc=_Z)hZct%)+2qi-bmLxl#olIfM4|9TJ{BWo$>D2sonn7v0KT``4 z610dLG$w*In)jO%Mb=z-QIvU%lCe7U*Mn@_%&+BB9 zlt!e8Rw_lHDF2Z$fwvPHo&}%efdr4iiRM{;aCVdtGm~3#5V68Dl9U?nx3@X~b4O(y z!bpm}G}1|7qguhD>aLV{di^dMgmBw8{C{MDSG=Eli*Wcg$HT>S6`qI=&0-Y`Ko4+=F zw;%Z73k1pwzE+=48%j>pOItggKiovM zKTr6GM9&1iT83DY7kjS)YovoDL^m1Y*527~uY!OIskw6krRt?B!yg25JD1gc%&z27 zf)qtz`0H$YyxVpT66fN~!*hO&w;xhBN@m=eAy{5Gwt+=qBm7JEqQ{7f|}BTf3bn49_@NpK_*2@E*G8DST` zUiO#1`JFbIBoxaLw2kH>oT#o@e{gq{$FmV8bER=`^UU!4zQQ@`hJy9Sc=7dduqy28 zj69Ky7TUwBly^Zk0>wuI7=2sATEr@%r`VcI=Ycd%n`3i?fRfrMCpJ(#t?p5{EeMa3 zk}PW?GK|%Pt3@RJ-6_q9f`9d^-@SZzd6ygd-G~op!HD`_ za8=|dxm#E8<{_*m2El@o9A#DH-hMgpQQU@R%-S=FHY}=k(`H>P%(Y$-l?&#}5>{*^ zTt(xf@XTapcyNvb&INI^7@oKeu4X>0x}BrxMkXI#X%czmTC)_&@hoG0BC$Vw^7gju z?%qk_np}bwgwP_-qJ2~mM=5Fg#1$;Q?n1Y5X%^H(ox;MFs% zYkd0nD%dGrzWU!!;z|n@63e9dscSe!*%FC_0;CgYGAtiRP618W?wbj}<14M7l_b%^ zzXaT$i5wC3tGnDTU|R<{H)LQs-YrA4*hOGM zB9U<@zSc&0S*5&C7_E$+@4(CJ?JqTgLV$F*-g?6E-CuRKKQFCvTsKBLr%>Z@0rl9|6#jQr+EJbK-ZObKlY7TjaRuhP!zks~x^#5@L>k z?~BKF3g6uxX(Io3_xCj9p+)mcBobHr(#PKkOxj*SV5Jook6t0kH4%Ai4~pf0sNk!) zKZ^wj7ihHov62buvz`^=0qJZ*vqVG)6Rt-7OsN|BE0F-eiR;jygy~}NHqA~~b0ig$ zB)b5j%!5RXcu5b9jhHcB)N(;u7!L;|jq~d8SW_S`+oPo)Az?iEa(8WBv6SkX-Pq_XXz^Fj7H#gjZnEND#>#U7d^05lKrC z3}p@<32U1EI6YfrvN+P~RwAA88?|^#EsM~UZ7@dx)#NE{ol$ew@^yssOha7*o!mo$ zOW`Fyjf+O*N8ozO9HWOxq$Lq;do$z^s~%~S?sh~Zpl{3FB>&w3F^Rm;QiGI6PS3)G zbORg;?~?&6%2yg0>GR8dj(NFzmRbLk%iE>9o`}i_jVsA<%eQ-9n7=;X<}jAogS_DW z-G~r*l=RsxfZmRLi^{WotU2&%cJuIWzx^GUZjvHr!4nLkUd~ihw(d|?j_09YF`g!n z9F62y3X&j2|4IjpY2-*E-eyUg9IQo%$Xd)f$fDLLAK{FVn-}^`vMZ#CMGbI2iDJ;o zu*?YSCAFmilDng~u@d^=?|mJiQx+krY+wm95`anWBV_MA~b*spm7% zw4^dxYmW~MwOZc?hj}GhBzOmmy364Yz z+LE(p7LsNzZ@fzbk|mX@{h@bmgOLPZY3ZUo^E|BOwi)fC^?cx&hdir?t(&~N8%0BBfYv9Hil0E*0S^Y5vx?vLr@nJb7kBNRi0iV2LC-E6L%7 zcf9cmnljljRhCKnAIKI?eh3G?D^n*YPoxFzW1`|axMdwLp^nn=47ijz@R%@o25y5e z@n9~g(h3@}BIRF0sG#5B_u_Mx_MM3T?J7)3M&)i+zVzAKRthMi;~4{^eQa51l7)7R zIGX9GN_-;~u&Ko(?@^e?Jo@g`O-PIHy?qa+^ZN2SDbYCW+p^@tZ?1DK>lD1L^SYcX z=jfPCaJ+o=znhyxVkUmiN3FMkL}!A?Oz9z4B=-nO!qbqH*(5{ufxdCO^hh>d0oqa< zR%kj_1BJ%q4YV-N(#PKdD;%EHl4mACYT+15_+IJTV;|Sc z@4q|Ba9sCtBOQz%wkq^}izk(al#7E>mcnm~+PT0R7x`Pnyp)c%*dx`nXDmeHEGlQM zlFj3w@?3)HQ1Aw?)q~c;rFbCDL{aRBLdn0Qr(M*Vl1OW+rR%uKwh&6>#T6gO z>lTig@)(aTACE01*KH>6RumUDFHX?pHFYWQ9}-l zZ=guDg-03n3K$;Nxn`of1l$tGhb2Th0vaf@a>8=JTn3E_M2FYl>IOhz3ScZVK4IT`MBcu zJ?!XkR(`8Z$%a{!(4Jzgd6zIAmCs{)QH!X$8AFRPQSz&ii6l4gbB$si^^1O~TDdV= z2h`m=H$~jN{&T}`3rZf0Zwt9wM-1m%JZ>Dh9n9%`O@BD)J9zW zQW}n5V>&ul$dHfT!;Uk2SX-2BAtl~gbHg6V4N1P^x`xzxyo(#k?~%IG@2$&t2#({d zR=s`Yzu3A6iKm7{kRWm-%Ge`C3k_r(mdR?O9p=#0kyWLO!(=$RsKW)01hl6K=P8 zkRFdgqBC|b@RWp22-Qmv60fV}V-0uOsO}v}wD>#HMOMcgqAMCt%TKc(rtabV7}*dB zk1QYF$%d;X#WWlzH%r*7+vB{7aTr{NYxurd%aqQ<*fVbLf3v!~J)scyzub!AK33Bk z!!Gv#pZa0kh`#&vxCUoIZ~i)(A{bR2_zOvWa|hq08s1aTt>2z!?VNn>mSo3#2<@7$;<=bj zPrBtl)=#vn6GvXf`sB`VkON+C$``%LrsxJF{%9-CJ!@E8x`J(3m{30}{1A@4UKdch z5t$-|y(pv88pML7?9a)QzY~(6P@Y5G(dK96N4Px?u{Pw*+JiO=6jFg+Q%VVloA1c7 z;=NGZN`i#GlM@f}VoG$-Gbt=8FgkCZ5!O6D^}l^Hk=$U`bwf2%V)#yubZneFWR-hm zAS^>E1P31mtjsjNy7+5DiPq_O_@fGbiNqX4CW)L}&I?OP(7wGVz9i=Huu+9vOV1fC z`s|rDnolWK|B}8>&UN#M5)N(+()vKvv=CVyU`(5kDW3Q=9&j6$r6sb2n1GCeaIKg0 zS?LTDP&6KXR2FWw&%<(phNj1M3b7K($}{_|jrNtJx*VRphonYxLVy-*8jg`!>^%mj z`!^gchiK)oG7U+wCRBdk2m(Pz?M97*6>IP(XW`t^dxUz=>+w82IP*QCWQp;9s3w0w z?Rk<4$rHR_;)X&N6-$y*_vQCHirb?#zI@+@(f51*-reQxw?45&zTvsQoDZ?~`a0!z zF%zOCA{T@Yjb4S!3UkH}mq@IE>^tYf+;8e3z^w5c`9%qk1z>SK-X+CN3(Z%7Vs$9!P6XdSvFPhm*dofxOo4|i7Ecg zDA`fMjchtKoW8l+3Hqa-g!}{mJ1|9dg;VkkakMvaF#e5 za)hZNm?Z*)Eq}o@OE~WCu?m@~QPO4DX7`(g3jxpqDS;3Y0;t@kvc))wQpgi z*PPkeG3L%P+V&akpjGLrUa5?EGtK!ihg|WF)jUlroY$TEdE#5jglE9^xOoQirKBwg&@A^{`YYPhm? zGZyP4GDXuc7Qiok{GH_zKOnyO?Rb44178&8qMWI(rBQpn{xd*pzrW|B&#aQq@h~2w zI(4X-4rrFeuVs+;e5e(=z05xPBDHM01710vx@ijrmSsq{Rl&XCkhKW)i#L6?)JJk;S+gSc^%Te00alKm0539p1k37u?0* ztX&KI=;uG9rd6weS_-9hfA!w*qC87t7+UM%@w_AmB2+FjtVn9CP7?dXeb?mZ2~QBf zL~%GK?2*PhUGnZ%(vgN=nlsKJ(ROvShCOJsf~3u{7LVg?2-Un!zwiWqajtr3D;<_p zbdbq#7T#vwT0>`BN^)@jIR~}ob-#&30zp##kRNk{+nc6tVpfuRmO^=euBNZ*Wcq56?3Y2SNcZ{R9*#IoE!V|WD{^tJZStCgJfQ8(S z3e5_{3MUaDXkARQOiAmHGr%)a+avwBJ5iFOSb)5P5*>7t%!A^fB+4T#O>L(o8mB)c zRL(bHXw11cO|*(+nI(FxMHaLa(cHK@H>$9T#;ai!K7seCuHpqfd93mXzRkQC~N(SA8 z=>ys#uXR(17kqt~m$MTbPlV|J;18?q zE1ObMB1>Y5-XKIIx|`D8lo*kg@y9;z zIXpJk@El59WUs>UycQ*%rHeV13eNq&7tKptL{O|au9g?kG(LIz-epOAczK<)g>jyU zpg^*iHF3^aTrn1$`#|>PHTaqg%j*_Jv)qu%u^1jNkOapGG55q?i~Qhjhdp>_BP4;5 zSRTDwnSPuYQl2=y@eX=+2%4d|HHkF@jOC>%QIfF0EkTfF2oG;rD+HA8xhpUhPrzS? z7Y_+*t6GLwe%5l9M+)^YK8a;4O=`lS@SeC5!Q#DLM~f%LjgmH;EYS|CrFmKe3%7CQ z{-_Mdjk}}y3Xn<@ON$PWAv`XPLWzTWUVMlhx-`8KS6bjNY4kQ3!H0 zWI$o24fp8@j$i!dnQnkcoDpZ)0+iSzB&|@AaIoS`tvNb@C@H@mxsB~U-b0MbW9hw# zg4&fKBve>T!Ah0~l7QtEyfkiLRpSX|2~3Tnxog%Tl3Pw9$42euRm~E_YZbwt-x{6c zB8AZ`S3K$5+xzVgA~)!B&$?+}SJy~6r`=vt-fzSNBR`bjs=ubFK0Wx@$p1=lI-{*g z`HfyYX(h>eSORGkN?U>1 zK%ur?MH2F~6)nxsLh~Qx*>CvmHR1|YLd`eyuEr(Fa!d=BnzSQ%cn`I8f|3all3?j> zs^-0uS!XB37z2$(+~UVW%xmfKFnnB`*(M`gq9ZGArBQ%%gbv+$(hOb`5H$HND<>qu z(cmiBC9FfzvgG{uH{be>cyKI&bZ`?N&~kfFVmWvlR}D>oB+YReooPWbr9=uoQvFXRdOUdVF6+IO-rJc~cltD{%p{#HJ#0@b^xU=lfjpwWc;!>`^taO;0oD< zj(+8^y>LV-r8f!z^04}#A;-U|^~iJ%l4iW;>voYPO8(qe2%Q^Rh*+GD)-)w@#L9!C zde@1U*ocJp=4%y_Gf0R8qiI=;QzDUA7d7Lt#tgr^eR%l*&vW_Y?Mh}8d@_Swc7*kw z$IIO$Vnd796n$XqMb8#Vu^chc*n&f=2*m7AzhYLr)Cce|Oj6^P7(hvg@=6ch518ak zLWh@#@Pymy1{-vf&OXizsTF=TQa1ba{@`CN7?T;&>VysX#E=JRBB^7~NrZ6lTBuR3 zk%fY1;YI4#C7lJJ$&nFb2^!90jm;aK6(`Ie)d;-ScSka&CqK`)jr#oDMK}p-%oRBw z?b#w?xo_s_%$FIY1C8q?opCxJUcPT~sO*@akmv8N?=JmKu+`3Ak`tBSS9*ivMQP9aJVBvQny6Ym$bCAXAl zX(2=k=gGs8caUFT9H`-QG&f0(^}I&pv#d7cc?zXjc4+DF_F#SczQJOcXK@YXEg_umACRr7xvWL;7r3Pek!>^a3yN$ z$qlLfYRe@Sar_*3jjfI#e~YxxDwX>MaCT($3_ABCCtssWDh%7+25L;Mun+Ru7 z%q2fG=+_D!Qh1A%^rR=n(S#ij&_L(? z&C7+#aQudxI2U$fxzT#58+LnZJQ`>I_LaXdvk-Yk$Z;^9N2Vh=ZabYhUs7`9-Eu?{ zeaf>06n1ajcRxUKfmUN4QUrzfJXbIPeIv2XLuP1tlUH2R#G$CZjL;$tGlLf4Ygnw} zZ!Hvhlv(McP(P1c&-+7!#E3LV^ie4jr^(wAI8md?-_q#o88ae4odT7iF*NH4eyPce z)7nA_)4x7QjS0zt(yT&@&W}zPweqa3m}Ae2dFxL0m+O{}Mbdp=+dbEQ>N zq|vk*pd{-PEgxy^FOk>=+KoR;-7;jtBma2fOEQWp-cl10A2Te)Xedx+UOC3Jg;%qj z3auUZrhJ6yVkvEW{C@}$CA(Ngjf|5G7zs^WQdo?M%mEOfj zQycEIFh@i9vv>%LnnHNoBKdh_aBo?8T3SPl=owbJR$fwibJ4glONV1potqOGR(#27 z!$C-l&b^o*BHL)4r-mK%pj6shFm8;gd3lZP<#}Vbt}FqIIz%%V(uh%dMFtw%!9I?R zr)jKAaO`bnX+79jd2!*SX0q{04v9o!0`FptccH}MYn$@}Xw0C6v{vm(IFue*-AZy} zUyzk%BoNpZA`kLoN{DcDs=!f8pdg&zn#8N|N1wSHT11hE(Gmuw*ZJL+(A}bXs#Q&B z$&WYCsFaTKs6p+V;f;qr{f3;_;#ahmvduVGqv^rvfx4m=u~z={95h@D5ZF1`# zG9qx?0P_0bU7frg3i|ROHNN+~?=93wG>ae4Lh!hgzkVo(p?a+_P?$Gii%FuOND6$T z?szywaw%Wn;d1Krc`VCpV8QXsXerjU6aRkbbMh*CBJp(at}3Fibe#33S6jBpoUI8E zwakpfv(q&9B-tkXh_7Z!t0t2FJEq!{)cP!)G0~C`wN{vG%^tM4h!jD7oQP?x97$Es zH=GANX=vej)kwp!R4&aNOPd1JIY#-s(kGhp>2#iT97fZ36$0S$n}iH0>98{Qo;u|D zf9gwdur1B zbfWSJ7p0CNwR^#?gr`5?D@E2S;Ox(iq(e;r;f0e366r;9%|A=q)26% zmVl4QXf^pq*&NMXV!)PBg3pYORL|A0=4M=Tx44*$SG~dDq2|$fh>PvMQ4$%R%YJ|JYpa$eu?4yciKAwsOJ#ExpmKa<1rLSMj4-rko(7Ui2Y*S;L<$Ub z=Y$7M!&=3isfZ*LG+JK0$C;8F-0k7_PKY3KqpT?TzPCkwEJ27Q$x@3*tyzN~azo_m z#W_xCVRM_tZ(6lqJ$0tUA)dXns^+&`7%)O1NB)ipq0@ zkGu|~b5c;ag7@%`@1>p5(vLnV7{hJ>jCw}|$SAG-eYe>0tBFM7fS4)+^H#2C8j>Ki zEpz+S=x2P2s187z5pPmMlj!BzLLml2>qv zkSucunM5_Ba;4NH=(EO2xC+wG5c;GvFHUO^Z`z4vFjuh|6B*-E+o@mKC{w}}8b!L1 zhL?aI#ER@o9&Jn;mB;yOZ;wtgSpEVfff2ne)|@6Aj{X(v@TlEgehYmMj6U z2YmjD5)P#$O=8}5;7OnV_R4G;0a4)nK2n%i8>zW5js*!Wd;xT{vF?+r?T`rDZ$A^&3dP$Y<)fq791XaQd*E}0W{3L z{gJ<5N8nq-P`H|cA7O@`sq5wSu+M-9V^4oegKCW;Cqe7HG_GeA-P^hQ%gaCfe;MYS zN9g=JMa$-)@d;9xKG0Oqr|vwNNUNeWtfyUjpiOQyXq{eS45_Uke-xHB%m-m2je+=D z-bZ+~i4*G*9#c|3B_PWcsf{H?{Vd3@oLI+F!W++PZ9(0nG$$lAY3?+?yUP&v-D;%| zSifXHs>Q2i;6(i_(TGmV(u9f9r*T#A0!UVP(o0D~?Vh2Pw}0+|E3qV^jSGpz)~GQWN$|SgDg( zaSeslou2kQ55dk_@wewYTm5)_YgA8`ut@c#Eb-hq%j8S`?ZLgW`DS5$&_~Xb{!d zV9zAw4P&)I)E|)gxg-gZeF7sQRHHFd{w-b2D-(3+MjKRyF@5q5PL(`dAFb~}qR=v; z*2%k}L={f+h>Ll==fuShgb^8U9 z|LNbMIP5UaaUNuB>Gc<$ZVf?k9{%`t5$_oKeCUj~*T#fC++dMhB0Z0-XkVj)YeWx^ z_%{_wdB!zyTgqpMsPUEsks%F92{gd)@H}jJMgtc2=ZEd^G*P-zI8S+{c$$0S?1*-p zNJq4Y2r5n^R+di%+}&IL8f7$LqIS%sx}Zc-Yw$D+EniohA`EyGW2DFy!j5N(NDixD zJZ!epePJnK9(9yQUc41>(&RyfbQ6n`cb{?lq-U0NlkvHv@$M^8cZdX`Z==b`-rgm} zL3DZx(a@u?M9aP=qgwVM8T~`^$2}p81^()p858{E7 z3#8ADtRXb(hzD6Rjjw^vH(b`*YpbohWv1q~nt6Tyy`oA^WzF5B2`Y% z(Dw*WlhJ_q1mxb$jN@tskv3neCTWwN*0!m8_{9>tLao3BH93GT)KQQ7YskjIHq+t2{cW6I?E9Cb`ox!AL@Y*7fbQsWIzoup_Pfh zAN5BZ07}n`X}mEx)_?cwlX6~u;EV6SM$>w^N0cXbFLB3zgO^ZQwL)r8YmFk1<1tyf zT2#9Iqtx)&pVf_7(S1WD9)I0ETua-UpopSVM1pbCdW==vjk=EsjVaB62$Jr0rR+Ft z|L=cAmlJO7_>tG}hw6Lms@n4t94$$TwaU>i^Ip<@%-qt#b1nu?L%!>IoGuT;$rYZa zlokcr`oe!}Wu{?iU7UgBI5XbQv^er0B59zJ=OQUdVW~S7JTT#*3Eftj5u8*BU2EQ% zL!L-Y2Wc@9uVBT4Z3?M7{AIjE2YnGqg^>!II2SC!tyT!r)B#WW({UbC0VT||Kgg8B z*j=Vu#%c0%RUW09k}yckk1i@Dslzv7jcKumVmG)_>j_FSTz?OrwvZk7oGEEQiHDK(#q`Y|aY zI6i#Ur@(yjl{}Qs3+wLZIcZvHAxjRgm4@VR-DxcmBAP{sMy4bZ>%uEcT!QObnljlL zLYoMR^vAE{`niL6HfyWJ5f@t9-VnW(hgDgrCiDM%= z*+k-Mc}mJ37YZc`K9$GC5Y??bdX_hgw)!IRV+F1zK~^k>LEJ;4@B;C05+Nv&dD(`a z3lV`~P2pk=ky5|%E?cIQG(B^OCqFG8D{U>0UVR^K?a{gFfaV(|uas~uYl|2@`5v|d z`0&c@2@-Q4krCWo>WR|VDDg{LFQfU$>Vw)`I2{+}&vFX6VFg3$4Io?+9EruTH`2gk zX_81J<_KYkt>^wcp5{g;*t87UEj;>&witZI=XoVPsSF*Lfe_Nq*Q|>ND^D4 zmf)^QvlaT4^GUQgTcXu@6ni*Zqd=nvv1P^BBI7|yAhNByhaJxo55l9rlN^Zfw=8hq zf6KFvpBVJT4*u*U~7(d0_0-MaR(doqkM{D>5@n!677)-AWs4`nM&rl z*6N!y2_q#lYN9;XY&g*b^wUU!4D$1E43Whpnx<5aj*%WP{j!g~pZ*rv7?ha=$#O(` zIW9!=vUmjD#w&J-L?W>e(6J1{Q4MN%>PN%yDdB#1&Sk%bUc)Z9e z_`z04wubjJJB%&d=}3k_VtVKRz+m&3gq28+PH09vA*sO9)*0^$M9B}YwNxUJNccbx z)#T??Xy>CK*WylXBXr0&^dNM%0zUHoaN9c5Up^3_`GXLzhvo)gtS&>WHFsUuaQuXV za1tDeL}Ci*=mWm!Ck?PjmIi6O+;2+q@Eu$?_~eiL1zeVHdWEcH)NQ>o!V}ID2PZ<1 z(xtI=Rz4^`|Bap#yF-LK^H_sed>S7ERX$7+Zo?K7M);vQvvxhoPipH1K_h19AtV!t z#Gb*oUbIi^eN3Qk{OpSN5o0<=JzNkg@b3OjE=(^meGnUX935Y^jK~TS_N^BPj2LbN z$~bBK+iTo+awNf#NF=6^21i6{c-RAFfR*$CIvsVv^73L*65A?+QCv0tlg=XtK+Up$ z#9gAyc#D?eNQ`1)7l;}Wd7GQ|xh)QkkGYzq+=Rf83Zxa7hZ6?-+ZiRa0G<~?X=xTD zQR@Kzi-<;7n>q@$eaw8{@Z_zJoTWj;~FATSLo8(G0YC509AJkfjSmi-Yz`B(N z##h3?0%(0lv;L6UJ@VuJ77z;*O(T*AeNN)#*)i9eG}7)mpwN#)T+fe~+AVbKmX0e5 z;c&&{R*w=6`|-EqX;LeV52KP4x?x%iV;ha~Mi08eBaJ->i0ODVB`BsVe4KnJqy>#9 zS#L;0heUkb(y1|(=`T--Bsda@L_75J!+NYNERm2B4m^!su7l-eM3Xd(?W!u-gc8>P*P|V*Ic1${OVh(S|kf^|7tBd2#FWZKRj1c~I1N-gDcCmM()MfrX6W!ptAp))Wz@h~Pn#(6y4d0LtU zhS!S2N+)r-^xysZk^~36&36g#+k@Zn;l7Wbr0_95*Z<_PIEucJ0MYcKZ--5 z0lWqlQasDhND8l|aeKbEZHq^!ZH~j18k!h=M(gPoQ)E%i>I*AWctin2;55B8D^Wx~ zKrOM*lIBNC9IY_-ogZ~PwdLW8`yAN|hD zF|aRYJfYl#k_f{?kVp%gMf^o;7uuS*l-9@(>8wIwEfISw?5Qm4qITuk6GjpoEzOkL zFL_#wr0~&rbCGk)?qL}xv~s^S1$J|d)Z{$GiR5M$g8VjhTcHoaX6@;(9;V4NcCZ<# z)U6qZ6R2nmAY~YwG~x%&ZpMeT!dfJ*HC|ccnD%Y7@PwlH_rD6l(HQdg=zic!6QZI6 z=SRrpD7GMyKlU4wE;I@v9YHv;Uw~*`%&G!y2hj)y^qX5_pfqS+iB|JC?|ag?f}XW> zAC2iXV)YKB3ZRMShSUQr@`C@?rh$prVvOSObz0VznZv z)glJ2q-*6*$(F=ZB0`+Z4KpE9jC8cIS2M)m3)h@0K2Lh`0d3W zQo>`I5lQc|!v+vduXXy-vRskEXJQ}F2-iIkwN{U@)_z7Lh$16N(}T1oW{HlPC@P7e zbBGB^wNAogO+@G?YsIj3HAhRwvlJhlC#_Z3obz@Crw$9;gNl0XJB@}BI)RcGRl7dPYox$C2p}yDGfpY0C;b^fgr7v> zNyR`zHRr+rsd07l9Jnd@dr65!ZZA0vdV^$;!fA1cyW_XoN&@ z_YfA|u--67#oh#~Zs+CRTYV)G?GTX{t!W9ld1Puj&G1DTR1`1iVX3`IZtMwjzlKIy zXf4QUk+d~>wL{BdBUG<$1TrWWgtx8ge6& z9*ku8p^4B7J_Kpsc`bN&6JAD(sB=!@)|IMSyh!*&Eu;a6K3gOPUBb&0AvQ#9Bou zM-)kvtO>6c7fBDLA-U5sP@#$bwuCdS+&R~r9zjEb#ermhjWCI%S@VqiJVsa^U4^?z zY`P~uEj<{9B;c`H;bCcBh-XFL%$g+k!n4-&iD27Ia-tP#8x57jxVyE47M=5J%BV|| z-KVbS)XXx0cv;YjLL*5^%YSqFoz1#qjTx2-gnL3wnfCY|iNrn;nPxQd!HVa}2g&fA zGo9MC_-NS@EyrGI-r-t+hma`YEbR;}?Q#Od(jHM>(tAYeBRBjEB5^=?2S|&f)WUiY)%7Ank+(da2`DF&CxT=Or2UrC=qrf_Bq1R`lwPD$ zE#I*3TU4%y+6JNU(l!)rdrEYR3{Ok??TNd$t6-&7sv39%r6{?^PA_H=l#d~x%b?A?m6e4_j#Rr&w|9b`dEJ5O3Wtv zC+cO4qYY$3YuY4nDwN(fVI}T0|5aSBW&7%rPD1(Az$2(b5BsTVo!#C~4$ao3JC8&g zGaXZKC|0$>sm3?Yv!A@kZj8vy(r;)-&;E5P7RJF@IXA$vIntGoxmBhBAM7G9v($&_ zqJc{xp+!^E6h*b*mAC*6O*k9r5-VqIvAIOGEAZ1a?||b?b0{vf|G|}}XVKO8W53Or zuw_P?-n|Z3d26W)nk@M^T`t}+t&RNP^Aq?__2)p;&z0*$G*5f&GP z(r^u!zNn*xEcGp(V24L=+%M<_Ku^@#q<_M%=PoWvKdFGF>pXx=oOqMxt&+@&SZK1j zUFtTHXEEt4o|z>&_N7z=Eic!h`S#d@)YA|>OEq!@kfn7HsQWbwmW1@q9Lgy&-rRV~ zS6(gwq1-!R#_35wuT?(LFlCh1qo4VR5Gi+P8G7E*fCk^>O?alM%`HCpATvu0>1d3dgVGjeJsDG0?4cE`xv6oP^)O>P*mLcw_2MB0&#YToOchVOrYy!Km z>(+dJ6wMZQz4?)$D4-h-jYeIGr&N}|fdL30JMVsnzbvr6cMRiB2^E$R`!4!vCrb>N zaL5<_)XeX6W#5R90-tm&jOqeYK66B4pY|i3w0I z6$vH96z>{JT~adHXsP36*$*{lNqD4N8?BlEI#yH^PblD(vo_sG<|YSjsHb#p00cp+ zwzaH58P!uWoFT!Vrk3V)WHbYV5_}Ty_cH@GCY|m#TwfL+1{?u}Q#9+Uq{bJ&NjP2W zDO^c=^?*6n=ooS_Ky3XiIe4I!R9q|qW88RLe?_`s?OV=oSuF|I&&!Og#7Um68ZxRu{-OZOgP}ZcGFt(`T?>{oyU@$l4|(vhaS}) zQLxqX6)&zs=Qbj|4Q)~a>ea}Gir4*|U~RkMr5g|WqH@d%gbZN?-Z%m}L~I2LmS>}wNq-P~X+ zds#h1m~ASfYLwX#IO0YemBG#AHkBv2drE6SUEJWO>cp{R02{X#)g2lUc8M7^PUist z)fxHMtSFDz61&O-XCiS`$mnIz)rw=&o-mS#{-AEesD6A}YzO}~J7f`7djEqb9v38J}oDWYwo)(Az;@=Xg7flTb;>L=j%11WFta6vOhLi17+ zv^xFyHU}P0i_cP1fC?2x=dZ$!lnKmbw(x}Nju$dZA_Bz>hpmxTO|tX-5@Q?mA?o5X z($mPTH*;&baVn`>;k3W>WhEW{&dr~#^F{9KNv!0MH5KS{^0hZhKrso2Vq;W7@-68` z-5c4=6Xi1Ajv-r$=bJm_X`bHaz0K^k+!6Uzq)A@>y>hX0^zh@&CShFXa-%;~G*qBe z+2W|7FO99uY!c(ofX)q`$8)WXI;AdZD7q7f16O0xS3&0&7h zZ}E>dDoRW}13Qe_k zC&PbG0x1h^iw@Swty&Ps=mYJfbA4K(8RC* z?EL;56HD{9yL^ebs#;mE)8Gb7hA_INx!m{uRVGgkuSY41cWHL;rJL}LDVXElu)0OW zwj0vsIx<#Ob%+w!?EO4XQ)-GtyS>&G#Lk)DXn)$y7~tHOik6T!k^@S zbM0scirYMxzvf!9VD+)QyBy|z?EyAemO&ujm6bh5O55oTC0>JI#|OKhFLcMa%6V^I zXjhJN&bU{p86-dsVT5_%x2*iFXu4jhaQ+BL@Ckp3h-RC*qLZmc*xJx7SB|ew4C}n| ztP}lF>qCH(>D>u8Mu#Et3l1!>orj$&xhyY2#!e_P!(dAEqxRQt@c#y&>pw4T4D-KD zHh^eRJaAAoE|$q7Tl;+xVXqH%m86E#=Z$r~U-*Fg5qIkDVvP%D6M2kSNU^m01E8=VAqbS_KF2yXDzI9*?0{7}17&xJDybh4|CD=WE9NNNUkt|G@y(jYx@F}uPv#hGiNn^|)XppYAEb&gu z0#Sn?6xGkg*LMm9^mTnVkuB7%jGo*c*tKY|Jm~IhyQwataYHU<#QJ`$4#>LZ0@R$) znv<5F$HPL?Bh%nAOF~59;j~&%bvs+6>a41~Fr1_Ldc$6x683gxddQfWTU;+qm1;LB zPW&iOadauU3x)fGlZ6{W#Fr?p@0EKJ9I0GMa$tH)@e1K|BtUIRHEg*5i`!GtF9C5! z>K{{o<%v?C@$VoR2g$O%+k&`zr`14D;cEFF=Gn_96B+SGsFEqCXHf$yGrR)m!hV{_ zr&)HZzPurtTC?>`sp>MZ%viREtMtO?Es4w#(C2WsAEu?7HUPr5xP1b@&iCDXyM)}} z*1icv6f}qsI~W+fdR%O&NRxw#=`M@o>>-)Hu=l;5)PN2oGf>{ zO?X*7VN0(?W-O^oO(@tg(zErzA^y#dkuKLhDXp$WjGr95^TpIxkr{_TG!;`$=pbm# zPlFS4SzO6Z(`(mT#)Q7W7y-E%o{`puaKVHl8W%;E7*$?)kP#w)Nb%@xhx{8lZu601 zyr)UZF=;A|tkvfD2X;P~t960lWi|`sQwl7eKZ$my!tLV`Xii>^lNQZ_w>nZs0-2gn zl>0_Wx!5|9E{1i`t&^Bg2D}WH@`0Mo6@TcC7kiTacpA#Gjgz3 z!&fYAsP|`5uLiOE{YqlG(-=^qP&&;eyvWa5+tF9q(=##|DIz?s9{}^_mX1fTBKtlk z^8G~&(zeVLE^;#TLbN-=F9-eTW%*pfn!fnXCtKk!!y#F)TbE&jDg- zs>k{-ds!^o$I07Y>%ZZBZTWWFuY^soROVl^(rgc@HENwVs|cI<^90AsgoU|C!%QSe zuq&~s^tJI-%qNP1i%5VH2S;4L?tWNLOfS#0d!c6-vLIdP8*z7W9cQo%JC}?#$FeaK zl-9E|B573}Chi4jVZ2Wgt&#O4IhMH+WPj z9yBCGKcDQ#-_jZj{iwqGO}jgtN6=dBg_(f~M`6$Ju$eF-T7W=8MoBPY#ZU1(rqiji z$QB^$C`qtX)*0aOZ669+KBwx05VO1K)n4O3?BaBmOpHcRG`B)bk5y2@4U;7Z*E&ky znf8%tzP&Z5`MORz?dluI<`XdOz5(E#x0ev(xe86Qpc}ZK>1UM$zuDycL7GfF`3f9( zoEKy*l%(9>^&lqc3~%9NI4g$Aj!XFq-avs8t2MQ6m+0`#r&wq=WglhOGKQ&B*7WeQ z3uwJcbdOqW;d*-pp|Qs|FDQN?3C7-iDvkJNWWwN#YMA_!_=86N>ufZ=?$Wu~sn8r` z3u5MA>6U&AhQtSwZl6W&8#QcVR}d1+Njb5&sc&6@$Mqo0mSHJa#vLoV$j_` zz}Ub|IMz@MxzWOen!7+`y*h^)fwp41EwsPT4)I4RqV4)f{XBN;lncPwCxtAeU zv5JPh&lO;SsMnRt9)v&>5w3jpRk+8alVchvo3;8^J z$;v0bC(O9~EId1^E>jR}xz~O3Xz(?5$k{qYjfW3mjds|^2t@Z;kMk&fMkthkJMPi! zu#K5FLx>ZB$vLOBJ4}J)>)R|03Mlb2@dWEe?7f zl01b8j`m@&z0zWS=b4mOBLPD?S?|VH^Q@mn!}Ic!95Zvv#lgs{p8LG&vu`GNixkKE58;@V@ZJFZp^I8%Q;;w(OO{8boN>0VBy? zo!jGjEUm^W}v(%!%2 zUERzSP|ZVJE*~vxnl>%FoxuRo2zT;aLiwD=4$&Dk{tf!wpNcw?-+wN*9dM)JjH%-t z409Fbp)y2Ze^+wXu)uq6U(9e?$ z8l+-r2afd*nhx~}4L>VslaH;haDG>6#lY^YyH=d}`btGmrHerg<(T~;hwk-Nu?aOL ze`m0N1na0eMC$H0k2Jx@(zK|1nx{;__N~li`hDF`>|nWaL+F$H_0%ySv}w*He>{ zxHb?Z5dJGh&ksxB7iJhpiYH_Vr7&WLjXt*a)WzgZs8ZR^t|j4c)^1M4(AhY zPWg{Lqxf%crN0^M0@=uGa<07N-ReE~2}AVRZ0Ji+7a}flq9Bastj&WCl-!oli89*x zFG&vm2yW1-3amVN>f@2jsNV&r?p)_}o!QLsP4PQqve!V^4^&SeCIT$OWFCg4r64&{ zAEMFAVwUBfKf6F=5tB?{2SM=P6Xhq8=eXkSvE<4AilYr91x)lCUIf}9wB+v0W zqB5e;Gk^6Aeol8kl#ZW$JT$#V-TW#^u{;EF8I&|RNp`F0WOxk|@dW;Mf0<~%cm`1X zs=c!qwvTTBdCHG1l2!EAFJL>5)gDE&p6>li)7Sr5BWLgKqxv>;wHF4kZJS zkw&@fO~Kl@kwDy{w0%l0-JZk*I`?uiy4bYu{nQ#BdBW2%2}oY(>q(F`qWGSf@Hbj< ztRd-b|EQ7hKFzr#?1k2|{@j$mkKV3nTpIv6b0{RtnaL)SJak2l4rR92Of03r#$1DyKCC(EMOybpu@0d@x3sw zFS&(ReS|LRkf);K)*fAzAaGK(O%TV3)y$Q-_9o_`0GBR3TR| zV(^A0*n}@SZyJJQ>9(zzsiJoxqh?W6)SH!mLS2RA7?4l_+(^cM1a6qVJUYr;x&*Y;Gq*|Ai>%K* zx}`J!&9#hKD;{;!y)rY5x)meF)n8^*chKL!$pL=-V>#Db3)&r3 z0c_Cu0$$~M_x|oE`sNG4&P<^2xDkRn>WJ#a?v)fR?Q;0|dkR_HSJfeW%y^>{$9b3u z!dNt1lomk~C^SV_tajZ1h}9$d$4;(*R-Isl{7tQw9KMOI08-P7y1d8Kl;&;2bPx_= zVx~f+?@A_kJ@f7DE$pxnb;Annk_xu0IQ5TjSK^>u(4vMK2>K9Q@$g#Pi&@< zGOs+ebB>SWAmg$Cb+MtK8zl?Q-9t~m)zkZT@8WvkXa2DXN5U;7H8FYE_o23lfvcP@ zwVb*R(>n{^M9H9TYT6$1VDy=D&Hdjb+Q!iR>*|pmR)KHEc6i#|>=V{Qh~55$rQ!fE z5skjRDmrq+S~L9C^9N;?`J1xZx3L*b^fvxpx7O;N@Q~h3MTgV^|3|~&LMe=+4UC5zhIi6K_%{9{Tv>3-pc#94Ay+-@! zvCRc&A?5qPi>wBB7OhP+a=DBM{<20lpq+_#jqe0vWV)y1-UFV%y_--Lv07vXy~X zrdohlUTbMDiIdir&@h|2u`6J-Qn((6e&L_%0nax*tv?Zpym3gKQ8l!dg>uP{GG{sr zLQmM_eW1m?%xVOVcyHXJ>zeG&(|!++*f-75Z%+P(u>{cZ=gptvX0NtR;!}9>tf2wP zS2X3B+?Mm~?U28$MSaWhVMtcO=l(8sf>PeH=;N>be$t z{UZerbFR=Tb)wbh?D2Fqd+Q}u+z5)gZh=cMver7~JmRe79A;(XkeC~^M8ne-8e5kyi+pUKy1fHvC) zmMQQ>artK5XIXO;e|Ga_t<>OW6L*WX*5VqU#LxMM?%Uz=eN^A_<$tkf`l|a?X_6qe zPh^0m=cuab{(+W;`k+(zN3VOc0psH|K|RWHWAVD*z~);pN$?J=v~7lt$OYr)!w zp7F_ut%5#T(vEz@!Qqv3MqQy*V@UCfucg(k?f8+A=Mcg1?l_dVhBnUs%!!;ezM zJkjh@QR?&J;~|ALbINspBv|wK0(h!>@X7Y%c`xoOS}dc<%!EQzHn-TZ#!qrQs%S6B$t6fqPYF=M}; z>S*KDCs3m0J^iTyT3-?LVZtRYd?$=?CEuTMQ2m3KU;H+enbTg>7^8x^%GC+QFh+)w zggE#23;!$^=!vF|B2Q?|TsfR}G!HfN@zCqGZ3q7q8e{%9`wj=xBEk0X^vgw^Qhy=T zpHRWSV=*=cD;$<<`$O;WF|&?M__k(|viIM4sIeTLdh>O{^{lLvKEEvG1F=d1{_S@C z+mI`|ZV* zT-AsChyW4s&mR_&PxR7FT*$$xpr=u=Ipf+eTuUuW|V z5%W8WCQLNA)Y7dqiHS$F4r@#$$?)$;&)eHl+=Z*!uCfPKa`<4 KqC)>l)c*i>tv;0i literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/background.png.import b/themes_src/space_pixel/background.png.import new file mode 100644 index 0000000..f928dbd --- /dev/null +++ b/themes_src/space_pixel/background.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm8vuidpyqgsw" +path="res://.godot/imported/background.png-b7f8c58f305eed5ebed5deba47799117.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/background.png" +dest_files=["res://.godot/imported/background.png-b7f8c58f305eed5ebed5deba47799117.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/billboard_ads.png b/themes_src/space_pixel/billboard_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..07e41fec4a29b9dd2702c15fa06aa0ebc812663e GIT binary patch literal 8086 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/billboard_ads.png.import b/themes_src/space_pixel/billboard_ads.png.import new file mode 100644 index 0000000..07d80fe --- /dev/null +++ b/themes_src/space_pixel/billboard_ads.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkvugrm84rq8n" +path="res://.godot/imported/billboard_ads.png-7d84abd3cced7856e1014b499eb9325f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/billboard_ads.png" +dest_files=["res://.godot/imported/billboard_ads.png-7d84abd3cced7856e1014b499eb9325f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/bubble1.png b/themes_src/space_pixel/bubble1.png new file mode 100644 index 0000000000000000000000000000000000000000..d964d46a303f2e596db3a277716741b8e8acaafb GIT binary patch literal 1401 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(t#9bfk$L90|U1(2s1Lwnj^u$ zz^d)(;uumf=k1+?d9wo;To3N}^uNAnh0@lp)mEDhN>t2|Tp1)5xj^U4%i0;IO?>4U z98Ry_tIxo2V;%!T!-CiM#1H74%Wjx-`kr_}nivBEhY$mUz!Q!K7H57le6|;t71l{% zWN1)eWMFXYW7wAdioN20`l`i^>^eYYDhvz?Cj<|eo%zS`yY`(G-;TpTCp!Xh6AJ?a z3n$F5XomNXPu4dif9P$nhH3L)U~rfKbO6|3WF4QB7L->0nQuBg5%sn8BaOwa# zcvJx-;wTG;UGHic)eYX(GBOxUXNAV1B~!$?FZ>5Kz#w= z{;&8s|CtR$7&rVmxPSfq;>YX>9%`?z|0~4|FD=Ebh>taHvhefB)__-lp-AD@@Zf+ZeU5rB~_ z<5<4f#c{C|@WlNqZpWtj#CC>l52YCyZhw06pBYvRfQqHfQx-Ee{Pg+D9SMs=<%W%E xI>%WYIxGM8BBj!ZGl>jq4j~mtHDCU)UHPtMU~F=J6|gL2@O1TaS?83{1OPF{BOU+% literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/bubble1.png.import b/themes_src/space_pixel/bubble1.png.import new file mode 100644 index 0000000..ad7876b --- /dev/null +++ b/themes_src/space_pixel/bubble1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtf887ix1qguo" +path="res://.godot/imported/bubble1.png-70752e7ca44f5273bb240d2668c03846.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/bubble1.png" +dest_files=["res://.godot/imported/bubble1.png-70752e7ca44f5273bb240d2668c03846.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/bubble2.png b/themes_src/space_pixel/bubble2.png new file mode 100644 index 0000000000000000000000000000000000000000..403939fb7454ac7cf231a86171748e1a219f5472 GIT binary patch literal 838 zcmeAS@N?(olHy`uVBq!ia0y~yU;;838aUX1WNr9GZXm^3;1OBOz`!jG!i)^F=12fl z{qS^g45^s&_U>)3!ww=2fy#gX$M=bdWPQA}O!eiNIBu4YnQ}S1ZPhzZ?^>5%a8#f5 zO}gbT29v$=wG0di^*~FS{M_Xm?n=HtT(RCWn`z!T7N8IivqUnUIlV&uS-ovE?}nM2 zKmj1;*u*rWd!v0x{O4c~@NQ&VDKuv%xoWxEf{j1~rl7gZ&;2M)xra2ybOo*=->Y|O~;VEf#C{69K@ z%H<*jYyRGGZEO}~V7T*WJAXxRlOss@q5glzog4yqf(q4dhyaI&CG8ZvDEY#8BW350 zI@=F22VU=YKhW<3jA^_UKXG(;{5e43!I{JLJGwyu3&ij=0@k^k;n|};hK$0e_OpS3 z4oME$4firGWHB5|zHn2j5Y~tza=d#Wz Gp$P!g3(ms; literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/bubble2.png.import b/themes_src/space_pixel/bubble2.png.import new file mode 100644 index 0000000..e5ffd71 --- /dev/null +++ b/themes_src/space_pixel/bubble2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cd4lfvxf5abpl" +path="res://.godot/imported/bubble2.png-2a082f7f2ab06d54a4ce9c9a65c3daf1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/bubble2.png" +dest_files=["res://.godot/imported/bubble2.png-2a082f7f2ab06d54a4ce9c9a65c3daf1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/button_big.png b/themes_src/space_pixel/button_big.png new file mode 100644 index 0000000000000000000000000000000000000000..ad18865961f615830657eb8f67f649efbc6db315 GIT binary patch literal 6175 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 Pj-y9T9)AAaPe1=J6efQ$ literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/button_big.png.import b/themes_src/space_pixel/button_big.png.import new file mode 100644 index 0000000..3b36acc --- /dev/null +++ b/themes_src/space_pixel/button_big.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://buufm0ws53m4m" +path="res://.godot/imported/button_big.png-55df0468019338d0b17955e374f44355.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/button_big.png" +dest_files=["res://.godot/imported/button_big.png-55df0468019338d0b17955e374f44355.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/button_cancel.png b/themes_src/space_pixel/button_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..a796a16903c8a63d7a56fe509bf8d270c9375d95 GIT binary patch literal 3586 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/button_cancel.png.import b/themes_src/space_pixel/button_cancel.png.import new file mode 100644 index 0000000..40c4943 --- /dev/null +++ b/themes_src/space_pixel/button_cancel.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bobs4v1xnq4qb" +path="res://.godot/imported/button_cancel.png-59b3ff32a8eab5ec08dff365a23d3b1d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/button_cancel.png" +dest_files=["res://.godot/imported/button_cancel.png-59b3ff32a8eab5ec08dff365a23d3b1d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/button_down.png b/themes_src/space_pixel/button_down.png new file mode 100644 index 0000000000000000000000000000000000000000..13abcee98b202f3df1d9a899877ee6f0311c2893 GIT binary patch literal 679 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/button_square.png.import b/themes_src/space_pixel/button_square.png.import new file mode 100644 index 0000000..934520f --- /dev/null +++ b/themes_src/space_pixel/button_square.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdav85yww0ubt" +path="res://.godot/imported/button_square.png-07a5cf5851bfb9d04cf267ee6d4a2d6b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/button_square.png" +dest_files=["res://.godot/imported/button_square.png-07a5cf5851bfb9d04cf267ee6d4a2d6b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/button_up.png b/themes_src/space_pixel/button_up.png new file mode 100644 index 0000000000000000000000000000000000000000..834e3ca1667f55fdea8d4ee9a423beedfa80b2ee GIT binary patch literal 668 zcmV;N0%QG&P)du_8`TiMwsZDz;c`8>}ik(QdKfeV*kx9*Mu#q;Ssx!TDN zz|b5I1%h+{hVHm85Dej9iP<-OW(Wt(KNsS%Z-OBl4B=o12SYd*!olie{qeBZSW>UK zx5D@sgivTE(8vIcHK2iDu&GF70@Y%``r`ag+x+#dZVgx$mM)aGfiweD!~ATqXGojw zGQ6$7CIi}hVY9)EPDr<9sNW@h#^#o7z7Sr}q-4H}?#j9kF>J_T8>eQzi=Kk6nT^%4 zWq_&!1tgA_(U+Q|uU>7M*K}I->#>1g^kyUa&U{3cV*=HejiheOGismNt~#!k{)7H> z7d1{5L{~l0x-C;|MGe}U zm+uFSGSaC0zV)1adaln=WB*j!^DyA5{|xoL7neHoK3Q@vm!xC{l+1bo8@N*q2q0y> zT6@#T0QjRD9razM_Wg~OvVPRq(9Iw` literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/button_up.png.import b/themes_src/space_pixel/button_up.png.import new file mode 100644 index 0000000..29853bc --- /dev/null +++ b/themes_src/space_pixel/button_up.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://32b5q06gs0tc" +path="res://.godot/imported/button_up.png-419fa5ee8fd9cd96ff49f0660dae70b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/button_up.png" +dest_files=["res://.godot/imported/button_up.png-419fa5ee8fd9cd96ff49f0660dae70b8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/climbing_action.png b/themes_src/space_pixel/climbing_action.png new file mode 100644 index 0000000000000000000000000000000000000000..41a3425f86c7d31138358ef8dc9140431797e3ec GIT binary patch literal 18604 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 Cz%7>m literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/climbing_action_start.png.import b/themes_src/space_pixel/climbing_action_start.png.import new file mode 100644 index 0000000..2b28576 --- /dev/null +++ b/themes_src/space_pixel/climbing_action_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsaoc2arwu208" +path="res://.godot/imported/climbing_action_start.png-ba451ffec227af2390bde1e903dd1e42.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/climbing_action_start.png" +dest_files=["res://.godot/imported/climbing_action_start.png-ba451ffec227af2390bde1e903dd1e42.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/climbing_action_stop.png b/themes_src/space_pixel/climbing_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..da6d719f12e53470d202b178e44ba31249b11199 GIT binary patch literal 24552 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/climbing_action_stop.png.import b/themes_src/space_pixel/climbing_action_stop.png.import new file mode 100644 index 0000000..e982fb1 --- /dev/null +++ b/themes_src/space_pixel/climbing_action_stop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxgstes0s72x7" +path="res://.godot/imported/climbing_action_stop.png-b9af007609a9965bdb7efdcc111ba766.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/climbing_action_stop.png" +dest_files=["res://.godot/imported/climbing_action_stop.png-b9af007609a9965bdb7efdcc111ba766.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/cross.png b/themes_src/space_pixel/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..20190828b4edcbd74acec2e4c3d3c8bc05c7921c GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoCO|{#S9GG!XV7ZFl&wkP;i>3 zi(^Pc>)RW*d0QNKoG(guGc5@Hbt8AGkP~x_3zvM_l*!p~ZEu9&tYc#ekHqshV|&sr=K^Qv#XnCpA@uHL|YJ(0e5kzGCN{hHXdrd6vRKTSMb zW*fTxZ?n$?PNS{M+UI|Lz53Rneb+)QPO!{0$a<0GdZ3CeF#Mr{aLOT$g{%2laxw)< zMfr>z)lP`Cf6ikvOKAmZU2LPDt-d{W^Zk;`Vf^oZb8ema)%5-)upuA17p|VEaFuQG yM|;(6Vku2N6K3WFD*;Uh8VTf_++P16*8Iw8>$KAsmhS_4fWgz%&t;ucLK6TMm1OV$ literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/home.png.import b/themes_src/space_pixel/home.png.import new file mode 100644 index 0000000..acbb32b --- /dev/null +++ b/themes_src/space_pixel/home.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm2k5lc4xvfss" +path="res://.godot/imported/home.png-fa64bbf4173a5deae320dbcaa29748a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/home.png" +dest_files=["res://.godot/imported/home.png-fa64bbf4173a5deae320dbcaa29748a3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/icon.svg b/themes_src/space_pixel/icon.svg new file mode 100644 index 0000000..b12bd15 --- /dev/null +++ b/themes_src/space_pixel/icon.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes_src/space_pixel/icon.svg.import b/themes_src/space_pixel/icon.svg.import new file mode 100644 index 0000000..9354f40 --- /dev/null +++ b/themes_src/space_pixel/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bj65urn8oyc3m" +path="res://.godot/imported/icon.svg-560fd98ec95ed8f6baddb0cdf6be14fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/icon.svg" +dest_files=["res://.godot/imported/icon.svg-560fd98ec95ed8f6baddb0cdf6be14fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/themes_src/space_pixel/less_bar.png b/themes_src/space_pixel/less_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..944ef72b87081cb99f7ed0ff61d947073d9cc66a GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K595~p3={UqGc(HVo8c&N!($HoF5;YjgD}9cy>;?;_~DE3MpqS z%N;KNyUxu}=gy$ugB!is@awQeT&!G!z3Kev8$a#kWH`hEM$^tS*qy!n)>`}F+q(E$ zhcB9$%{w_0w>fyMAVw91O2%&FG Xr?rH9&o{r#1O=$4tDnm{r-UW|p15Ni literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/less_bar.png.import b/themes_src/space_pixel/less_bar.png.import new file mode 100644 index 0000000..ef20991 --- /dev/null +++ b/themes_src/space_pixel/less_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs2kqrlldxcde" +path="res://.godot/imported/less_bar.png-fc4b3607d6f276e5cc9bf002bfde84eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/less_bar.png" +dest_files=["res://.godot/imported/less_bar.png-fc4b3607d6f276e5cc9bf002bfde84eb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/logo.png b/themes_src/space_pixel/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8754482f1c7b807b2d5783f5b6791b15ec9606e7 GIT binary patch literal 10030 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/logo.png.import b/themes_src/space_pixel/logo.png.import new file mode 100644 index 0000000..7950f95 --- /dev/null +++ b/themes_src/space_pixel/logo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxgvhepd5jbkm" +path="res://.godot/imported/logo.png-45e4635b1339dbc818aec9dfc044f7fc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/logo.png" +dest_files=["res://.godot/imported/logo.png-45e4635b1339dbc818aec9dfc044f7fc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/many_bar.png b/themes_src/space_pixel/many_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..83449b520313454c0abe7278a979608d3375bd26 GIT binary patch literal 355 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/star_frame1.png.import b/themes_src/space_pixel/star_frame1.png.import new file mode 100644 index 0000000..a233eef --- /dev/null +++ b/themes_src/space_pixel/star_frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmws6athq34hv" +path="res://.godot/imported/star_frame1.png-592924b368026bc1e9b4109693f02c04.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/star_frame1.png" +dest_files=["res://.godot/imported/star_frame1.png-592924b368026bc1e9b4109693f02c04.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/star_frame2.png b/themes_src/space_pixel/star_frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9359094143ba1ca1ee691c3b8ded31c3ae5d19 GIT binary patch literal 15935 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/summa_bar.png.import b/themes_src/space_pixel/summa_bar.png.import new file mode 100644 index 0000000..f6e63bd --- /dev/null +++ b/themes_src/space_pixel/summa_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cck7wknwk3rf7" +path="res://.godot/imported/summa_bar.png-7710b3f11d6d3cd53f8f8ea4707e6613.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/summa_bar.png" +dest_files=["res://.godot/imported/summa_bar.png-7710b3f11d6d3cd53f8f8ea4707e6613.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/tumbler_off.png b/themes_src/space_pixel/tumbler_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6bfec8a4045efbaf90490373a42681bfe57f80 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zwWo_?NX4ADbJqqPF%W5uPBZ1|bv3kM$l`69d+;Mig$`5efk%}rGKZB6R#z~j@kW@i z#U;%2Q};1bxqI*SmfKI}oHx1rr*!h<;@f%4b;DPODklE>thm~NEp=OUfY+(_U&=L9 zSTz_5P6co*xSHI;X2oD3!eEiD*s!f%oKJ18^zME7$IktEmUO#)!hGf>1|RiA4%M>< za4H-5kIA1Vf4PpZHEpv5rf)63tsuXo5Z+44xdV0aLKfjU?}{QRNhmHmqU zqI@7%!v8l<@)cHZ*}H$ysm+(!cAs1J>(ZxL|2%l#votN{Vtl8y^|Iloxz75>tJ!}pge85< z{UzNktt!sM*MDv=b4=nT!%uhD`mXsmEua6co1U->f9p5Xhk5&Uzg@gP_4~%tP3Ov) ze(wmpZ05FoXQj$XXO)=(0=wzHVKsue<(b zze`cWj3cuan7zHgsASo&cYpT2-9=m9np!eQZe-@+lwHuq-_l^bNC>%$7hZlj(LjFT{`$K{%hoO{YkR{l+Qv{&AoH4Askz zyYfBxWX&di;QHt6iOf6y^hp@7G#nOS;FD#T)A{#Sz&>3W=C7-h#J5k6ypjIZ+Jo1b z!9w`#tC?z5np2yrkGg$5$f4YHWx?0)A5PAAc{SFs%;KZ2y+q<+?WR2s(jRw-b1}?G q;NUoT!65I)#|)(=CXEe0S#7RA{2yk?wGx;%89ZJ6T-G@yGywoAGB;2F literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/tumbler_off.png.import b/themes_src/space_pixel/tumbler_off.png.import new file mode 100644 index 0000000..2765079 --- /dev/null +++ b/themes_src/space_pixel/tumbler_off.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wj7myrlifbs1" +path="res://.godot/imported/tumbler_off.png-96a63cec1ef37c5e90a974995670a828.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/tumbler_off.png" +dest_files=["res://.godot/imported/tumbler_off.png-96a63cec1ef37c5e90a974995670a828.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/tumbler_on.png b/themes_src/space_pixel/tumbler_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c915073a7c74af53e83a0afa5c597dc80ae67bed GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$8 zy{C&~NX4ADb8UkT8;G>bpLr!yQC0Nij;87z%%Oe^yy^=$)jf{NI?dPK!5!+g;D|WK zV@5-#X*sWdsuz~+KPL71`lYP-j~(W``Ci@m(6qjLwFBGJw5q8`rr5vE*GS@OG|01d@JN}F!3U36*IFXu1I8<_+q zekuBBKGF4-U3|cko0-kA%h%QARQlFS{ZKJ@KG~tdYDaZSFBFeSNagE%VDhL}Kd-YYKPdKe>D`0j_n)-)8H(Ls zV!u}UV0**uoOg2{Fin1^bl>(?$<_P6s-$cGeyA6o@ome4ynWSg7TfcFP)u0CZt9y{ zGP&K|u(H&EC8eF4G4}g%PDT+2GyS>TcX`?_`Mx?n?fRGHf(*_Le|#3)3|)AX`|ZAE zUz1N~|GMnJe&Q701=U<}jb*Y{4U?|i4E*+U+s}9Bu5Jr|%8XziD{c1p` z@G!DSa52chQ3d0fbMIMxT0LO>@b9P6iR+B|3?&a(4U#z&PWZfu?|ZhsH929uZyHD28U^w_pdeZ3&A5OSlS_n*^44$rjF6*2UngCyDIw=4E literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/tumbler_on.png.import b/themes_src/space_pixel/tumbler_on.png.import new file mode 100644 index 0000000..a580c70 --- /dev/null +++ b/themes_src/space_pixel/tumbler_on.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cf8mj6sqic26k" +path="res://.godot/imported/tumbler_on.png-ab3b980cd759105b5b5112e1cce17f34.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/tumbler_on.png" +dest_files=["res://.godot/imported/tumbler_on.png-ab3b980cd759105b5b5112e1cce17f34.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_баннер/frame1.png b/themes_src/space_pixel/Анимация_баннер/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..c30b61d0d5b4c97561ff0d4ccd8dec1f2d7c3014 GIT binary patch literal 11491 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_баннер/frame1.png.import b/themes_src/space_pixel/Анимация_баннер/frame1.png.import new file mode 100644 index 0000000..e05fe33 --- /dev/null +++ b/themes_src/space_pixel/Анимация_баннер/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckbtpvo2lyimh" +path="res://.godot/imported/frame1.png-b8f30ba7b9c8f85e19ebf6d35527eb21.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_баннер/frame1.png" +dest_files=["res://.godot/imported/frame1.png-b8f30ba7b9c8f85e19ebf6d35527eb21.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_баннер/frame2.png b/themes_src/space_pixel/Анимация_баннер/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..8480f12c5b52004df67b76acfb49b1f6991c1283 GIT binary patch literal 11294 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%0D`co;< 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_купюры/frame1.png.import b/themes_src/space_pixel/Анимация_купюры/frame1.png.import new file mode 100644 index 0000000..cc542c5 --- /dev/null +++ b/themes_src/space_pixel/Анимация_купюры/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x5elj45opd6j" +path="res://.godot/imported/frame1.png-9b5b99b6e97eaaf1346e9a92ee59a71c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_купюры/frame1.png" +dest_files=["res://.godot/imported/frame1.png-9b5b99b6e97eaaf1346e9a92ee59a71c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_купюры/frame2.png b/themes_src/space_pixel/Анимация_купюры/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a496b8648e46dab4f70a691d74cd74992552798 GIT binary patch literal 2588 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

-@nzigy{f(79x`q*Hy_51q;rF7C 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_купюры/frame4.png.import b/themes_src/space_pixel/Анимация_купюры/frame4.png.import new file mode 100644 index 0000000..7fea56d --- /dev/null +++ b/themes_src/space_pixel/Анимация_купюры/frame4.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwr625ogrr8dw" +path="res://.godot/imported/frame4.png-8362c5c223fe9c5fb7689ac556667750.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_купюры/frame4.png" +dest_files=["res://.godot/imported/frame4.png-8362c5c223fe9c5fb7689ac556667750.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_монеты/frame1.png b/themes_src/space_pixel/Анимация_монеты/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae61014d3d22325388523cd8f01847297e02737 GIT binary patch literal 2624 zcmcgu`#;nBAAf&lW=Kc}$K_Z#=*o2JNNg>)=tRCHB(rr;$gQHt*oNgs@e1B*a1(whyCYq7+qh!hr5pQS>Nrnqmw|^Uk4l#@TtF6DQxooW zD_1vB>tuWBQbj(x-|y0lpyh{a=LOx?GaI%>|^rI@g}uTL}jxe)Aij zXRh6r(D2DlHmBqdQ9#+G)ZM^VpZkVkf&>|!c;7Ic>6Udun6%|uILm58%ij#bA>)18 z_7Q*buJKH==-(1GIeK7FJ@654X*zS%+d&niQ8e-qxF3zlD%E2za&xn;>}DX?K`#Z^ zpm@or5_L1Od7TzW=2nyqzwg^JsI7H3Eyel(3}OcvldqI6hQNC`+fndxD3Z~dMt%{3 zkAUs0RvNa6Ea1|#Jx(PWl*9BuNvufH-c5GSL$GHrzcsa;?p^LsuWgmAtJcbvp1=1qyFG6;IT(NLHgA|$sUxX~}S z9feVzoz`)xD`68zAM?^Ptr-YF4F)$&`Ps5FVK2rD=lItn0&7?eAs92Wh`r(OK1VMP zQRTE+oL2$5&&1-!Gy^2K)$e<-Ct5FC6~gsT$Bc2s?XxZSI7U9}d{*P~Y~O_A12}NO zPoALD!bpOSriyBUSD!|PF>v<5XnZ(__S`|^B`jLb=stqj?1F`&-CJi*0QB9E~Hgda!aKXWEpEpKarGQ-dBeI)BE;yG2L zUE0t#v>GapnLy8GajuR&u4jb{V^&|YqflXbK(2`#G{2S<8T~}rw`aXEo%g)_ZzyGB za+&4ws-AGPl@wRqBK2Pp*a+ztG5@>N(^-X`HU%dw1BJD3WGlUytk~%;GkU$7VnJ_v z6bb`F@x|CpI4~J1M{RxUrC*hDP}igWSH5e})J&Esgf5;nCiA0+kC#00S2O`LIF_1e zk2N?3a%`8?A9GIh!Exppm=T+CQnSy|Ai<8%N6H8Hs*~irLvD7foQiD|o1OM7xf9840fAU#}n6=}ZB-D~edf zo01$?Q2HT@FS_vH;!jJH3z;*qc2p!~m@qhWspGJTa0MEAi9ll@_V+fhQWtPMc1V!S zboSo@zBQ1zP^(${tW`G2HJoC;6zC^j-?yA6cgMaPvrh}+UeLGb3_4-U11LtMTG5qK zx_?dtvy0>VhIO%K(GeFYr2B0hCj3mkWxf&%z zQ2VWh_v4G;!{K@DMyND0kNzgadMMq&X?m(XRs%2}j-I}d+@#Qwz^9un=tR@ojtF2m zH8BuTpiWhwBxQ&WA$;Zk{6u&NC*=zdP(RPXj$v=JnwdfISGX2N37B3j6$j8$w`R4d zmH1~PM5U+^XVyQuGS{qxorjk**yj4Lw(j0I!~I8%-&iRUIZ;Jorg4=tRtuz7)oSH5 zo4l!KO%`Ph{) zo+Qne90&53)GS`tGnSgwW>aGn{88&lF3dR zFgyI=hh=%;a9)$HW2s_Srnh1I z(;dP_8y8i7Ir-ZzT6iqRuIpz6uExi0&XS}-vsO8-JWY!eNeAK!>~`%fc7UN2okXQH z?SuUn^g&)j0n7qX-dtciP2V|{8_CNz_jtI$l(3Fr!HxZW;|BBF0rJ(B&0#7RFxL>g z5_0%Cb5K6Hwl`H1Y(3YBPqClUoex*tOqD0*?}KWyZ+YF9l8ZtI;9%1cWQ0$RXIBfS zZM=v%oS#nYO*$mIm92UaXm~fM74bg^imTa23=_Yo>t{W7R$QwS>He3+eSN?vloz?L k(uRD^mggU=v_E9(isG0iQPJ3vyd?xKj&2S$cErU00^Kik)c^nh literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_монеты/frame1.png.import b/themes_src/space_pixel/Анимация_монеты/frame1.png.import new file mode 100644 index 0000000..fd6d14d --- /dev/null +++ b/themes_src/space_pixel/Анимация_монеты/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3ejdo34aoybp" +path="res://.godot/imported/frame1.png-b3f7a82060722581a3eb237e1d6726e5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_монеты/frame1.png" +dest_files=["res://.godot/imported/frame1.png-b3f7a82060722581a3eb237e1d6726e5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_монеты/frame2.png b/themes_src/space_pixel/Анимация_монеты/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..7f98adec71bb9052cfc9fd1588a507f47e0e4d0c GIT binary patch literal 2592 zcmdT``BxI?8va01)EqM#Ev?bUQX4aI%Ux)ZY|^yMDN6;lj8sC)C368uoy>)t7Rfa6 zSZZQQNiHcNc3nzk7`bhOOJ**);ff+4gPwctpK#B)KYZu?p7)3EJ?D9!=Q&@7_wged zYIbMK#jh?qdOb%EA2@ZbV5-lO zvi%}N`HR!xVdU)=H9S;nY;pm8AUD99_xNa#A9s;TZY!$LOTV0Lp`J^z1=p`e%TEk1X(A=j6T-AG zC4~jplt@@Tz}hz9E^lIn&JMP!zpS(JO0LDZsHg~q0S$AV9D<4(fCqMM z0lXVSLj+M93Ls1~)qf8uL}#S|EH5@{kT?5%EXj&OI4AK+uABMxmd`5Q3^tA%5=D!D z^@ilRI#x;>$mxu2kY?IFrQ+?%Nog%X-{b5YC>%Wy9r1j}UiA&*+F;VdvgN+!q_1Sk z*KVj>TMe(z32I(A2oU*_4X0%OzNQ7+>xYH9DYqk0cEhKz3K9`wk++AoO-c<6+*mAY zCnhZ}4#>rwy-UQHp^w>Qj>#qq6Y%NNl+#BuHgRHPl-1Nv5cavuvwVvYPZBoAdIE%M zX0dnKZbL8@{EfIgKi*y)D152PaA*XZJd|jx-A3}SL;1~-mlP175D>trgz$<6*sC3T z(~qq)=Y$NI5fz5kbvedO-^l6Lf|AbON)T9^LrKr#h6Al2A_HI*b+VV1uo4)@B> z_YVwrcrC4WQw6wh7JIX#^pP=w^xGt!r6&=5Zd~0`EqhpPM_hsF0T>@Z9q1G?aIfng z$5hDLm-e$SjdHRZ&B~N2O#nICYT)8Y80fa`n>ItQ_L%myim(lCIHf5#2_#XZqLubz zz}rh4Jzy+I+L#ZhjKXelzF_fAT&sqPp^dM zEVpZ*ahX{%E#T4e`8$cSlYR(zh;0Tk3TAwm8$4+VP*UN!IIP`+eY`9{g_ntY(gAip zT(Zp^g1F+uV%815L%tbu2FC5dK}mY37JQ=$_ve9WIJp04*?J3lVU-F+AvCZN>WSLr z(wJ>xi3#|_*MA84c-%`4Yrb7KOGYQezF8+A)}==ne7Cy(ZTmht@x8zNd^pbyCF3gs zN|`~=jIMI+@75=8)&S&7z=itN(}8LXx&1hJmJ$KQ3T`#9Lz}@Fr7`NtpHv*kh!a2P z7R4o7=l;~tRPPEwB@8!$n8Y|*gCNnufmUe9bbv54hFyq!sPbXJ(Dp{*gXXS7<+MX2W#?OEG(>7=g8)spx-eWVKY zbREL>vlF|Dck@$*5_b4oM3##9ca;_4M{-?~2YrD7eT)S!)DdxdKyXrGXADY5?#v%E z2&>U)X8Nru8gG2k31`>A3Qlic(|wK7a|l$*qm9^mrU*hhue z6WP6(W0cM(KzxdSGht$E-3Vxs$NTb#!TLwd6ELk>bpv zkLt!?YvmoK*Y?X^cjW=A4`T9_J5IDt*obA8TELesFN@<}NGM72i|1lo$0~m4sx58~ zhtj@77+>$7TcD3OS81zxLI)KOK0zW|pWX!Smdvy+Wix3&YK!9$v*gjg-&4*Zg*;VY z>Sy~(m*V+U6;5(R_qdj+9@2lSg1e(MFV6f}hY-(vO=H2Jq!Yi%@z-Z&I$2LQ1Htwu z4{el;WM7<-com{B<%xBbdRXeUEO1t|x9Lc>B z+1n5wKdBj+FFR?YVwx~zIcou3xGNbE3^Uw|53`{yp37>GNUTxyA2%hijiTXE;VYSQqtA x%)apbUu*E|mRE=ia9{wY{olC${|5;TtC~}%3}yB3thK)&IO=x%aMeL9`5(u^dyN19 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_монеты/frame2.png.import b/themes_src/space_pixel/Анимация_монеты/frame2.png.import new file mode 100644 index 0000000..180b334 --- /dev/null +++ b/themes_src/space_pixel/Анимация_монеты/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbg7njgn5cha0" +path="res://.godot/imported/frame2.png-616817b8ba39553636d5e4c36305198a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_монеты/frame2.png" +dest_files=["res://.godot/imported/frame2.png-616817b8ba39553636d5e4c36305198a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_монеты/frame3.png b/themes_src/space_pixel/Анимация_монеты/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..01055c9978e715756af22cb91628624f9d90f0f3 GIT binary patch literal 2441 zcmc&$`#02E8{adgF=%QuopKCOB1O@gAqF$KQ!^yxGOi_KUL==rXqqnxCCzapxs%Fq zpW|SPGE{Opm1sIdGNg;-&J5XUbJ>Mrk5*Jw z1OT8N9c)|yfXTKnfI`ZQcjT`@GNW+T!7~Z~CG6UQfxH40S&ZOlbI2{OVDdeeg`>le z{pzo_2-z!{Wx<`1*c@q5j`2nmUCh^OmgWyz0K8bClf01aA0+IP*e^J?XB2x)=>Q zwSeYL0Qti~k^(^K{IibxH7Qc1X*SM$QbePa^CJ3)2eN^G9YIW7o$Wt#;gy+HS?+Ft z;DNEiFfZHuUPE-K0vswlPH^X4Tb}9JrRSIMMVKH?I906;(z@^BugXy$#hFc>&%Du{ z$$THo&t^2HaJZsg-Mv5`Ze@suhOSDq8&WtpFRNl|A|42X=7u9iN6Qz_s7oGp9|4$B z^5OfuTiQl@b$YjM6u&_sKmu<0o0hcRu5H!>k?gMus39#&?sdKCv&J&e0q?O9#z zOtloh`Z7PMv0~JWK`{IkLAwzU)*5IrcfdfSh#wtz%S&2Z1JftGDrF%+VO7l4hGU6D z$xQ6lCWb#6B+~w;#a&(exG8&9k zd}o}*gTBg2m@Fy<$NL`BeGxO*(OE@ucw1`n$;}^i7iPF5bRlDn5}zYLhe(>meZg53 zEfyP?uZ(I)1Izqp6rMa+0P$b8awW@mI!|1B^z)SCTRf~y(^|$(+YU_|EWjKABtsZz zM*zhCI8i#99SMT*=?oTk_G#aS72gy)IY>sDEkXRP&aTYf1jk(*7iKM=z`iX)uHk(p zdi7$?Nm_5|qkXmAMJ3B*!3kPNCljGPMMD-Eyu^ zF5qRz4gAGMp~Z(fLbQ86-<{Grd-1Tw2B%mfAVc(erRuVYdM=A`zO}=<^_iF`6})E2 z)0hZSacs=nOrU#i$}e6e^x$igjF~KX)|Yp@1Wq#}yg>&zxrn;D{1u=_ti_xQs%P>u ziy}?eln7apMK6gvZUUdXgO8BDbQY`@aqh@=*WIYb~x^4BhGf0?;OGDb{? z8e%3|HuYGbOYUSh#*S&NEbp56b>(pxtb6DujG>w;>E-LAwbNx1o$}d%o>Rdx0_7Z< z0&BUhf&x~TFVip$n*^$US}k%*o$E;G@? zubr4ylYVMnYv!UTvWWW*`<3l1=y}&TZjPT@LkAfBO4#~==1f0qNh0uQ!lHjVbhhWD zChGFRyK8kl`jAfH@H71#8)VSwfPt%QJ5Qt&AhFZ%5QPGq%&ppnZ4o4+RG~-v=CxO5 zP5Ve&2VWYmlG=Q8;&^N=ff|udg$~3i z!`ikjJsCcP0oJh)HgRy%11^G;)BD#9gQ7e@S!brUJh>#LDPxjs@z6s9++Bm4vi%&ky3fqK|sXE7!$#FP)!<@bMIj9zYP-X;y#cQI``oHl8M#6C zwN+$oP$ju3)tEz9%(`KZ3@T&#*{xjp{*B$5n9s^6x4=nh-!-jy^Se&}e|`NQ9VS#h ai40ht0|U7qE0$!l6>zkr*wkA2C;bh=e*G{2 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_монеты/frame3.png.import b/themes_src/space_pixel/Анимация_монеты/frame3.png.import new file mode 100644 index 0000000..26bbba2 --- /dev/null +++ b/themes_src/space_pixel/Анимация_монеты/frame3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jsgeegi20wkm" +path="res://.godot/imported/frame3.png-d11ea3bdf56aad42980956eb74c6d924.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_монеты/frame3.png" +dest_files=["res://.godot/imported/frame3.png-d11ea3bdf56aad42980956eb74c6d924.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_оплата_картой/Frame1.png b/themes_src/space_pixel/Анимация_оплата_картой/Frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..e90e0a9fac1a64f451e2d5389f5b1d3d83bde737 GIT binary patch literal 3895 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png.import b/themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png.import new file mode 100644 index 0000000..19208e9 --- /dev/null +++ b/themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cx1h1ia34nor5" +path="res://.godot/imported/frame1.png-4d13fb815ade35fc1f4ea39792ed8c7e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_оплата_непрошла/frame1.png" +dest_files=["res://.godot/imported/frame1.png-4d13fb815ade35fc1f4ea39792ed8c7e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png b/themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..74f8b4a845130ac3d520508021ac2331fd514a2c GIT binary patch literal 3415 zcmd^CdsLI>9e$Hw0tORwl}ltMYA4h|Wq^!ZxKt=`I0%lFLXj8*MGhdBf)Xw!1cjj% zm}|Wq3~u9cXo zzy^L^o_|a)nHn5S=K5kh4n}?-=4kL@7%?Vb?ndA(i~Np^FfY~h-4DiG-2DOcxPT@d zZ_Tm3_<64!gMTbthJxDVd$J7xh*Yy0y$=A+7XXi904O*J0G_H%Q1t-NGXOw;%l`^s zK0$;OBy;Q^@6Ej?B>ngjBhYVRhn?HHwuT){JQ_5wqz`b@wqd9)e3465DS3u~EnSDy zw4)AE*m84h{$;hlN!^D74qgL-_)@6F7z3enX*G1N46qnzh8#h!jdFk)6n zmb0pn$E~20w1|PpQ9aMXBSjX9C(n&_bvXjW1wy7}Nu?09QMC)@?$w3E3o~WtA>pHY zDrWwR?DW{PrG3weZ38$j$TJ*K0=bhty*EEKqg5U(bq%~tKw8aiCo5)Ce95cXTzaNL zG!jTEqO(=<)h!h+@Zr0qiu#!0UsRu+>AK|3rTDh6djQH_yqocFbqS1L z*8-{nI|=yEXg@a3nmB?znH|L5)x=`Os8sugIHUEGlGxjCEIkbxwk+BVKY^7uCO5Eq z2t{f>tD(T=#}NKOl>SK19gW26!I2Zco_|0J?IGd}@iQ?EMgBkiMkHZj0i}7@+(Jwp zT!a9qyx^_N3!S+X0j{qIm&cfb&=5B%IJ^=FOtMvZ~U$?nF*(FEG2DVLE+uBk8xmYNRr3vrSb8-SWsY@H?7NUCNAZ||0hnK%5(JDWo zpB;Rwv^yOoPIMiN=(5|~x@uxI|!wJOtQWCA5~ND^}!Ya=lBBhf+yHTMcXcN4$O6@ zJeQ?cw2n!g?at=Dgc1uXzsN4I*t@;-87fq@`JI}W?gAH5=1Md36%FoUQ7zVgP$*oi zY6|SmUUk}$v<*s0SSlX#ZJEn3zI><4`sXNAiOj0GBQADP#M?uytoca|jYFYcK9TN`jR62L2Nv0EQW^CzyQA(X7RpQZcVu+!FrN0I97=4-FNdS$h z;UWb|+`+MrINjgyqH#aoVzoS`BXj&waH0u*E}ra=GM09FN}588$+xlU&9X|>{6eCioH^9vgHX-U>3zb^B?;;5aHF22&uQ9L^6WO6b{q$g~luC{B4P{Y8zk)US4na3VP9JUBOt0~L=v9w9H z&-|%wStQjO~pxSm&j8KJ7b`nHA<+#eX7}3A&!N7A_CwX;%Apn)tCB zZu~Mww1ibIWj{bd<=5SnZp!D0S1?SLm(gK-t2#5;- zrGhl3yue-w3-?0Iq#k=yY>b$2L%x|jcRxdI8;w4$Li%(31AD(w8064U`aH!Ct;j%y zLQp_f9Q!9h;&L(pS!hjV4kTnhD;b!Jxy^rDFbT@K10+Mub^=TzoG30>^*5KaE45_UBAt42~}78j>*l%p0a!*D2Ww7fm{0NtOkh4CelyAm&ZZnDNb7o5hUgNiF``dMXq z;8R2{E#ovL=c9DF)5@Z)m^Iy?+W%{13LJBT;fSznIc_MeTT_sf-nuP=_iy%G@}!0< z;s>Jw)LK`$ffboloM}3~t6O7iHI!#3nC~&ugCopl!dBo4)34O@RYN_v&AG%pIP2&w zwB*Rzrl}OX(s-BXl|SH|-r?E488II}@yo0l(W=hD*i&d!p}oE1Lx#Y&J^K_&W;R}- zU0sVyW->nAwMhVJj8ZQY4?FXHU0d_LyJ+Keu^+8(^f3nGIw=rbhh<|8Wo^~kTZATo z4IvLV!x4y>GW6eHO{e$TZAdj7P}hxk9r5mN`InjW{|6vstis|r*rhLT&IhahDFHw4 L171}h5vl(Gvcu5^ literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png.import b/themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png.import new file mode 100644 index 0000000..36e76e5 --- /dev/null +++ b/themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwrt2m6xvxpkl" +path="res://.godot/imported/frame2.png-eb666079e1bcefc311605b27dee35558.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_оплата_непрошла/frame2.png" +dest_files=["res://.godot/imported/frame2.png-eb666079e1bcefc311605b27dee35558.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png b/themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..8e46e2a3a70bd51dcee43b8f90173852f51efb5b GIT binary patch literal 3355 zcmeHKX;72r7Jjpk1QQ7=WCCJBtgXF7t%6p8$Ra9wRlt^^EJC1z0>fee(I87chy@)h zu|-7`S&BMyZ$uQP$RZGA6k4>QE^Gk_1PKy0$tFvn2{kl?I^%Tiy>ox`N9M~+-tRr< zJm);mb8^PR&2{M#^CbX)rF-}6`~m>D`YRk@Q0j+_`Fv9SFl6lUi3I?=Li2%vD>*~} za8LH`boONC40rt+-MO3KbnxpYpKXTX0(`%amxFM;oSw8s1Uo(w6V&m1V9^U6Wgt~-*$kk?amO$m}CVGh+e*oLTL+qcby`@Sl+xNNw2@buYL-vW8ZIf4$ zi1pEr^(PevE2%cE4|TQZ-}GF;Ej@7JXnb|?X#IUc`n12jAe{edQR-&!K5s1B!+oW( zP2!fclmIlV_0tk6?yw8TBevYu3I=QE_3hFa`-YwG%IA5=X`|VOEOX zQFG@g*gM+X17!h(+CkM;u;HOT%8kZC$Nu{oNt^S&3Hh#bYQLCuOH+&~ zROBBNp6?pn=CuE!d=E$ySy?NaqN0}FA8g^>C}ho!w%U4`=Jv`}Ygztcn?|qN z;=8)}Ynk15kVj{P!{xGcbXT^5t_m^89f`?vHd3}L^(&(~EK3?R@WMw4R=7|iURp)5J z-g>zC?iq`(>GKe2q=$qw=`C>Jb)=)C{k`5NJMAd%j`0vK`A*E){GycB!`h6rRcZ99 zaRam>wj4ip%m`n(j`}_ki$Kt%#~uAt5bPeNgTyp?Z%Ey%=cLdT#+fPa#*-$nhlI=O z$h1$G79akyu8!uQw*CAQ%WWF*!&(D7${6vl-J&nop;yEc1L5V@!>)|5g1T#lPp$_p z2}!k6UrK52RRQ}>>vrhFq`e->jT_(~SRnVf$9b33nqTy%_`|NzEnPq9|J)5~y%HA| z_k4ddtaA37q^UB=j{r9;SBUr&T(n*o; zs)+=g{*>j@Gird_z`-_ah? zY4^6bALg8A;=uUs1r|N~ZM_!t7%U_iKhX0#60BR*n~Pnww_DJ#6th1{^A8ORj_uElBAIK;1pIqopeo-t`$0l@rP6?Y6}LMJ&}j`S?c0 zYbEhaQ1M7>#Bio+_pFo=zks%yjR6OHO4|{47PhXTVnpKOeokh$e4d#V2D}O*yd5>6 zhBXr|ic9y$Kr70Xo<&venCY=eK`m=YN#9z1`^&1QTeGc;MP)N@CEbn+g}948a)u@D zC+OHxFbayk7SFlYQ!K?BoLpM5O$&SDdT51TM`~&Lt}%iivY_h4(V(WhqU1m1;ehmh z)Q!uraFX|k~5pq%HB63lj2xzt!9&L_0<-!?N1-Eg?3*^$W(8@U+!{*;ZuO_pqKlWDFfPQU| zU_u@%mCrsq1adL}#BCqH`lhH`a(V!K{?4O?b~vMwv=oP4BxoR!j&atrk!6Y`zL%q7 z4G=!gAlBH7p|b+jyXxHLSYhBK=y2ZX!WLOSM{_aYcNgMgcHp>IRy?(t3Ub)(qxS-|L{ZmJiO%4`#U87^AlH-*{l=?Vunt&S$CU+`2}@N zIJwzC;hZq3mkKWK@$e>E=w>SKm~d!&iWV(suf{yAkr;VToheRQ7q`g1 zwdNAM(o(Yy>1}J;Up20_DDr<#LM^q${qI6BUr(&`+-`*zuCt@5|LuUiyWDo(-VvDk E8$O+!VE_OC literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png.import b/themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png.import new file mode 100644 index 0000000..84b928c --- /dev/null +++ b/themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ci2nxj1be04l5" +path="res://.godot/imported/frame3.png-acbda80a71ccec1e98623dc6ac031e82.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Анимация_оплата_непрошла/frame3.png" +dest_files=["res://.godot/imported/frame3.png-acbda80a71ccec1e98623dc6ac031e82.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Анимация_оплата_прошла/frame1.png b/themes_src/space_pixel/Анимация_оплата_прошла/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..4af13f059346e5b5de93ca7cae76ec43a3c7305e GIT binary patch literal 3500 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 bp%P3+&N+AQ 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Пролетающие_нло/frame1.png.import b/themes_src/space_pixel/Пролетающие_нло/frame1.png.import new file mode 100644 index 0000000..9e42d4c --- /dev/null +++ b/themes_src/space_pixel/Пролетающие_нло/frame1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bymm2ddyjs42k" +path="res://.godot/imported/frame1.png-fa0ab81b81fe005da87c1db64c1f5a83.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Пролетающие_нло/frame1.png" +dest_files=["res://.godot/imported/frame1.png-fa0ab81b81fe005da87c1db64c1f5a83.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Пролетающие_нло/frame2.png b/themes_src/space_pixel/Пролетающие_нло/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..5839c12f6198766613f547c081f3f5fd5921185b GIT binary patch literal 2634 zcmeHJi#HVN7XQZEWN;9J@@S=dj^t4yS6&Grn#GJq$|I2!kw_Rb9*0O&$U7v@Nn<$P z%y7EMb4ZhMJfkti7%>yg7~@Xou66&3d-qykz3!V`G9FYI%5KveQ7u@me&s!m*i`VA}p$b!K;)_?W z$Iu}`2ZAr@(z_eq zYOj4CV+d@dfP?lCzUCR*KhHAVj|f~T=3FD>LkdD+XwVZT0z~A2>_uRy4*|XZPe58h zV$AMFI}T`2A43Z|(`s1=#Gl%^Yt^M3A^-%sy-i}_XNQw|!5uh{n)`%N9D?+{skTB2SJR>Q%BL@@m z=bgM4B&OMLoo~Hd+bflKk;f~0bMNUO(!C^M_+)?hYyf$os?hhn^hptq?#UXFwSmc% zP`msi?vQ@-<%N$!J7EDDd0q*c)CuGe?@i|1H|$YuAQ5Fq@g~;SMVKQ38u(>n78nk5 z*Avh0c4*{3B$yV?!3Q!=14jY zc&pKk_%x2it|23GKLi#zm2$RUI~kG+N-ynmSlfL%{aeMyM|KWFlM!4cVqm2SR@!{= zlCzq-Snrw-rod?;JA2@l$MLICP;5wU&(`;jXYF`SatC4eu1C|?vn_01vggG(W1QPT z%Ng6d{N~M& z#J@QuNiC=GQXV94dL=UgQAm(O#kGd-E|r=jkgJRIk)~wLt8`m>fOx0Z}%{dkj1@CHg5}Tpjtk7-u0+==@{- zJ!`7_hUdZ8C?V^MQcx@mDMZ`h-LnSz!4+3J_&CMf^Qj3$t^lv=ZrJbJyfhL{H$G3u zH>rFF;v3B}I>isEkIS<5QTF%;P%-3(bUS8KyttSBs@4e^&2*n?x%_o@rvfl#|5&r2 zx+rD_smh_vBIb=dJvOv(&hyg>e;6u4_RHyS)bCy-4fz>$o~@*T7qO|%EIVC=QQ z#O$;_Kd;4v8ulFy99WvJUJKyYS@5~BZjCqY;k%!Dud9pe5;m=GW~Q%g7R^T! zS~`Y;Z4j52OS#fbzk4E`wxTA6Nkw~M-|0!yW0W zjgh1z$DAWt2uluYW(w*VuckJ>bIKj5cyFXwmVEqN{_i8 zGIDH(IX}&vujoC-lm4S)s8J4Hr}AsKw?-LnV>Ic+-_*Q!@Z|I`)>^yvr@)EdRo+TL zk7Ass;@y_jg`^rf9OUgyM--P?7L`bd%aX0S9!R2ItU8qxDhoj!L0N3^NP zO>_=)^`HgO9o$7huQUpxV>D(fBS4$7xfoa1&6719$*h;FiQY?LsV^|mt)DViV4=4b z?&;Li+oT{D406*JALRMGW&t?sT2Y!AM#*&Kq_<5tX z)j~QvcA{mVODgG=hHqhTDsXe34vEbDZGv?J&bBS9t$*{ZVYl+d@*Oe+t=5##%pf*v_GI-tYNWF+qh}C_8B8f^MmHY-IZp z7a3jBREv{~Vbt?kXq@lytQ==xd2l6xcFYvpWk+DY;DGDRqpl`0LBoQ-qFF`g(2(xiq+?p@BZ+1$HB>(^b literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Пролетающие_нло/frame2.png.import b/themes_src/space_pixel/Пролетающие_нло/frame2.png.import new file mode 100644 index 0000000..f3f9c1e --- /dev/null +++ b/themes_src/space_pixel/Пролетающие_нло/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c74gd56itfjr8" +path="res://.godot/imported/frame2.png-a41ff1d43384dcccf823cf8dfc99c57e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Пролетающие_нло/frame2.png" +dest_files=["res://.godot/imported/frame2.png-a41ff1d43384dcccf823cf8dfc99c57e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Пролетающие_нло_большие/frame1.png b/themes_src/space_pixel/Пролетающие_нло_большие/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..67ecfce2340c2ed4b4dadc541eb9ab5931b699aa GIT binary patch literal 26589 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

c1e_Mbw@9@HhyIO$a|j>Y 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/Пролетающие_нло_большие/frame2.png.import b/themes_src/space_pixel/Пролетающие_нло_большие/frame2.png.import new file mode 100644 index 0000000..ad8348d --- /dev/null +++ b/themes_src/space_pixel/Пролетающие_нло_большие/frame2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg3ppag3ftjda" +path="res://.godot/imported/frame2.png-abaaada45d890cf766394b757647dbd2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/Пролетающие_нло_большие/frame2.png" +dest_files=["res://.godot/imported/frame2.png-abaaada45d890cf766394b757647dbd2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/Цвета.txt b/themes_src/space_pixel/Цвета.txt new file mode 100644 index 0000000..e69de29 diff --git a/themes_src/space_pixel/Шрифты/VCR OSD Mono Cyr.ttf b/themes_src/space_pixel/Шрифты/VCR OSD Mono Cyr.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b621e802071a24312be808fb3f773b30132beea0 GIT binary patch literal 30764 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 + if ($LASTEXITCODE -ne 0 -or $godotVersion -notmatch '^4\.7(\.|$)') { + throw "A real Godot 4.7 executable is required; the godot-ai MCP server is not Godot. Found: '$godotVersion'." + } + + return $candidate +} diff --git a/tools/Select-Theme.ps1 b/tools/Select-Theme.ps1 new file mode 100644 index 0000000..23c2fa5 --- /dev/null +++ b/tools/Select-Theme.ps1 @@ -0,0 +1,67 @@ +param( + [string]$ThemeId = "space-pixel", + [string]$ThemeSource = "" +) + +$ErrorActionPreference = "Stop" +$projectRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$themesRoot = Join-Path $projectRoot "themes" + +if (Test-Path -LiteralPath $themesRoot) { + foreach ($themeDirectory in Get-ChildItem -LiteralPath $themesRoot -Directory) { + $legacyIgnore = Join-Path $themeDirectory.FullName ".gdignore" + if (Test-Path -LiteralPath $legacyIgnore) { + Remove-Item -LiteralPath $legacyIgnore -Force + Write-Host "Removed legacy theme ignore: $legacyIgnore" + } + } +} + +if ([string]::IsNullOrWhiteSpace($ThemeSource)) { + $themeRoot = Join-Path $projectRoot ("themes\" + $ThemeId) +} else { + $themeRoot = (Resolve-Path -LiteralPath $ThemeSource).Path +} + +$packageRoot = if (Test-Path -LiteralPath (Join-Path $themeRoot "package\manifest.json")) { + Join-Path $themeRoot "package" +} elseif (Test-Path -LiteralPath (Join-Path $themeRoot "manifest.json")) { + $themeRoot +} else { + throw "Theme source must contain package\manifest.json or manifest.json: $themeRoot" +} +$packageRoot = [System.IO.Path]::GetFullPath($packageRoot) + +$manifest = Get-Content -LiteralPath (Join-Path $packageRoot "manifest.json") -Raw -Encoding UTF8 | ConvertFrom-Json +if ($manifest.Format -ne "ExchangerThemeDlc") { + throw "Unsupported manifest Format '$($manifest.Format)'." +} +if ($manifest.FormatVersion -ne 2) { + throw "Full-scene themes require manifest FormatVersion 2." +} +if (-not [string]::IsNullOrWhiteSpace($ThemeId) -and $manifest.ThemeId -ne $ThemeId) { + throw "ThemeId '$($manifest.ThemeId)' does not match selected id '$ThemeId'." +} + +$buildDirectory = Join-Path $projectRoot "build" +New-Item -ItemType Directory -Force -Path $buildDirectory | Out-Null +$utf8WithoutBom = [System.Text.UTF8Encoding]::new($false) +$buildIgnorePath = Join-Path $buildDirectory ".gdignore" +if (-not (Test-Path -LiteralPath $buildIgnorePath)) { + [System.IO.File]::WriteAllText( + $buildIgnorePath, + "# Generated builds and isolated export workspaces are not editor resources." + [Environment]::NewLine, + $utf8WithoutBom + ) +} +$state = [ordered]@{ + ThemeId = [string]$manifest.ThemeId + DisplayName = [string]$manifest.DisplayName + Source = [System.IO.Path]::GetFullPath($themeRoot) + Package = $packageRoot + ActivatedAtUtc = [DateTime]::UtcNow.ToString("o") +} +$stateJson = $state | ConvertTo-Json +[System.IO.File]::WriteAllText((Join-Path $buildDirectory "active-theme.json"), $stateJson + [Environment]::NewLine, $utf8WithoutBom) + +Write-Host "Theme '$($manifest.ThemeId)' selected from $packageRoot" diff --git a/tools/Sync-HostBindingContract.ps1 b/tools/Sync-HostBindingContract.ps1 new file mode 100644 index 0000000..83283a6 --- /dev/null +++ b/tools/Sync-HostBindingContract.ps1 @@ -0,0 +1,305 @@ +param( + [string]$HostProject = (Join-Path $PSScriptRoot "..\..\exchanger"), + [string]$OutputPath = (Join-Path $PSScriptRoot "..\contracts\screen_bindings.v2.json"), + [switch]$Check +) + +$ErrorActionPreference = "Stop" +$hostRoot = (Resolve-Path -LiteralPath $HostProject).Path +$screenDefinitions = @( + [ordered]@{ Directory = "HomeScreen"; Key = "home"; Pascal = "Home" }, + [ordered]@{ Directory = "CashPaymentScreen"; Key = "cash_payment"; Pascal = "CashPayment" }, + [ordered]@{ Directory = "CardAmountScreen"; Key = "card_amount"; Pascal = "CardAmount" }, + [ordered]@{ Directory = "CardCustomAmountScreen"; Key = "card_custom_amount"; Pascal = "CardCustomAmount" }, + [ordered]@{ Directory = "CardTerminalScreen"; Key = "card_terminal"; Pascal = "CardTerminal" }, + [ordered]@{ Directory = "SuccessScreen"; Key = "success"; Pascal = "Success" }, + [ordered]@{ Directory = "ErrorScreen"; Key = "error"; Pascal = "Error" }, + [ordered]@{ Directory = "ServiceAccessScreen"; Key = "service_access"; Pascal = "ServiceAccess" }, + [ordered]@{ Directory = "SettingsScreen"; Key = "settings"; Pascal = "Settings" } +) + +# Эти готовые узлы появились после фиксации immutable-каталога v2. Host использует +# их напрямую и Builder валидирует отдельно, поэтому буквальные GetNode-пути не +# должны незаметно расширять contracts/screen_bindings.v2.json. +$supplementalRuntimeBindingIds = @( + "home.scroll.content.advertisement_panel", + "home.scroll.content.stock_status.meter.empty", + "home.scroll.content.stock_status.meter.low", + "home.scroll.content.stock_status.meter.enough", + "home.scroll.content.stock_status.meter.much", + "home.scroll.content.stock_status.approximate_count", + "card_amount.content.reward_panel.content.bonus", + "cash_payment.content.banner_text", + "cash_payment.content.top_bar.home_navigation_button", + "card_amount.content.top_bar.home_navigation_button", + "card_custom_amount.content.top_bar.home_navigation_button", + "card_terminal.content.top_bar.home_navigation_button", + "success.content.home_navigation_button", + "error.content.home_navigation_button", + "service_access.content.home_navigation_button", + "settings.footer", + "settings.footer.save_and_exit_button", + "settings.scroll.content.footer_clearance", + "settings.scroll.content.service_inventory_panel.margin.content.description", + "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled", + "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled", + "settings.scroll.content.menu_visibility_panel", + "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status", + "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character", + "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block", + "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet", + "settings.scroll.content.advertisement_poster_panel.margin.content.select_button", + "settings.scroll.content.animated_banner_texts_panel" +) + +function Convert-ToSnakeCase([string]$Value) { + return [regex]::Replace($Value, '(?<=[a-z0-9])([A-Z])', '_$1').ToLowerInvariant() +} + +function Convert-ToBindingId([string]$ScreenKey, [string]$FallbackPath) { + $relative = $FallbackPath.Substring("SafeMargin/".Length) + $segments = $relative.Split('/') | ForEach-Object { Convert-ToSnakeCase $_ } + return $ScreenKey + "." + ($segments -join ".") +} + +function Convert-ToGodotType([string]$CodeType) { + switch ($CodeType) { + "AdvertisementPlayerControl" { return "Control" } + "ConnectionStatusControl" { return "Control" } + "StockStatusControl" { return "Control" } + default { return $CodeType } + } +} + +function Add-Binding( + [System.Collections.Specialized.OrderedDictionary]$Bindings, + [string]$Id, + [string]$Type, + [string]$FallbackPath +) { + $Bindings[$Id] = [ordered]@{ + Id = $Id + Types = @($Type) + Required = $true + FallbackPath = $FallbackPath + } +} + +$screens = @() +foreach ($definition in $screenDefinitions) { + $sourcePath = Join-Path $hostRoot ("src\scenes\{0}\{0}.cs" -f $definition.Directory) + if (-not (Test-Path -LiteralPath $sourcePath)) { + throw "Host screen source is missing: $sourcePath" + } + $source = Get-Content -LiteralPath $sourcePath -Raw + $matches = [regex]::Matches( + $source, + 'GetNode(?:<(?[^>]+)>)?\("(?SafeMargin/[^"]+)"\)' + ) + $bindings = [ordered]@{} + foreach ($match in $matches) { + $fallbackPath = $match.Groups["path"].Value + $bindingId = Convert-ToBindingId $definition.Key $fallbackPath + $codeType = $match.Groups["type"].Value + if ([string]::IsNullOrWhiteSpace($codeType)) { + $codeType = "Node" + } + $bindings[$bindingId] = [ordered]@{ + Id = $bindingId + Types = @((Convert-ToGodotType $codeType)) + Required = $true + FallbackPath = $fallbackPath + } + } + + if ($definition.Key -eq "card_custom_amount" -or $definition.Key -eq "service_access") { + for ($digit = 0; $digit -le 9; $digit++) { + $fallbackPath = if ($definition.Key -eq "card_custom_amount") { + "SafeMargin/Content/KeypadPanel/Content/Keypad/Digit$digit" + } else { + "SafeMargin/Content/AccessPanel/Fields/Keypad/Digit$digit" + } + $bindingId = Convert-ToBindingId $definition.Key $fallbackPath + $bindings[$bindingId] = [ordered]@{ + Id = $bindingId + Types = @("Button") + Required = $true + FallbackPath = $fallbackPath + } + } + } + + if ($definition.Key -eq "home") { + Add-Binding $bindings "home.scroll.content.footer.margin.content.connection_status" "Control" "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus" + Add-Binding $bindings "home.scroll.content.stock_status.state" "Label" "SafeMargin/Scroll/Content/StockStatus/Margin/Content/State" + Add-Binding $bindings "home.scroll.content.footer.margin.content.connection_status.label" "Label" "SafeMargin/Scroll/Content/Footer/Margin/Content/ConnectionStatus/Panel/Margin/Label" + Add-Binding $bindings "home.scroll.content.advertisement_panel.layer.content" "Control" "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content" + Add-Binding $bindings "home.scroll.content.advertisement_panel.layer.content.poster" "TextureRect" "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/Poster" + Add-Binding $bindings "home.scroll.content.advertisement_panel.layer.content.video_player" "VideoStreamPlayer" "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/VideoPlayer" + Add-Binding $bindings "home.scroll.content.advertisement_panel.layer.content.fallback_label" "Label" "SafeMargin/Scroll/Content/AdvertisementPanel/Layer/Content/FallbackLabel" + } + + if ($definition.Key -eq "card_amount") { + for ($index = 0; $index -lt 16; $index++) { + $suffix = $index.ToString("00") + Add-Binding $bindings "card_amount.content.amount_panel.margin.content.preset_grid.slot_$suffix" "Button" "SafeMargin/Content/AmountPanel/Margin/Content/PresetGrid/PresetSlot$suffix" + } + } + + if ($definition.Key -eq "settings") { + Add-Binding $bindings "settings.scroll.content.section_tabs.service_button" "Button" "SafeMargin/Scroll/Content/SectionTabs/ServiceButton" + Add-Binding $bindings "settings.scroll.content.service_inventory_panel" "Control" "SafeMargin/Scroll/Content/ServiceInventoryPanel" + Add-Binding $bindings "settings.scroll.content.service_inventory_panel.margin.content.count" "Label" "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Count" + Add-Binding $bindings "settings.scroll.content.service_inventory_panel.margin.content.recount_button" "Button" "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/RecountButton" + Add-Binding $bindings "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button" "Button" "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/ManualAddButton" + Add-Binding $bindings "settings.scroll.content.service_inventory_panel.margin.content.status" "Label" "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Status" + Add-Binding $bindings "settings.service_dialog_overlay" "Control" "SafeMargin/ServiceDialogOverlay" + Add-Binding $bindings "settings.service_dialog_overlay.dialog.margin.content.title" "Label" "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Title" + Add-Binding $bindings "settings.service_dialog_overlay.dialog.margin.content.description" "Label" "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Description" + Add-Binding $bindings "settings.service_dialog_overlay.dialog.margin.content.amount" "SpinBox" "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Amount" + Add-Binding $bindings "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button" "Button" "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/CancelButton" + Add-Binding $bindings "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button" "Button" "SafeMargin/ServiceDialogOverlay/Dialog/Margin/Content/Buttons/ConfirmButton" + + for ($index = 0; $index -lt 33; $index++) { + $suffix = $index.ToString("00") + $row = if ($index -lt 12) { 0 } elseif ($index -lt 23) { 1 } else { 2 } + Add-Binding $bindings "settings.keyboard_overlay.text_keyboard.content.letter_rows.row$row.key_$suffix" "Button" "SafeMargin/KeyboardOverlay/TextKeyboard/Content/LetterRows/Row$row/Key_$suffix" + } + + foreach ($action in @( + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.header.hide_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/Header/HideButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.language_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/LanguageButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.shift_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/ShiftButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.symbols_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/SymbolsButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.primary_actions.backspace_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/PrimaryActions/BackspaceButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_left_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretLeftButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.caret_right_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/CaretRightButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.clear_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/ClearButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.text_keyboard.content.secondary_actions.space_button"; Path = "SafeMargin/KeyboardOverlay/TextKeyboard/Content/SecondaryActions/SpaceButton" } + )) { + Add-Binding $bindings $action.Id "Button" $action.Path + } + + for ($digit = 0; $digit -le 9; $digit++) { + Add-Binding $bindings "settings.keyboard_overlay.numeric_keyboard.content.grid.digit$digit" "Button" "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/Digit$digit" + } + foreach ($action in @( + [ordered]@{ Id = "settings.keyboard_overlay.numeric_keyboard.content.header.hide_button"; Path = "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Header/HideButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.numeric_keyboard.content.grid.clear_button"; Path = "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/ClearButton" }, + [ordered]@{ Id = "settings.keyboard_overlay.numeric_keyboard.content.grid.backspace_button"; Path = "SafeMargin/KeyboardOverlay/NumericKeyboard/Content/Grid/BackspaceButton" } + )) { + Add-Binding $bindings $action.Id "Button" $action.Path + } + + Add-Binding $bindings "settings.scroll.content.bonus_panel.margin.content.rows.empty_state" "Label" "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/EmptyState" + for ($index = 0; $index -lt 16; $index++) { + $suffix = $index.ToString("00") + $id = "settings.scroll.content.bonus_panel.margin.content.rows.slot_$suffix" + $path = "SafeMargin/Scroll/Content/BonusPanel/Margin/Content/Rows/Slot$suffix" + Add-Binding $bindings $id "Control" $path + Add-Binding $bindings "$id.threshold" "SpinBox" "$path/Row/Threshold" + Add-Binding $bindings "$id.bonus" "SpinBox" "$path/Row/Bonus" + Add-Binding $bindings "$id.remove_button" "Button" "$path/Row/RemoveButton" + Add-Binding $bindings "$id.error" "Label" "$path/Error" + } + + Add-Binding $bindings "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state" "Label" "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/EmptyState" + for ($index = 0; $index -lt 16; $index++) { + $suffix = $index.ToString("00") + $id = "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_$suffix" + $path = "SafeMargin/Scroll/Content/CardOptionsPanel/Margin/Content/PresetRows/Slot$suffix" + Add-Binding $bindings $id "Control" $path + Add-Binding $bindings "$id.amount" "SpinBox" "$path/Row/Amount" + Add-Binding $bindings "$id.remove_button" "Button" "$path/Row/RemoveButton" + Add-Binding $bindings "$id.error" "Label" "$path/Error" + } + + Add-Binding $bindings "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state" "Label" "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/EmptyState" + for ($index = 0; $index -lt 12; $index++) { + $suffix = $index.ToString("00") + $id = "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_$suffix" + $path = "SafeMargin/Scroll/Content/AdvertisementPlaylistPanel/Margin/Content/Rows/Slot$suffix" + Add-Binding $bindings $id "Control" $path + Add-Binding $bindings "$id.path" "LineEdit" "$path/Row/Path" + Add-Binding $bindings "$id.remove_button" "Button" "$path/Row/RemoveButton" + Add-Binding $bindings "$id.error" "Label" "$path/Error" + } + } + + foreach ($supplementalBindingId in $supplementalRuntimeBindingIds) { + if ($bindings.Contains($supplementalBindingId)) { + $bindings.Remove($supplementalBindingId) + } + } + + $screens += [ordered]@{ + BindingId = "screen.$($definition.Key)" + Key = $definition.Key + RootName = "ThemeScreen_$($definition.Pascal)" + Path = "res://exchanger_theme_dlc/scenes/screen_$($definition.Key).tscn" + Bindings = @($bindings.Values | Sort-Object Id) + } +} + +$catalog = [ordered]@{ + Format = "ExchangerThemeBindingContract" + Version = 2 + ScreenMetadataKey = "exchanger_screen_binding_id" + ElementMetadataKey = "exchanger_binding_id" + Source = "Immutable Exchanger ThemeView contract: host binds existing theme-owned nodes only" + Screens = $screens +} +$json = $catalog | ConvertTo-Json -Depth 12 + +if ($Check) { + if (-not (Test-Path -LiteralPath $OutputPath)) { + throw "Binding catalog is missing: $OutputPath" + } + $current = Get-Content -LiteralPath $OutputPath -Raw | ConvertFrom-Json + $expectedScreens = @($catalog.Screens) + $currentScreens = @($current.Screens) + if ($current.Format -ne $catalog.Format -or $current.Version -ne $catalog.Version -or $currentScreens.Count -ne $expectedScreens.Count) { + throw "Binding catalog header or screen count is out of date." + } + foreach ($expectedScreen in $expectedScreens) { + $currentScreen = @($currentScreens | Where-Object { $_.BindingId -eq $expectedScreen.BindingId }) + if ($currentScreen.Count -ne 1 -or @($currentScreen[0].Bindings).Count -ne @($expectedScreen.Bindings).Count) { + throw "Binding catalog screen '$($expectedScreen.BindingId)' is out of date." + } + foreach ($expectedBinding in $expectedScreen.Bindings) { + $actual = @($currentScreen[0].Bindings | Where-Object { $_.Id -eq $expectedBinding.Id }) + if ($actual.Count -ne 1 -or $actual[0].FallbackPath -ne $expectedBinding.FallbackPath -or (@($actual[0].Types) -join ",") -ne (@($expectedBinding.Types) -join ",")) { + throw "Binding '$($expectedBinding.Id)' is missing or out of date." + } + } + } + $builderRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path + $authorityHash = (Get-FileHash -LiteralPath $OutputPath -Algorithm SHA256).Hash + foreach ($packageDirectory in Get-ChildItem -LiteralPath (Join-Path $builderRoot "themes") -Directory) { + $packageCatalog = Join-Path $packageDirectory.FullName "package\contracts\screen_bindings.v2.json" + if (-not (Test-Path -LiteralPath $packageCatalog)) { + throw "Packaged binding catalog is missing or out of date: $packageCatalog" + } + $packageHash = (Get-FileHash -LiteralPath $packageCatalog -Algorithm SHA256).Hash + if ($packageHash -ne $authorityHash) { + throw "Packaged binding catalog is missing or out of date: $packageCatalog" + } + } + Write-Host "Binding catalog matches the host sources." + return +} + +$outputDirectory = Split-Path -Parent $OutputPath +New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null +Set-Content -LiteralPath $OutputPath -Value $json -Encoding UTF8 +$builderRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +foreach ($themeDirectory in Get-ChildItem -LiteralPath (Join-Path $builderRoot "themes") -Directory) { + $packageRoot = Join-Path $themeDirectory.FullName "package" + if (-not (Test-Path -LiteralPath $packageRoot)) { + continue + } + $packageContractDirectory = Join-Path $packageRoot "contracts" + New-Item -ItemType Directory -Force -Path $packageContractDirectory | Out-Null + Copy-Item -LiteralPath $OutputPath -Destination (Join-Path $packageContractDirectory "screen_bindings.v2.json") -Force +} +Write-Host "Binding catalog written: $OutputPath" diff --git a/tools/Test-PackagedBindingContract.ps1 b/tools/Test-PackagedBindingContract.ps1 new file mode 100644 index 0000000..2f408e1 --- /dev/null +++ b/tools/Test-PackagedBindingContract.ps1 @@ -0,0 +1,147 @@ +param( + [string]$ThemeId = "*" +) + +$ErrorActionPreference = "Stop" +$builderRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$authorityPath = Join-Path $builderRoot "contracts\screen_bindings.v2.json" +if (-not (Test-Path -LiteralPath $authorityPath)) { + throw "The authoritative binding contract is missing: $authorityPath" +} + +$contract = Get-Content -LiteralPath $authorityPath -Raw | ConvertFrom-Json +if ($contract.Format -ne "ExchangerThemeBindingContract" -or $contract.Version -ne 2) { + throw "contracts\screen_bindings.v2.json has an unsupported format or version." +} +$screenCount = @($contract.Screens).Count +$bindingCount = @($contract.Screens | ForEach-Object { $_.Bindings }).Count +if ($screenCount -ne 9 -or $bindingCount -ne 481) { + throw "Binding contract v2 must contain 9 screens and 481 elements; found $screenCount/$bindingCount." +} + +$allBindings = @($contract.Screens | ForEach-Object { $_.Bindings }) +$bindingIds = @($allBindings | ForEach-Object { $_.Id }) +if (@($bindingIds | Select-Object -Unique).Count -ne 481) { + throw "Binding contract v2 contains duplicate element IDs." +} + +$requiredServiceBindings = [ordered]@{ + "settings.scroll.content.section_tabs.service_button" = "Button" + "settings.scroll.content.service_inventory_panel" = "Control" + "settings.scroll.content.service_inventory_panel.margin.content.count" = "Label" + "settings.scroll.content.service_inventory_panel.margin.content.hopper1_label" = "Label" + "settings.scroll.content.service_inventory_panel.margin.content.hopper2_label" = "Label" + "settings.scroll.content.service_inventory_panel.margin.content.recount_button" = "Button" + "settings.scroll.content.service_inventory_panel.margin.content.manual_add_button" = "Button" + "settings.scroll.content.service_inventory_panel.margin.content.status" = "Label" + "settings.service_dialog_overlay" = "Control" + "settings.service_dialog_overlay.dialog.margin.content.title" = "Label" + "settings.service_dialog_overlay.dialog.margin.content.description" = "Label" + "settings.service_dialog_overlay.dialog.margin.content.amount" = "SpinBox" + "settings.service_dialog_overlay.dialog.margin.content.buttons.cancel_button" = "Button" + "settings.service_dialog_overlay.dialog.margin.content.buttons.confirm_button" = "Button" +} +foreach ($entry in $requiredServiceBindings.GetEnumerator()) { + $binding = @($allBindings | Where-Object { $_.Id -eq $entry.Key }) + if ($binding.Count -ne 1 -or @($binding[0].Types) -notcontains $entry.Value) { + throw "Binding contract v2 is missing service binding '$($entry.Key)' with type '$($entry.Value)'." + } +} +$supplementalRuntimeBindings = @( + "home.scroll.content.advertisement_panel", + "home.scroll.content.stock_status.meter.empty", + "home.scroll.content.stock_status.meter.low", + "home.scroll.content.stock_status.meter.enough", + "home.scroll.content.stock_status.meter.much", + "home.scroll.content.stock_status.approximate_count", + "card_amount.content.reward_panel.content.bonus", + "cash_payment.content.banner_text", + "cash_payment.content.top_bar.home_navigation_button", + "card_amount.content.top_bar.home_navigation_button", + "card_custom_amount.content.top_bar.home_navigation_button", + "card_terminal.content.top_bar.home_navigation_button", + "success.content.home_navigation_button", + "error.content.home_navigation_button", + "service_access.content.home_navigation_button", + "settings.footer", + "settings.footer.save_and_exit_button", + "settings.scroll.content.footer_clearance", + "settings.scroll.content.service_inventory_panel.margin.content.description", + "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled", + "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled", + "settings.scroll.content.menu_visibility_panel", + "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status", + "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character", + "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block", + "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet", + "settings.scroll.content.advertisement_poster_panel.margin.content.select_button", + "settings.scroll.content.animated_banner_texts_panel" +) +foreach ($supplementalRuntimeBinding in $supplementalRuntimeBindings) { + if ($bindingIds -contains $supplementalRuntimeBinding) { + throw "Supplemental runtime binding '$supplementalRuntimeBinding' must not change the immutable 481-element JSON contract." + } +} +$cardAmountValueBinding = @($allBindings | Where-Object { + $_.Id -eq "card_amount.content.reward_panel.content.value" +}) +if ($cardAmountValueBinding.Count -ne 1 -or @($cardAmountValueBinding[0].Types) -notcontains "Label") { + throw "The immutable CardAmount Value binding must remain a Label at its original ID/path." +} + +$requiredShortTextBindings = @( + "home.scroll.content.speech_text", + "settings.scroll.content.branding_panel.margin.content.short_text", + "settings.scroll.content.branding_panel.margin.content.short_text_error", + "settings.scroll.content.branding_preview_panel.margin.content.short_text" +) +foreach ($bindingId in $requiredShortTextBindings) { + if ($bindingIds -notcontains $bindingId) { + throw "Binding contract v2 is missing required short-text binding '$bindingId'." + } +} +if (@($bindingIds | Where-Object { $_ -like "*subtitle*" }).Count -ne 0) { + throw "Binding contract v2 must not restore deprecated subtitle bindings." +} + +$expectedFixedCollections = @{ + "card_amount.content.amount_panel.margin.content.preset_grid.slot_" = 16 + "settings.scroll.content.bonus_panel.margin.content.rows.slot_" = 80 + "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_" = 64 + "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_" = 48 +} +foreach ($entry in $expectedFixedCollections.GetEnumerator()) { + $actual = @($bindingIds | Where-Object { $_.StartsWith($entry.Key, [System.StringComparison]::Ordinal) }).Count + if ($actual -ne $entry.Value) { + throw "Fixed collection '$($entry.Key)' must expose $($entry.Value) bindings; found $actual." + } +} + +$authorityHash = (Get-FileHash -LiteralPath $authorityPath -Algorithm SHA256).Hash +$themeDirectories = Get-ChildItem -LiteralPath (Join-Path $builderRoot "themes") -Directory | Where-Object { + $ThemeId -eq "*" -or $_.Name -eq $ThemeId +} +if (@($themeDirectories).Count -eq 0) { + throw "Theme '$ThemeId' was not found in themes/." +} + +foreach ($themeDirectory in $themeDirectories) { + $manifestPath = Join-Path $themeDirectory.FullName "package\manifest.json" + $packageContractPath = Join-Path $themeDirectory.FullName "package\contracts\screen_bindings.v2.json" + if (-not (Test-Path -LiteralPath $manifestPath)) { + throw "Manifest for theme '$($themeDirectory.Name)' is missing: $manifestPath" + } + $manifest = Get-Content -LiteralPath $manifestPath -Raw | ConvertFrom-Json + if ($manifest.Format -ne "ExchangerThemeDlc" -or $manifest.FormatVersion -ne 2) { + throw "Theme '$($themeDirectory.Name)' does not use ExchangerThemeDlc v2." + } + if (-not (Test-Path -LiteralPath $packageContractPath)) { + throw "Binding contract copy for theme '$($themeDirectory.Name)' is missing." + } + $packageHash = (Get-FileHash -LiteralPath $packageContractPath -Algorithm SHA256).Hash + if ($packageHash -ne $authorityHash) { + throw "Binding contract copy for theme '$($themeDirectory.Name)' differs from contracts\screen_bindings.v2.json." + } +} + +Write-Host "Binding contract copies are synchronized: $(@($themeDirectories).Count) theme(s), SHA-256 $authorityHash." diff --git a/tools/preview/BindingOverlay.gd b/tools/preview/BindingOverlay.gd new file mode 100644 index 0000000..bbfd865 --- /dev/null +++ b/tools/preview/BindingOverlay.gd @@ -0,0 +1,76 @@ +extends Control + +const ELEMENT_META_KEY := &"exchanger_binding_id" +const SCREEN_META_KEY := &"exchanger_screen_binding_id" +const LABEL_FONT_SIZE := 10 +const LABEL_HEIGHT := 22.0 +const LABEL_PADDING := 5.0 + +var target: Node + + +func _ready() -> void: + mouse_filter = Control.MOUSE_FILTER_IGNORE + set_process(true) + + +func _process(_delta: float) -> void: + queue_redraw() + + +func _draw() -> void: + if target == null or not is_instance_valid(target): + return + for node in _all_nodes(target): + if (not node.has_meta(ELEMENT_META_KEY) and not node.has_meta(SCREEN_META_KEY)) or not node is CanvasItem: + continue + var canvas_item := node as CanvasItem + if not canvas_item.is_visible_in_tree(): + continue + var binding_id := str( + node.get_meta(ELEMENT_META_KEY) + if node.has_meta(ELEMENT_META_KEY) + else node.get_meta(SCREEN_META_KEY) + ) + var bounds := _bounds_for(canvas_item) + draw_rect(bounds, Color(1.0, 0.72, 0.08, 0.92), false, 2.0) + var label_width := minf(size.x - 8.0, maxf(80.0, binding_id.length() * 6.0 + LABEL_PADDING * 2.0)) + var label_rect := Rect2(bounds.position, Vector2(label_width, LABEL_HEIGHT)) + label_rect.position.x = clampf(label_rect.position.x, 4.0, size.x - label_width - 4.0) + if label_rect.position.y < 28.0: + label_rect.position.y = bounds.end.y + draw_rect(label_rect, Color(0.02, 0.06, 0.14, 0.94), true) + draw_rect(label_rect, Color(1.0, 0.72, 0.08, 1.0), false, 1.0) + draw_string( + ThemeDB.fallback_font, + label_rect.position + Vector2(LABEL_PADDING, 16.0), + binding_id, + HORIZONTAL_ALIGNMENT_LEFT, + label_width - LABEL_PADDING * 2.0, + LABEL_FONT_SIZE, + Color.WHITE + ) + + +func _bounds_for(item: CanvasItem) -> Rect2: + var inverse := get_global_transform().affine_inverse() + if item is Control: + var control := item as Control + var top_left := inverse * control.get_global_transform_with_canvas() * Vector2.ZERO + var bottom_right := inverse * control.get_global_transform_with_canvas() * control.size + return Rect2(top_left, bottom_right - top_left).abs() + if item is Node2D: + var point := inverse * (item as Node2D).get_global_transform_with_canvas().origin + return Rect2(point - Vector2(8.0, 8.0), Vector2(16.0, 16.0)) + return Rect2(Vector2.ZERO, Vector2(16.0, 16.0)) + + +func _all_nodes(root: Node) -> Array[Node]: + var result: Array[Node] = [root] + var cursor := 0 + while cursor < result.size(): + var current := result[cursor] + for child in current.get_children(): + result.append(child) + cursor += 1 + return result diff --git a/tools/preview/BindingOverlay.gd.uid b/tools/preview/BindingOverlay.gd.uid new file mode 100644 index 0000000..de92456 --- /dev/null +++ b/tools/preview/BindingOverlay.gd.uid @@ -0,0 +1 @@ +uid://4qqpq7ifmrua diff --git a/tools/preview/InteractivePetPreview.gd b/tools/preview/InteractivePetPreview.gd new file mode 100644 index 0000000..249bafd --- /dev/null +++ b/tools/preview/InteractivePetPreview.gd @@ -0,0 +1,504 @@ +extends Control + +const ACTIVE_STATE_PATH := "res://build/active-theme.json" +const CANONICAL_PACKAGE_ROOT := "res://exchanger_theme_dlc" +const PET_MANIFEST_FIELD := "InteractivePetScene" +const PET_COMPONENT_RELATIVE_PATH := "components/interactive_pet.tscn" +const LEGACY_PET_COMPONENT_RELATIVE_PATH := "components/alien_pet.tscn" +const GALLERY_SCENE_PATH := "res://tools/preview/preview.tscn" +const REQUIRED_PET_METHODS := [ + &"get_pet_animation_names", + &"get_pet_animation_frame_count", + &"has_pet_animation", + &"play_pet_animation", + &"pause_pet_animation", + &"stop_pet_animation", + &"get_current_pet_animation", + &"get_current_pet_frame", +] +const COMPOSITE_METHODS := [ + &"has_pet_composite_action", + &"start_pet_composite_action", + &"cancel_pet_composite_action", +] +const COMPOSITE_SIGNALS := [ + &"pet_composite_action_started", + &"pet_composite_action_finished", +] +const COMPOSITE_PREVIEW_ACTION := &"interact" +const COMPOSITE_PREVIEW_VIEWPORT := Rect2(0.0, 0.0, 720.0, 720.0) +const COMPOSITE_PREVIEW_SUPPORT_ID := "preview_highest_support" +const COMPOSITE_PREVIEW_SUPPORT := Vector2(360.0, 128.0) +const COMPOSITE_PREVIEW_START := Vector2(360.0, 620.0) + +@onready var stage: Control = %Stage +@onready var animation_name_label: Label = %AnimationName +@onready var frame_label: Label = %FrameCounter +@onready var pause_button: Button = %PauseButton +@onready var auto_button: Button = %AutoButton +@onready var composite_button: Button = %CompositeButton +@onready var animation_buttons: GridContainer = %AnimationButtons +@onready var animation_button_template: Button = %AnimationButtonTemplate +@onready var auto_timer: Timer = %AutoTimer + +var pet: Node2D +var _animation_names: Array[StringName] = [] +var _current_index := 0 +var _paused := false +var _composite_runtime: PetCompositePreviewRuntime +var _composite_run_id := 0 +var _composite_display_scale := 1.0 +var _composite_display_origin := Vector2.ZERO + + +func _ready() -> void: + _connect_controls() + if not _instantiate_active_pet(): + return + _animation_names = _read_animation_names() + if _animation_names.is_empty(): + _show_error("Компонент питомца не содержит доступных анимаций.") + return + _build_animation_buttons() + _center_pet() + _configure_composite_preview() + var initial_name := StringName(str(pet.call(&"get_current_pet_animation"))) + _current_index = maxi(0, _animation_names.find(initial_name)) + _play_current_animation() + + +func _process(_delta: float) -> void: + if not is_instance_valid(pet): + set_process(false) + return + if _animation_names.is_empty(): + frame_label.text = "КАДР: —" + return + var animation_name := StringName(str(pet.call(&"get_current_pet_animation"))) + var frame_count := int(pet.call(&"get_pet_animation_frame_count", animation_name)) + var current_frame := int(pet.call(&"get_current_pet_frame")) + frame_label.text = "КАДР: %d / %d" % [current_frame + 1, frame_count] + + +func _unhandled_key_input(event: InputEvent) -> void: + if not event is InputEventKey or not event.pressed or event.echo: + return + match event.keycode: + KEY_LEFT: + _select_relative(-1) + KEY_RIGHT: + _select_relative(1) + KEY_SPACE: + _toggle_pause() + KEY_R: + _play_current_animation() + KEY_ESCAPE: + _return_to_gallery() + return + _: + return + var viewport := get_viewport() + if viewport != null: + viewport.set_input_as_handled() + + +func _connect_controls() -> void: + stage.resized.connect(_center_pet) + animation_buttons.resized.connect(_resize_animation_buttons) + %GalleryButton.pressed.connect(_return_to_gallery) + %PreviousButton.pressed.connect(_select_relative.bind(-1)) + %NextButton.pressed.connect(_select_relative.bind(1)) + pause_button.pressed.connect(_toggle_pause) + %ReplayButton.pressed.connect(_play_current_animation) + auto_button.toggled.connect(_on_auto_toggled) + composite_button.pressed.connect(_start_composite_preview) + auto_timer.timeout.connect(_select_relative.bind(1)) + + +func _instantiate_active_pet() -> bool: + var source_package := _active_package_path() + var component_path := _resolve_pet_component_path(source_package) + if component_path.is_empty(): + _show_error("В активной теме не задан компонент интерактивного питомца.") + return false + var packed_scene := load(component_path) as PackedScene + if packed_scene == null: + _show_error("Не удалось загрузить компонент питомца: %s" % component_path) + return false + var instance := packed_scene.instantiate() + if not instance is Node2D: + instance.queue_free() + _show_error("Корень компонента питомца должен наследовать Node2D.") + return false + pet = instance as Node2D + for method_name in REQUIRED_PET_METHODS: + if not pet.has_method(method_name): + pet.queue_free() + pet = null + _show_error("У компонента питомца отсутствует метод %s()." % method_name) + return false + if not pet.has_signal(&"pet_animation_completed"): + pet.queue_free() + pet = null + _show_error("У компонента питомца отсутствует сигнал pet_animation_completed.") + return false + stage.add_child(pet) + pet.connect(&"pet_animation_completed", _on_pet_animation_completed) + if pet.has_signal(&"pet_composite_action_finished"): + pet.connect(&"pet_composite_action_finished", _on_composite_action_finished) + return true + + +func _read_animation_names() -> Array[StringName]: + var result: Array[StringName] = [] + var raw_names = pet.call(&"get_pet_animation_names") + if not raw_names is Array: + return result + for raw_name in raw_names: + var animation_name := StringName(str(raw_name)) + if not animation_name.is_empty() and not result.has(animation_name): + result.append(animation_name) + return result + + +func _build_animation_buttons() -> void: + var group := ButtonGroup.new() + for animation_name in _animation_names: + var button := animation_button_template.duplicate() as Button + button.name = "Animation_%s" % _safe_node_name(animation_name) + button.visible = true + button.text = str(animation_name) + button.button_group = group + button.set_meta(&"animation_name", animation_name) + button.pressed.connect(_select_animation.bind(animation_name)) + animation_buttons.add_child(button) + animation_button_template.visible = false + _resize_animation_buttons() + + +func _resize_animation_buttons() -> void: + var separation := float(animation_buttons.get_theme_constant("h_separation")) + var column_width := floorf((animation_buttons.size.x - separation) * 0.5) + if column_width <= 0.0: + return + for child in animation_buttons.get_children(): + if child is Button: + child.custom_minimum_size.x = column_width + + +func _center_pet() -> void: + if not is_instance_valid(pet): + return + if _is_composite_preview_active(): + _layout_composite_preview() + return + var frame_size := Vector2(128.0, 128.0) + if pet.has_method(&"get_pet_preview_size"): + var reported_size = pet.call(&"get_pet_preview_size") + if reported_size is Vector2 and reported_size.x > 0.0 and reported_size.y > 0.0: + frame_size = reported_size + var min_visual_offset := Vector2.ZERO + var max_visual_offset := Vector2.ZERO + if pet.has_method(&"get_pet_animation_visual_offset"): + for animation_name in _animation_names: + var raw_offset = pet.call(&"get_pet_animation_visual_offset", animation_name) + if raw_offset is Vector2: + min_visual_offset.x = minf(min_visual_offset.x, raw_offset.x) + min_visual_offset.y = minf(min_visual_offset.y, raw_offset.y) + max_visual_offset.x = maxf(max_visual_offset.x, raw_offset.x) + max_visual_offset.y = maxf(max_visual_offset.y, raw_offset.y) + var preview_envelope_size := frame_size + max_visual_offset - min_visual_offset + var available_size := stage.size + if available_size.x <= 0.0 or available_size.y <= 0.0: + return + var preview_scale := minf(4.0, minf( + available_size.x / preview_envelope_size.x, + available_size.y / preview_envelope_size.y + )) + preview_scale = maxf(preview_scale, 0.01) + pet.scale = Vector2.ONE * preview_scale + pet.position = ( + (available_size - preview_envelope_size * preview_scale) * 0.5 + - min_visual_offset * preview_scale + ) + + +func _select_relative(offset: int) -> void: + if _animation_names.is_empty(): + return + _current_index = wrapi(_current_index + offset, 0, _animation_names.size()) + _play_current_animation() + + +func _select_animation(animation_name: StringName) -> void: + var index := _animation_names.find(animation_name) + if index < 0: + return + _current_index = index + _play_current_animation() + + +func _play_current_animation() -> void: + if _animation_names.is_empty() or not is_instance_valid(pet): + return + _cancel_composite_preview(&"manual_animation") + var animation_name := _animation_names[_current_index] + if not bool(pet.call(&"play_pet_animation", animation_name)): + _show_error("Компонент отклонил анимацию %s." % animation_name) + return + _paused = false + pause_button.text = "ПАУЗА" + _update_animation_info(animation_name) + _update_animation_buttons(animation_name) + _schedule_auto_advance(animation_name) + + +func _toggle_pause() -> void: + if _animation_names.is_empty() or not is_instance_valid(pet): + return + _paused = not _paused + if _paused: + pet.call(&"pause_pet_animation") + auto_timer.paused = true + pause_button.text = "ПРОДОЛЖИТЬ" + else: + pet.call(&"play_pet_animation", _animation_names[_current_index], false) + auto_timer.paused = false + pause_button.text = "ПАУЗА" + + +func _on_auto_toggled(enabled: bool) -> void: + auto_button.text = "АВТОПОКАЗ: ВКЛ" if enabled else "АВТОПОКАЗ: ВЫКЛ" + if enabled: + _play_current_animation() + else: + auto_timer.stop() + + +func _configure_composite_preview() -> void: + var supported := true + for method_name in COMPOSITE_METHODS: + supported = supported and pet.has_method(method_name) + for signal_name in COMPOSITE_SIGNALS: + supported = supported and pet.has_signal(signal_name) + supported = supported and bool( + pet.call(&"has_pet_composite_action", COMPOSITE_PREVIEW_ACTION) + ) if supported else false + composite_button.disabled = not supported + composite_button.tooltip_text = ( + "Запустить составное действие interact через тестовый runtime host." + if supported + else "Активная тема не предоставляет составное действие interact." + ) + + +func _start_composite_preview() -> void: + if composite_button.disabled or not is_instance_valid(pet): + return + _cancel_composite_preview(&"restarted") + auto_button.set_pressed_no_signal(false) + _on_auto_toggled(false) + _composite_run_id += 1 + _composite_runtime = PetCompositePreviewRuntime.new( + _composite_run_id, + COMPOSITE_PREVIEW_VIEWPORT, + COMPOSITE_PREVIEW_START, + COMPOSITE_PREVIEW_SUPPORT_ID, + COMPOSITE_PREVIEW_SUPPORT + ) + _composite_runtime.anchor_changed.connect(_apply_composite_anchor) + _layout_composite_preview() + _apply_composite_anchor(COMPOSITE_PREVIEW_START) + var returned_run_id := int(pet.call( + &"start_pet_composite_action", + COMPOSITE_PREVIEW_ACTION, + _composite_runtime, + {"action_repetitions": 3, "reduced_effects": false} + )) + if returned_run_id != _composite_run_id: + _cancel_composite_preview(&"start_rejected") + _show_error("Тема отклонила запуск составного действия interact.") + return + composite_button.disabled = true + animation_name_label.text = "СОСТАВНОЕ ДЕЙСТВИЕ: interact" + + +func _layout_composite_preview() -> void: + var available_size := stage.size + if available_size.x <= 0.0 or available_size.y <= 0.0: + return + _composite_display_scale = minf( + available_size.x / COMPOSITE_PREVIEW_VIEWPORT.size.x, + available_size.y / COMPOSITE_PREVIEW_VIEWPORT.size.y + ) + _composite_display_origin = ( + available_size - COMPOSITE_PREVIEW_VIEWPORT.size * _composite_display_scale + ) * 0.5 + if _composite_runtime != null: + _apply_composite_anchor(_composite_runtime.GetAnchor()) + + +func _apply_composite_anchor(anchor: Vector2) -> void: + if not is_instance_valid(pet): + return + var runtime_scale := 1.0 + var ground_offset := Vector2.ZERO + if pet.has_method(&"get_pet_runtime_scale"): + runtime_scale = float(pet.call(&"get_pet_runtime_scale")) + if pet.has_method(&"get_pet_ground_offset"): + var reported_offset: Variant = pet.call(&"get_pet_ground_offset") + if reported_offset is Vector2: + ground_offset = reported_offset + pet.scale = Vector2.ONE * runtime_scale * _composite_display_scale + pet.position = _composite_display_origin + ( + anchor - ground_offset * runtime_scale + ) * _composite_display_scale + + +func _on_composite_action_finished( + action_name: StringName, + run_id: int, + completed: bool +) -> void: + if run_id != _composite_run_id or action_name != COMPOSITE_PREVIEW_ACTION: + return + if _composite_runtime != null: + _composite_runtime.invalidate() + _composite_runtime = null + composite_button.disabled = false + animation_name_label.text = ( + "СОСТАВНОЕ ДЕЙСТВИЕ ЗАВЕРШЕНО" + if completed + else "СОСТАВНОЕ ДЕЙСТВИЕ ОТМЕНЕНО" + ) + + +func _cancel_composite_preview(reason: StringName) -> void: + if not _is_composite_preview_active(): + return + pet.call(&"cancel_pet_composite_action", _composite_run_id, reason) + _composite_runtime.invalidate() + _composite_runtime = null + composite_button.disabled = false + + +func _is_composite_preview_active() -> bool: + return _composite_runtime != null and _composite_runtime.IsActive() + + +func _on_pet_animation_completed(animation_name: StringName) -> void: + if ( + auto_button.button_pressed + and not _animation_names.is_empty() + and animation_name == _animation_names[_current_index] + ): + _select_relative(1) + + +func _schedule_auto_advance(animation_name: StringName) -> void: + auto_timer.stop() + if not auto_button.button_pressed or not is_instance_valid(pet): + return + var is_looping := false + if pet.has_method(&"is_pet_animation_looping"): + is_looping = bool(pet.call(&"is_pet_animation_looping", animation_name)) + if not is_looping: + return + var frames_per_second := 0.0 + if pet.has_method(&"get_pet_animation_frames_per_second"): + frames_per_second = float( + pet.call(&"get_pet_animation_frames_per_second", animation_name) + ) + var frame_count := int(pet.call(&"get_pet_animation_frame_count", animation_name)) + var duration := float(frame_count) / maxf(frames_per_second, 0.01) + auto_timer.start(maxf(duration, 1.0)) + + +func _update_animation_info(animation_name: StringName) -> void: + var frame_count := int(pet.call(&"get_pet_animation_frame_count", animation_name)) + var mode := "РЕЖИМ НЕ УКАЗАН" + if pet.has_method(&"is_pet_animation_looping"): + mode = "ЦИКЛ" if bool( + pet.call(&"is_pet_animation_looping", animation_name) + ) else "ОДИН РАЗ" + animation_name_label.text = "АНИМАЦИЯ: %s • %d КАДРОВ • %s" % [ + animation_name, + frame_count, + mode, + ] + + +func _update_animation_buttons(animation_name: StringName) -> void: + for child in animation_buttons.get_children(): + if child is Button and child.has_meta(&"animation_name"): + (child as Button).set_pressed_no_signal( + StringName(child.get_meta(&"animation_name")) == animation_name + ) + + +func _active_package_path() -> String: + var state := _load_json(ACTIVE_STATE_PATH) + return str(state.get("Package", "")).replace("\\", "/") + + +func _resolve_pet_component_path(package_path: String) -> String: + if package_path.is_empty(): + return "" + var package_res_root := ProjectSettings.localize_path(package_path).replace("\\", "/") + if not package_res_root.begins_with("res://"): + return "" + var manifest := _load_json(package_path.path_join("manifest.json")) + var declared_path := str(manifest.get(PET_MANIFEST_FIELD, "")) + var candidates := PackedStringArray() + if not declared_path.is_empty(): + var declared_relative := _package_relative_path(declared_path) + if not declared_relative.is_empty(): + candidates.append(declared_relative) + candidates.append(PET_COMPONENT_RELATIVE_PATH) + candidates.append(LEGACY_PET_COMPONENT_RELATIVE_PATH) + for relative_path in candidates: + var candidate := package_res_root.path_join(relative_path) + if ResourceLoader.exists(candidate): + return candidate + return "" + + +func _package_relative_path(resource_path: String) -> String: + var normalized := resource_path.replace("\\", "/") + if normalized.contains(".."): + return "" + if normalized.begins_with(CANONICAL_PACKAGE_ROOT + "/"): + return normalized.trim_prefix(CANONICAL_PACKAGE_ROOT + "/") + if normalized.begins_with("res://"): + return "" + return normalized.trim_prefix("/") + + +func _load_json(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {} + var value = JSON.parse_string(FileAccess.get_file_as_string(path)) + return value if value is Dictionary else {} + + +func _safe_node_name(animation_name: StringName) -> String: + var result := str(animation_name) + for character in ["/", "\\", ":", "@", "\"", "%"]: + result = result.replace(character, "_") + return result + + +func _show_error(message: String) -> void: + push_error("[Interactive Pet Preview] %s" % message) + animation_name_label.text = "ОШИБКА: %s" % message + frame_label.text = "КАДР: —" + pause_button.disabled = true + auto_button.disabled = true + composite_button.disabled = true + set_process(false) + + +func _return_to_gallery() -> void: + _cancel_composite_preview(&"leave_preview") + set_process(false) + get_tree().change_scene_to_file(GALLERY_SCENE_PATH) diff --git a/tools/preview/InteractivePetPreview.gd.uid b/tools/preview/InteractivePetPreview.gd.uid new file mode 100644 index 0000000..dfd22f6 --- /dev/null +++ b/tools/preview/InteractivePetPreview.gd.uid @@ -0,0 +1 @@ +uid://dfnm2i8jtxl6g diff --git a/tools/preview/PetCompositePreviewRuntime.gd b/tools/preview/PetCompositePreviewRuntime.gd new file mode 100644 index 0000000..5050820 --- /dev/null +++ b/tools/preview/PetCompositePreviewRuntime.gd @@ -0,0 +1,132 @@ +class_name PetCompositePreviewRuntime +extends RefCounted + +signal anchor_changed(anchor: Vector2) + +var _run_id: int +var _viewport_rect: Rect2 +var _anchor: Vector2 +var _support_id: String +var _support_anchor: Vector2 +var _active := true +var _support_contacts := "solid" +var _screen_bounds := "clamp" +var _landing_surface_id := "" +var _wrap_margin := 0.0 +var _wrapped := false + + +func _init( + run_id: int, + viewport_rect: Rect2, + anchor: Vector2, + support_id: String, + support_anchor: Vector2 +) -> void: + _run_id = run_id + _viewport_rect = viewport_rect + _anchor = anchor + _support_id = support_id + _support_anchor = support_anchor + + +func GetRunId() -> int: + return _run_id + + +func IsActive() -> bool: + return _active + + +func GetViewportRect() -> Rect2: + return _viewport_rect + + +func GetAnchor() -> Vector2: + return _anchor + + +func GetHighestSupport() -> Dictionary: + return { + "accepted": _active, + "valid": _active, + "surface_id": _support_id, + "anchor": _support_anchor, + } + + +func SetMotionPolicy(policy: Dictionary) -> bool: + if not _active: + return false + _support_contacts = str(policy.get("support_contacts", _support_contacts)) + _screen_bounds = str(policy.get("screen_bounds", _screen_bounds)) + _landing_surface_id = str(policy.get("landing_surface_id", "")) + _wrap_margin = maxf(0.0, float(policy.get("wrap_margin", 0.0))) + if _screen_bounds == "wrap_vertical_once": + _wrapped = false + return true + + +func SetAnchor(anchor: Vector2) -> Dictionary: + if not _active: + return {"accepted": false} + _anchor = anchor + anchor_changed.emit(_anchor) + return {"accepted": true, "anchor": _anchor} + + +func MoveAnchor(delta: Vector2) -> Dictionary: + if not _active: + return {"accepted": false} + + var previous := _anchor + var next := previous + delta + var wrapped_now := false + if ( + _screen_bounds == "wrap_vertical_once" + and not _wrapped + and next.y > _viewport_rect.end.y + _wrap_margin + ): + var overflow := next.y - (_viewport_rect.end.y + _wrap_margin) + next.y = _viewport_rect.position.y - _wrap_margin + overflow + _wrapped = true + wrapped_now = true + + var landed := false + if ( + _support_contacts == "after_vertical_wrap" + and _wrapped + and _landing_surface_id == _support_id + and delta.y >= 0.0 + and previous.y <= _support_anchor.y + and next.y >= _support_anchor.y + ): + next = _support_anchor + landed = true + + _anchor = next + anchor_changed.emit(_anchor) + return { + "accepted": true, + "anchor": _anchor, + "wrapped": wrapped_now, + "landed": landed, + "surface_id": _support_id if landed else "", + } + + +func LandOnSupport(surface_id: String) -> Dictionary: + if not _active or surface_id != _support_id: + return {"accepted": _active, "landed": false} + _anchor = _support_anchor + anchor_changed.emit(_anchor) + return { + "accepted": true, + "landed": true, + "anchor": _anchor, + "surface_id": _support_id, + } + + +func invalidate() -> void: + _active = false diff --git a/tools/preview/PetCompositePreviewRuntime.gd.uid b/tools/preview/PetCompositePreviewRuntime.gd.uid new file mode 100644 index 0000000..e8c26b3 --- /dev/null +++ b/tools/preview/PetCompositePreviewRuntime.gd.uid @@ -0,0 +1 @@ +uid://6anwfiii67gj diff --git a/tools/preview/ThemeGallery.gd b/tools/preview/ThemeGallery.gd new file mode 100644 index 0000000..5089c9f --- /dev/null +++ b/tools/preview/ThemeGallery.gd @@ -0,0 +1,308 @@ +extends Control + +const ACTIVE_STATE_PATH := "res://build/active-theme.json" +const CANONICAL_PACKAGE_ROOT := "res://exchanger_theme_dlc" +const PET_PREVIEW_SCENE_PATH := "res://tools/preview/interactive_pet_preview.tscn" +const PET_MANIFEST_FIELD := "InteractivePetScene" +const PET_COMPONENT_RELATIVE_PATH := "components/interactive_pet.tscn" +const LEGACY_PET_COMPONENT_RELATIVE_PATH := "components/alien_pet.tscn" +const POLL_INTERVAL := 0.35 +const RELOAD_DELAY := 0.45 +const SCREEN_ORDER := [ + ["HOME", "screen.home"], + ["CASH", "screen.cash_payment"], + ["SUM", "screen.card_amount"], + ["KEYPAD", "screen.card_custom_amount"], + ["CARD", "screen.card_terminal"], + ["SUCCESS", "screen.success"], + ["ERROR", "screen.error"], + ["SERVICE", "screen.service_access"], + ["SETTINGS", "screen.settings"], +] +const WATCHED_EXTENSIONS := { + "gd": true, "gdshader": true, "json": true, "material": true, + "res": true, "scn": true, "tres": true, "tscn": true, + "png": true, "jpg": true, "jpeg": true, "webp": true, "svg": true, + "ttf": true, "otf": true, "wav": true, "ogg": true, "mp3": true, + "ogv": true, +} +const TAB_META := &"full_scene_theme_preview_tab" +const OVERLAY_META := &"full_scene_theme_preview_overlay" +const KEYBOARD_PREVIEW_META := &"full_scene_theme_preview_keyboard" +const SERVICE_PREVIEW_META := &"full_scene_theme_preview_service" +const TAB_INDEX_META := &"preview_tab_index" +const TEXT_KEYBOARD_BINDING := "settings.keyboard_overlay.text_keyboard" +const NUMERIC_KEYBOARD_BINDING := "settings.keyboard_overlay.numeric_keyboard" +const SERVICE_PANEL_BINDING := "settings.scroll.content.service_inventory_panel" +const SERVICE_DIALOG_BINDING := "settings.service_dialog_overlay" + +@onready var screens: TabContainer = $Screens +@onready var binding_overlay: Control = $BindingOverlay +@onready var navigation: HBoxContainer = $TopBar/Navigation +@onready var overlay_toggle: Button = $TopBar/Navigation/OverlayToggle +@onready var keyboard_preview_toggle: Button = $KeyboardPreviewToggle +@onready var service_preview_toggle: Button = $ServicePreviewToggle +@onready var pet_preview_button: Button = $TopBar/Navigation/PetPreview + +var _source_package := "" +var _source_snapshot: Dictionary = {} +var _poll_elapsed := 0.0 +var _reload_elapsed := -1.0 +var _service_visibility_snapshots: Dictionary = {} + + +func _ready() -> void: + _source_package = _active_package_path() + var pet_component_path := _resolve_pet_component_path(_source_package) + pet_preview_button.disabled = pet_component_path.is_empty() + pet_preview_button.tooltip_text = ( + "Открыть просмотрщик анимаций питомца" + if not pet_preview_button.disabled + else "В активной теме не задан InteractivePetScene" + ) + _load_active_theme() + screens.tab_changed.connect(_on_tab_changed) + overlay_toggle.toggled.connect(_on_overlay_toggled) + keyboard_preview_toggle.pressed.connect(_on_keyboard_preview_pressed) + service_preview_toggle.pressed.connect(_on_service_preview_pressed) + pet_preview_button.pressed.connect(_open_pet_preview) + for child in navigation.get_children(): + if child is Button and child.has_meta(TAB_INDEX_META): + (child as Button).pressed.connect( + _on_page_button_pressed.bind(int(child.get_meta(TAB_INDEX_META))) + ) + var overlay_enabled := bool(get_tree().root.get_meta(OVERLAY_META, true)) + overlay_toggle.set_pressed_no_signal(overlay_enabled) + _on_overlay_toggled(overlay_enabled) + var selected := int(get_tree().root.get_meta(TAB_META, 0)) + screens.current_tab = clampi(selected, 0, maxi(0, screens.get_tab_count() - 1)) + _on_tab_changed(screens.current_tab) + if not _source_package.is_empty(): + _source_snapshot = _capture_snapshot(_source_package) + print("[Theme Preview] Watching %s" % _source_package) + + +func _process(delta: float) -> void: + if _source_package.is_empty(): + return + if _reload_elapsed >= 0.0: + _reload_elapsed -= delta + if _reload_elapsed <= 0.0: + get_tree().root.set_meta(TAB_META, screens.current_tab) + get_tree().reload_current_scene() + return + _poll_elapsed += delta + if _poll_elapsed < POLL_INTERVAL: + return + _poll_elapsed = 0.0 + var next_source := _capture_snapshot(_source_package) + var source_changes := _changed_paths(_source_snapshot, next_source) + _source_snapshot = next_source + if not source_changes.is_empty(): + _reload_elapsed = RELOAD_DELAY + + +func _load_active_theme() -> void: + if _source_package.is_empty(): + push_error("[Theme Preview] No active package is selected.") + return + var package_res_root := ProjectSettings.localize_path(_source_package).replace("\\", "/") + if not package_res_root.begins_with("res://"): + push_error("[Theme Preview] Active package must be inside this project: %s" % _source_package) + return + var manifest := _load_json(_source_package.path_join("manifest.json")) + var scene_map: Dictionary = manifest.get("ScreenScenes", {}) + for descriptor in SCREEN_ORDER: + var binding_id: String = descriptor[1] + var canonical_path := str(scene_map.get(binding_id, "")) + var relative_path := canonical_path.trim_prefix(CANONICAL_PACKAGE_ROOT).trim_prefix("/") + var scene_path := package_res_root.path_join(relative_path) + if not ResourceLoader.exists(scene_path): + push_error("[Theme Preview] Missing scene for %s: %s" % [binding_id, scene_path]) + continue + var packed := load(scene_path) as PackedScene + if packed == null: + continue + var screen := packed.instantiate() + screens.add_child(screen) + + +func _on_tab_changed(tab: int) -> void: + _update_page_buttons(tab) + if tab < 0 or tab >= screens.get_tab_count(): + binding_overlay.target = null + keyboard_preview_toggle.visible = false + service_preview_toggle.visible = false + return + var screen := screens.get_child(tab) + binding_overlay.target = screen + keyboard_preview_toggle.visible = ( + str(screen.get_meta(&"exchanger_screen_binding_id", "")) == "screen.settings" + ) + service_preview_toggle.visible = keyboard_preview_toggle.visible + _apply_service_preview_mode(screen) + _apply_keyboard_preview_mode(screen) + + +func _on_page_button_pressed(tab: int) -> void: + if tab >= 0 and tab < screens.get_tab_count(): + screens.current_tab = tab + + +func _open_pet_preview() -> void: + get_tree().change_scene_to_file(PET_PREVIEW_SCENE_PATH) + + +func _update_page_buttons(selected_tab: int) -> void: + for child in navigation.get_children(): + if child is Button and child.has_meta(TAB_INDEX_META): + (child as Button).set_pressed_no_signal( + int(child.get_meta(TAB_INDEX_META)) == selected_tab + ) + + +func _on_overlay_toggled(enabled: bool) -> void: + binding_overlay.visible = enabled + overlay_toggle.text = "BINDINGS: ON" if enabled else "BINDINGS: OFF" + get_tree().root.set_meta(OVERLAY_META, enabled) + + +func _on_keyboard_preview_pressed() -> void: + var mode := (int(get_tree().root.get_meta(KEYBOARD_PREVIEW_META, 0)) + 1) % 3 + get_tree().root.set_meta(KEYBOARD_PREVIEW_META, mode) + if screens.current_tab >= 0 and screens.current_tab < screens.get_tab_count(): + _apply_keyboard_preview_mode(screens.get_child(screens.current_tab)) + + +func _apply_keyboard_preview_mode(screen: Node) -> void: + var mode := int(get_tree().root.get_meta(KEYBOARD_PREVIEW_META, 0)) + var text_keyboard := _find_binding(screen, TEXT_KEYBOARD_BINDING) as CanvasItem + var numeric_keyboard := _find_binding(screen, NUMERIC_KEYBOARD_BINDING) as CanvasItem + if text_keyboard != null: + text_keyboard.visible = mode == 1 + if numeric_keyboard != null: + numeric_keyboard.visible = mode == 2 + keyboard_preview_toggle.text = ["KEYBOARD: OFF", "KEYBOARD: TEXT", "KEYBOARD: NUM"][mode] + + +func _on_service_preview_pressed() -> void: + var mode := (int(get_tree().root.get_meta(SERVICE_PREVIEW_META, 0)) + 1) % 3 + get_tree().root.set_meta(SERVICE_PREVIEW_META, mode) + if screens.current_tab >= 0 and screens.current_tab < screens.get_tab_count(): + _apply_service_preview_mode(screens.get_child(screens.current_tab)) + + +func _apply_service_preview_mode(screen: Node) -> void: + var panel := _find_binding(screen, SERVICE_PANEL_BINDING) as CanvasItem + var dialog := _find_binding(screen, SERVICE_DIALOG_BINDING) as CanvasItem + if panel == null or dialog == null: + service_preview_toggle.text = "INVENTORY: OFF" + return + + var screen_key := screen.get_instance_id() + if not _service_visibility_snapshots.has(screen_key): + var snapshot: Dictionary = {} + for child in panel.get_parent().get_children(): + if child is PanelContainer and child.name != &"Header": + snapshot[child] = child.visible + _service_visibility_snapshots[screen_key] = snapshot + + var mode := int(get_tree().root.get_meta(SERVICE_PREVIEW_META, 0)) + var visibility_snapshot: Dictionary = _service_visibility_snapshots[screen_key] + for node in visibility_snapshot: + if is_instance_valid(node): + (node as CanvasItem).visible = bool(visibility_snapshot[node]) if mode == 0 else false + + panel.visible = mode > 0 + dialog.visible = mode == 2 + var scroll := _find_binding(screen, "settings.scroll") as ScrollContainer + if scroll != null and mode > 0: + scroll.scroll_vertical = 0 + service_preview_toggle.text = ["INVENTORY: OFF", "INVENTORY: PANEL", "INVENTORY: DIALOG"][mode] + + +func _find_binding(root: Node, binding_id: String) -> Node: + var pending: Array[Node] = [root] + var cursor := 0 + while cursor < pending.size(): + var current := pending[cursor] + cursor += 1 + if str(current.get_meta(&"exchanger_binding_id", "")) == binding_id: + return current + for child in current.get_children(): + pending.append(child) + return null + + +func _active_package_path() -> String: + var state := _load_json(ACTIVE_STATE_PATH) + var package_path := str(state.get("Package", "")) + return package_path.replace("\\", "/") + + +func _resolve_pet_component_path(package_path: String) -> String: + if package_path.is_empty(): + return "" + var package_res_root := ProjectSettings.localize_path(package_path).replace("\\", "/") + if not package_res_root.begins_with("res://"): + return "" + var manifest := _load_json(package_path.path_join("manifest.json")) + var declared_path := str(manifest.get(PET_MANIFEST_FIELD, "")) + var candidates := PackedStringArray() + if not declared_path.is_empty(): + var declared_relative := _package_relative_path(declared_path) + if not declared_relative.is_empty(): + candidates.append(declared_relative) + candidates.append(PET_COMPONENT_RELATIVE_PATH) + candidates.append(LEGACY_PET_COMPONENT_RELATIVE_PATH) + for relative_path in candidates: + var candidate := package_res_root.path_join(relative_path) + if ResourceLoader.exists(candidate): + return candidate + return "" + + +func _package_relative_path(resource_path: String) -> String: + var normalized := resource_path.replace("\\", "/") + if normalized.contains(".."): + return "" + if normalized.begins_with(CANONICAL_PACKAGE_ROOT + "/"): + return normalized.trim_prefix(CANONICAL_PACKAGE_ROOT + "/") + if normalized.begins_with("res://"): + return "" + return normalized.trim_prefix("/") + + +func _capture_snapshot(root_path: String) -> Dictionary: + var result: Dictionary = {} + _scan_directory(root_path, result) + return result + + +func _scan_directory(path: String, result: Dictionary) -> void: + if not DirAccess.dir_exists_absolute(path): + return + for file_name in DirAccess.get_files_at(path): + if WATCHED_EXTENSIONS.has(file_name.get_extension().to_lower()): + var file_path := path.path_join(file_name) + result[file_path] = "%s:%s" % [FileAccess.get_modified_time(file_path), FileAccess.get_md5(file_path)] + for directory_name in DirAccess.get_directories_at(path): + _scan_directory(path.path_join(directory_name), result) + + +func _changed_paths(previous: Dictionary, current: Dictionary) -> PackedStringArray: + var result := PackedStringArray() + for path in current: + if not previous.has(path) or previous[path] != current[path]: + result.append(path) + for path in previous: + if not current.has(path): + result.append(path) + return result + + +func _load_json(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {} + var value = JSON.parse_string(FileAccess.get_file_as_string(path)) + return value if value is Dictionary else {} diff --git a/tools/preview/ThemeGallery.gd.uid b/tools/preview/ThemeGallery.gd.uid new file mode 100644 index 0000000..ce91fd7 --- /dev/null +++ b/tools/preview/ThemeGallery.gd.uid @@ -0,0 +1 @@ +uid://1jw85fv3vsjb diff --git a/tools/preview/interactive_pet_preview.tscn b/tools/preview/interactive_pet_preview.tscn new file mode 100644 index 0000000..5b9a59f --- /dev/null +++ b/tools/preview/interactive_pet_preview.tscn @@ -0,0 +1,284 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Script" path="res://tools/preview/InteractivePetPreview.gd" id="1_preview_script"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_stage"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +bg_color = Color(0.00392157, 0.027451, 0.0745098, 0.94) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.419608, 0.858824, 0.309804, 1) +corner_radius_top_left = 16 +corner_radius_top_right = 16 +corner_radius_bottom_right = 16 +corner_radius_bottom_left = 16 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_button_normal"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 6.0 +bg_color = Color(0.0156863, 0.0862745, 0.184314, 0.96) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.419608, 0.858824, 0.309804, 0.7) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_button_hover"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 6.0 +bg_color = Color(0.027451, 0.184314, 0.317647, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.580392, 1, 0.45098, 1) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_button_pressed"] +content_margin_left = 8.0 +content_margin_top = 6.0 +content_margin_right = 8.0 +content_margin_bottom = 6.0 +bg_color = Color(0.419608, 0.858824, 0.309804, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.776471, 1, 0.694118, 1) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[node name="InteractivePetPreview" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture_filter = 1 +script = ExtResource("1_preview_script") + +[node name="Background" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0.0313725, 0.101961, 1) + +[node name="SafeMargin" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 24.0 +offset_top = 20.0 +offset_right = -24.0 +offset_bottom = -20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Content" type="VBoxContainer" parent="SafeMargin"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="Header" type="HBoxContainer" parent="SafeMargin/Content"] +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="GalleryButton" type="Button" parent="SafeMargin/Content/Header"] +unique_name_in_owner = true +custom_minimum_size = Vector2(140, 44) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 14 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "← ГАЛЕРЕЯ" + +[node name="Title" type="Label" parent="SafeMargin/Content/Header"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 28 +text = "АНИМАЦИИ ПИТОМЦА" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="StagePanel" type="PanelContainer" parent="SafeMargin/Content"] +custom_minimum_size = Vector2(0, 530) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_stage") + +[node name="Stage" type="Control" parent="SafeMargin/Content/StagePanel"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 512) +layout_mode = 2 +mouse_filter = 2 + +[node name="Status" type="HBoxContainer" parent="SafeMargin/Content"] +custom_minimum_size = Vector2(0, 34) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="AnimationName" type="Label" parent="SafeMargin/Content/Status"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 15 +text = "АНИМАЦИЯ: —" +vertical_alignment = 1 + +[node name="FrameCounter" type="Label" parent="SafeMargin/Content/Status"] +unique_name_in_owner = true +custom_minimum_size = Vector2(130, 0) +layout_mode = 2 +theme_override_colors/font_color = Color(0.580392, 1, 0.45098, 1) +theme_override_font_sizes/font_size = 15 +text = "КАДР: —" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Transport" type="HBoxContainer" parent="SafeMargin/Content"] +custom_minimum_size = Vector2(0, 48) +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="PreviousButton" type="Button" parent="SafeMargin/Content/Transport"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 15 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "НАЗАД" + +[node name="PauseButton" type="Button" parent="SafeMargin/Content/Transport"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 15 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "ПАУЗА" + +[node name="ReplayButton" type="Button" parent="SafeMargin/Content/Transport"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 15 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "ПОВТОР" + +[node name="NextButton" type="Button" parent="SafeMargin/Content/Transport"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 15 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "ДАЛЕЕ" + +[node name="AutoButton" type="Button" parent="SafeMargin/Content/Transport"] +unique_name_in_owner = true +custom_minimum_size = Vector2(164, 0) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 13 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_button_pressed") +toggle_mode = true +text = "АВТОПОКАЗ: ВЫКЛ" + +[node name="CompositeButton" type="Button" parent="SafeMargin/Content"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 15 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +text = "СОСТАВНОЕ ДЕЙСТВИЕ: INTERACT" + +[node name="AnimationScroll" type="ScrollContainer" parent="SafeMargin/Content"] +layout_mode = 2 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="AnimationButtons" type="GridContainer" parent="SafeMargin/Content/AnimationScroll"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/h_separation = 8 +theme_override_constants/v_separation = 8 +columns = 2 + +[node name="AnimationButtonTemplate" type="Button" parent="SafeMargin/Content/AnimationScroll/AnimationButtons"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(0, 42) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 14 +theme_override_styles/normal = SubResource("StyleBoxFlat_button_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_button_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_button_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_button_pressed") +toggle_mode = true +text = "animation" + +[node name="Help" type="Label" parent="SafeMargin/Content"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +theme_override_colors/font_color = Color(0.8, 0.878431, 1, 1) +theme_override_font_sizes/font_size = 13 +text = "←/→ — выбрать • ПРОБЕЛ — пауза • R — повтор • ESC — галерея" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AutoTimer" type="Timer" parent="."] +unique_name_in_owner = true +one_shot = true diff --git a/tools/preview/preview.tscn b/tools/preview/preview.tscn new file mode 100644 index 0000000..66421ce --- /dev/null +++ b/tools/preview/preview.tscn @@ -0,0 +1,270 @@ +[gd_scene load_steps=8 format=3] + +[ext_resource type="Script" path="res://tools/preview/ThemeGallery.gd" id="1_gallery"] +[ext_resource type="Script" path="res://tools/preview/BindingOverlay.gd" id="2_overlay"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_top_bar"] +bg_color = Color(0.00392157, 0.027451, 0.0745098, 0.98) +border_width_bottom = 1 +border_color = Color(0.164706, 0.364706, 0.65098, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nav_normal"] +bg_color = Color(0.00392157, 0.027451, 0.0745098, 0.98) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nav_hover"] +bg_color = Color(0.0352941, 0.137255, 0.294118, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nav_pressed"] +bg_color = Color(0.458824, 0.823529, 0.364706, 1) + +[sub_resource type="ButtonGroup" id="ButtonGroup_pages"] + +[node name="ThemeGallery" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_gallery") + +[node name="Screens" type="TabContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 28.0 +grow_horizontal = 2 +grow_vertical = 2 +tabs_visible = false +use_hidden_tabs_for_min_size = true + +[node name="BindingOverlay" type="Control" parent="."] +z_index = 100 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("2_overlay") + +[node name="TopBar" type="PanelContainer" parent="."] +z_index = 101 +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 28.0 +grow_horizontal = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_top_bar") + +[node name="KeyboardPreviewToggle" type="Button" parent="."] +visible = false +z_index = 102 +layout_mode = 0 +offset_left = 4.0 +offset_top = 32.0 +offset_right = 174.0 +offset_bottom = 60.0 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +text = "KEYBOARD: OFF" + +[node name="ServicePreviewToggle" type="Button" parent="."] +visible = false +z_index = 102 +layout_mode = 0 +offset_left = 4.0 +offset_top = 64.0 +offset_right = 194.0 +offset_bottom = 92.0 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +text = "INVENTORY: OFF" + +[node name="Navigation" type="HBoxContainer" parent="TopBar"] +layout_mode = 2 +theme_override_constants/separation = 1 + +[node name="OverlayToggle" type="Button" parent="TopBar/Navigation"] +custom_minimum_size = Vector2(0, 27) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 1.65 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +text = "BINDINGS: ON" +toggle_mode = true + +[node name="Home" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 0 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "HOME" + +[node name="Cash" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 1 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "CASH" + +[node name="Sum" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 2 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "SUM" + +[node name="Keypad" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 3 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "KEYPAD" + +[node name="Card" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 4 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "CARD" + +[node name="Success" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 5 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "SUCCESS" + +[node name="Error" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 6 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "ERROR" + +[node name="Service" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 7 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "SERVICE" + +[node name="Settings" type="Button" parent="TopBar/Navigation"] +metadata/preview_tab_index = 8 +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nav_pressed") +toggle_mode = true +button_group = SubResource("ButtonGroup_pages") +text = "SETTINGS" + +[node name="PetPreview" type="Button" parent="TopBar/Navigation"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.92, 0.96, 1, 1) +theme_override_colors/font_hover_color = Color(1, 1, 1, 1) +theme_override_colors/font_pressed_color = Color(0.00392157, 0.0470588, 0.145098, 1) +theme_override_font_sizes/font_size = 11 +theme_override_styles/normal = SubResource("StyleBoxFlat_nav_normal") +theme_override_styles/hover = SubResource("StyleBoxFlat_nav_hover") +theme_override_styles/pressed = SubResource("StyleBoxFlat_nav_pressed") +text = "PET" diff --git a/tools/probe_pet_approach.gd.uid b/tools/probe_pet_approach.gd.uid new file mode 100644 index 0000000..18bd557 --- /dev/null +++ b/tools/probe_pet_approach.gd.uid @@ -0,0 +1 @@ +uid://bs0apv617wblm diff --git a/tools/qa_theme_manager_dialogs.gd.uid b/tools/qa_theme_manager_dialogs.gd.uid new file mode 100644 index 0000000..e854ff6 --- /dev/null +++ b/tools/qa_theme_manager_dialogs.gd.uid @@ -0,0 +1 @@ +uid://ceg323226xtfl diff --git a/tools/qa_theme_manager_plugin.gd.uid b/tools/qa_theme_manager_plugin.gd.uid new file mode 100644 index 0000000..0023725 --- /dev/null +++ b/tools/qa_theme_manager_plugin.gd.uid @@ -0,0 +1 @@ +uid://c62ukbn80gudy diff --git a/tools/validate_theme.gd b/tools/validate_theme.gd new file mode 100644 index 0000000..65c93a9 --- /dev/null +++ b/tools/validate_theme.gd @@ -0,0 +1,909 @@ +extends SceneTree + +const DEFAULT_CONTRACT := "res://contracts/screen_bindings.v2.json" +const MANIFEST_PATH := "res://exchanger_theme_dlc/manifest.json" +const PACKAGED_CONTRACT_PATH := "res://exchanger_theme_dlc/contracts/screen_bindings.v2.json" +const SELF_CONTAINED_VISUALS_META := &"exchanger_self_contained_visuals" +const CANONICAL_PACKAGE_ROOT := "res://exchanger_theme_dlc/" +const INTERACTIVE_PET_MANIFEST_FIELD := "InteractivePetScene" +const INTERACTIVE_PET_METHODS := [ + &"get_pet_animation_names", + &"get_pet_animation_frame_count", + &"has_pet_animation", + &"play_pet_animation", + &"pause_pet_animation", + &"stop_pet_animation", + &"get_current_pet_animation", + &"get_current_pet_frame", +] +const INTERACTIVE_PET_COMPOSITE_METHODS := [ + &"has_pet_composite_action", + &"start_pet_composite_action", + &"cancel_pet_composite_action", +] +const INTERACTIVE_PET_COMPOSITE_SIGNALS := [ + &"pet_composite_action_started", + &"pet_composite_action_finished", +] +const INTERACTIVE_PET_ACTIONS := [ + &"idle", + &"sit", + &"interact", + &"walk_left", + &"walk_right", + &"walk_start_left", + &"walk_start_right", + &"walk_finish_left", + &"walk_finish_right", + &"climb_start", + &"climb_up", + &"climb_down", + &"climb_finish", + &"drag", + &"drop", + &"landing", + &"celebrate", +] +const PET_NAVIGATION_ROOT_META := &"exchanger_pet_navigation_root" +const PET_SURFACE_META := &"exchanger_pet_surface" +const PET_SURFACE_VISIBILITY_BINDING_META := &"exchanger_pet_surface_visibility_binding_id" +const PET_CLIMB_EDGE_META := &"exchanger_pet_climb_edge" +const IMMUTABLE_BINDING_COUNT := 481 +const SUPPLEMENTAL_RUNTIME_BINDINGS := { + "screen.home": { + "home.scroll.content.advertisement_panel": ["Control"], + "home.scroll.content.stock_status.meter.empty": ["Control"], + "home.scroll.content.stock_status.meter.low": ["Control"], + "home.scroll.content.stock_status.meter.enough": ["Control"], + "home.scroll.content.stock_status.meter.much": ["Control"], + "home.scroll.content.stock_status.approximate_count": ["Label"], + }, + "screen.card_amount": { + "card_amount.content.reward_panel.content.bonus": ["Label"], + "card_amount.content.top_bar.home_navigation_button": ["Button"], + }, + "screen.cash_payment": { + "cash_payment.content.top_bar.home_navigation_button": ["Button"], + }, + "screen.card_custom_amount": { + "card_custom_amount.content.top_bar.home_navigation_button": ["Button"], + }, + "screen.card_terminal": { + "card_terminal.content.top_bar.home_navigation_button": ["Button"], + }, + "screen.success": { + "success.content.home_navigation_button": ["Button"], + }, + "screen.error": { + "error.content.home_navigation_button": ["Button"], + }, + "screen.service_access": { + "service_access.content.home_navigation_button": ["Button"], + }, + "screen.settings": { + "settings.footer": ["PanelContainer"], + "settings.footer.save_and_exit_button": ["Button"], + "settings.scroll.content.footer_clearance": ["Control"], + "settings.scroll.content.service_inventory_panel.margin.content.description": ["Label"], + "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled": ["CheckButton"], + "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled": ["CheckButton"], + "settings.scroll.content.menu_visibility_panel": ["PanelContainer"], + "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status": ["CheckButton"], + "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character": ["CheckButton"], + "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block": ["CheckButton"], + }, +} +const OPTIONAL_SUPPLEMENTAL_RUNTIME_BINDINGS := { + "screen.cash_payment": { + "cash_payment.content.banner_text": ["Label"], + }, + "screen.home": { + "home.decoration.custom_text_block": ["Control"], + "home.decoration.right_character": ["TextureRect"], + }, + "screen.settings": { + "settings.scroll.content.animated_banner_texts_panel": ["Control"], + "settings.scroll.content.advertisement_poster_panel.margin.content.select_button": ["Button"], + "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet": ["CheckButton"], + }, +} +const HOME_PET_SURFACE_VISIBILITY_BINDINGS := { + &"stock_window": "home.scroll.content.stock_status", + &"advertisement_window": "home.scroll.content.advertisement_panel", +} + +var _errors: PackedStringArray = [] + + +func _init() -> void: + call_deferred("_validate") + + +func _validate() -> void: + var contract_path := _argument_value("--contract", DEFAULT_CONTRACT) + var contract := _load_json(contract_path) + _expect(FileAccess.file_exists(PACKAGED_CONTRACT_PATH), "Packaged binding catalog is missing: %s" % PACKAGED_CONTRACT_PATH) + if FileAccess.file_exists(PACKAGED_CONTRACT_PATH): + _expect( + FileAccess.get_sha256(contract_path) == FileAccess.get_sha256(PACKAGED_CONTRACT_PATH), + "Packaged binding catalog differs from the builder authority" + ) + var manifest := _load_json(MANIFEST_PATH) + if contract.is_empty() or manifest.is_empty(): + _finish() + return + + var binding_count := 0 + for screen_value in contract.get("Screens", []): + binding_count += (screen_value as Dictionary).get("Bindings", []).size() + _expect( + binding_count == IMMUTABLE_BINDING_COUNT, + "immutable ThemeView contract must contain %d bindings; found %d" + % [IMMUTABLE_BINDING_COUNT, binding_count] + ) + + _expect(manifest.get("Format") == "ExchangerThemeDlc", "manifest Format must be ExchangerThemeDlc") + _expect(int(manifest.get("FormatVersion", 0)) == 2, "manifest FormatVersion must be 2") + _expect( + str(manifest.get("BackgroundTexturePath", "")).is_empty(), + "self-contained themes must keep manifest BackgroundTexturePath empty" + ) + _expect( + str(manifest.get("BackgroundDecorationPath", "")).is_empty(), + "self-contained themes must keep manifest BackgroundDecorationPath empty" + ) + _validate_interactive_pet(manifest) + var has_interactive_pet := not str(manifest.get(INTERACTIVE_PET_MANIFEST_FIELD, "")).is_empty() + + var screen_map: Dictionary = manifest.get("ScreenScenes", {}) + var global_bindings: Dictionary = {} + for screen_value in contract.get("Screens", []): + var screen: Dictionary = screen_value + var screen_id := str(screen.get("BindingId", "")) + var expected_path := str(screen.get("Path", "")) + var actual_path := str(screen_map.get(screen_id, "")) + _expect(actual_path == expected_path, "%s must map to %s" % [screen_id, expected_path]) + if actual_path != expected_path or not ResourceLoader.exists(actual_path): + _error("Scene is missing: %s" % expected_path) + continue + + var packed := load(actual_path) as PackedScene + if packed == null: + _error("Scene is not a PackedScene: %s" % actual_path) + continue + var root := packed.instantiate() + if root == null: + _error("Scene cannot be instantiated: %s" % actual_path) + continue + + _expect(root.name == StringName(str(screen.get("RootName", ""))), "%s root must be named %s" % [screen_id, screen.get("RootName", "")]) + var screen_metadata_key := str(contract.get("ScreenMetadataKey", "exchanger_screen_binding_id")) + _expect(str(root.get_meta(screen_metadata_key, "")) == screen_id, "%s root metadata must equal its screen binding id" % screen_id) + _validate_self_contained_visuals( + root, + screen_id, + bool(manifest.get("UseNearestTextureFilter", false)) + ) + if has_interactive_pet and screen_id != "screen.settings": + _validate_pet_navigation(root, screen_id) + _validate_bindings(root, screen, global_bindings, str(contract.get("ElementMetadataKey", "exchanger_binding_id"))) + _validate_fixed_slot_defaults(root, screen_id, str(contract.get("ElementMetadataKey", "exchanger_binding_id"))) + root.free() + + for manifest_screen in screen_map: + if not _contract_has_screen(contract, str(manifest_screen)): + _error("Unknown ScreenScenes key: %s" % manifest_screen) + + _finish() + + +func _validate_interactive_pet(manifest: Dictionary) -> void: + var scene_path := str(manifest.get(INTERACTIVE_PET_MANIFEST_FIELD, "")) + if scene_path.is_empty(): + return + _expect( + scene_path.begins_with(CANONICAL_PACKAGE_ROOT), + "%s must point inside %s" % [INTERACTIVE_PET_MANIFEST_FIELD, CANONICAL_PACKAGE_ROOT] + ) + _expect(not scene_path.contains(".."), "%s must not contain '..'" % INTERACTIVE_PET_MANIFEST_FIELD) + _expect(scene_path.ends_with(".tscn"), "%s must point to a .tscn scene" % INTERACTIVE_PET_MANIFEST_FIELD) + if not scene_path.begins_with(CANONICAL_PACKAGE_ROOT) or not ResourceLoader.exists(scene_path): + _error("Interactive pet scene is missing: %s" % scene_path) + return + var packed_scene := load(scene_path) as PackedScene + if packed_scene == null: + _error("Interactive pet resource is not a PackedScene: %s" % scene_path) + return + var pet := packed_scene.instantiate() + if pet == null: + _error("Interactive pet scene cannot be instantiated: %s" % scene_path) + return + _expect(pet is Node2D, "interactive pet root must inherit Node2D") + for method_name in INTERACTIVE_PET_METHODS: + _expect(pet.has_method(method_name), "interactive pet must expose %s()" % method_name) + _expect(pet.has_signal(&"pet_animation_started"), "interactive pet must expose pet_animation_started") + _expect(pet.has_signal(&"pet_animation_completed"), "interactive pet must expose pet_animation_completed") + _validate_optional_pet_profile(pet) + pet.free() + + +func _validate_optional_pet_profile(pet: Node) -> void: + var animation_names: Array[StringName] = [] + var raw_animation_names = pet.call(&"get_pet_animation_names") + if raw_animation_names is Array: + for raw_name in raw_animation_names: + animation_names.append(StringName(str(raw_name))) + + if pet.has_method(&"get_pet_action_animation"): + for action_name in INTERACTIVE_PET_ACTIONS: + var animation_name := StringName(str(pet.call(&"get_pet_action_animation", action_name))) + if not animation_name.is_empty(): + _expect( + animation_names.has(animation_name), + "interactive pet action %s maps to unknown animation %s" % [action_name, animation_name] + ) + + _validate_optional_composite_pet_action(pet) + + _validate_optional_positive_float(pet, &"get_pet_runtime_scale") + _validate_optional_positive_float(pet, &"get_pet_walk_speed") + _validate_optional_positive_float(pet, &"get_pet_climb_speed") + + var reference_size := Vector2.ZERO + if pet.has_method(&"get_pet_hit_size"): + var hit_size = pet.call(&"get_pet_hit_size") + _expect( + hit_size is Vector2 + and _is_finite_vector2(hit_size) + and hit_size.x > 0.0 + and hit_size.y > 0.0, + "get_pet_hit_size() must return a finite positive Vector2" + ) + if hit_size is Vector2: + reference_size = hit_size + elif pet.has_method(&"get_pet_preview_size"): + var preview_size = pet.call(&"get_pet_preview_size") + if preview_size is Vector2: + reference_size = preview_size + + if pet.has_method(&"get_pet_ground_offset"): + var ground_offset = pet.call(&"get_pet_ground_offset") + _expect( + ground_offset is Vector2 and _is_finite_vector2(ground_offset), + "get_pet_ground_offset() must return a finite Vector2" + ) + if ground_offset is Vector2 and reference_size.x > 0.0 and reference_size.y > 0.0: + _expect( + ground_offset.x >= 0.0 + and ground_offset.y >= 0.0 + and ground_offset.x <= reference_size.x + and ground_offset.y <= reference_size.y, + "get_pet_ground_offset() must stay inside pet hit/preview size" + ) + + +func _validate_optional_composite_pet_action(pet: Node) -> void: + var exposed_count := 0 + for method_name in INTERACTIVE_PET_COMPOSITE_METHODS: + if pet.has_method(method_name): + exposed_count += 1 + for signal_name in INTERACTIVE_PET_COMPOSITE_SIGNALS: + if pet.has_signal(signal_name): + exposed_count += 1 + if exposed_count == 0: + return + + for method_name in INTERACTIVE_PET_COMPOSITE_METHODS: + _expect( + pet.has_method(method_name), + "partial composite pet API: missing %s()" % method_name + ) + for signal_name in INTERACTIVE_PET_COMPOSITE_SIGNALS: + _expect( + pet.has_signal(signal_name), + "partial composite pet API: missing signal %s" % signal_name + ) + if exposed_count != INTERACTIVE_PET_COMPOSITE_METHODS.size() + INTERACTIVE_PET_COMPOSITE_SIGNALS.size(): + return + var supported = pet.call(&"has_pet_composite_action", &"interact") + _expect( + supported is bool, + "has_pet_composite_action() must return bool" + ) + + +func _validate_optional_positive_float(pet: Node, method_name: StringName) -> void: + if not pet.has_method(method_name): + return + var value := float(pet.call(method_name)) + _expect(is_finite(value) and value > 0.0, "%s() must return a finite positive value" % method_name) + + +func _validate_pet_navigation(screen_root: Node, screen_id: String) -> void: + var navigation_roots: Array[Node] = [] + for node in _all_nodes(screen_root): + if bool(node.get_meta(PET_NAVIGATION_ROOT_META, false)): + navigation_roots.append(node) + if navigation_roots.is_empty(): + _error("%s must contain one pet navigation root" % screen_id) + return + _expect(navigation_roots.size() == 1, "%s must contain exactly one pet navigation root" % screen_id) + if navigation_roots.size() != 1: + return + + var navigation_root := navigation_roots[0] + _expect(navigation_root is Node2D, "pet navigation root must inherit Node2D") + _expect( + int(navigation_root.get_meta(&"exchanger_pet_navigation_version", 0)) == 1, + "pet navigation root version must be 1" + ) + var bounds_value = navigation_root.get_meta(&"exchanger_pet_roaming_bounds", null) + _expect(typeof(bounds_value) == TYPE_RECT2, "pet navigation root must declare Rect2 roaming bounds") + var bounds := bounds_value as Rect2 if typeof(bounds_value) == TYPE_RECT2 else Rect2() + _expect( + _is_finite_rect2(bounds) and bounds.size.x > 0.0 and bounds.size.y > 0.0, + "pet roaming bounds must be finite and positive" + ) + + var surfaces: Dictionary = {} + var climb_edges: Array[Dictionary] = [] + var climb_ids: Dictionary = {} + for node in _all_nodes(navigation_root): + if bool(node.get_meta(PET_SURFACE_META, false)): + var surface_id := StringName(str(node.get_meta(&"exchanger_pet_surface_id", ""))) + _expect(not surface_id.is_empty(), "pet surface id must not be empty") + _expect(not surfaces.has(surface_id), "duplicate pet surface id %s" % surface_id) + var from_x := float(node.get_meta(&"exchanger_pet_surface_from_x", NAN)) + var to_x := float(node.get_meta(&"exchanger_pet_surface_to_x", NAN)) + var surface_y := float(node.get_meta(&"exchanger_pet_surface_y", NAN)) + _expect( + is_finite(from_x) and is_finite(to_x) and is_finite(surface_y) and from_x < to_x, + "pet surface %s must have finite from_x < to_x and y" % surface_id + ) + if _is_finite_rect2(bounds): + _expect( + _rect_contains_inclusive(bounds, Vector2(from_x, surface_y)) + and _rect_contains_inclusive(bounds, Vector2(to_x, surface_y)), + "pet surface %s must stay inside roaming bounds" % surface_id + ) + var sit_points = node.get_meta(&"exchanger_pet_surface_sit_points", PackedFloat32Array()) + var sit_type := typeof(sit_points) + _expect( + sit_type == TYPE_ARRAY or sit_type == TYPE_PACKED_FLOAT32_ARRAY, + "pet surface %s sit points must be an Array or PackedFloat32Array" % surface_id + ) + if sit_type == TYPE_ARRAY or sit_type == TYPE_PACKED_FLOAT32_ARRAY: + for raw_x in sit_points: + var sit_x := float(raw_x) + _expect( + is_finite(sit_x) and sit_x >= from_x and sit_x <= to_x, + "pet surface %s sit point must be finite and inside the surface" % surface_id + ) + if not surface_id.is_empty() and not surfaces.has(surface_id): + surfaces[surface_id] = {"from_x": from_x, "to_x": to_x, "y": surface_y} + if screen_id == "screen.home" and HOME_PET_SURFACE_VISIBILITY_BINDINGS.has(surface_id): + _expect( + str(node.get_meta(PET_SURFACE_VISIBILITY_BINDING_META, "")) + == str(HOME_PET_SURFACE_VISIBILITY_BINDINGS[surface_id]), + "pet surface %s must target visibility binding %s" + % [surface_id, HOME_PET_SURFACE_VISIBILITY_BINDINGS[surface_id]] + ) + + if bool(node.get_meta(PET_CLIMB_EDGE_META, false)): + var edge_id := StringName(str(node.get_meta(&"exchanger_pet_climb_edge_id", ""))) + _expect(not edge_id.is_empty(), "pet climb edge id must not be empty") + _expect(not climb_ids.has(edge_id), "duplicate pet climb edge id %s" % edge_id) + if not edge_id.is_empty(): + climb_ids[edge_id] = true + climb_edges.append({ + "id": edge_id, + "from": StringName(str(node.get_meta(&"exchanger_pet_climb_from_surface_id", ""))), + "to": StringName(str(node.get_meta(&"exchanger_pet_climb_to_surface_id", ""))), + "x": float(node.get_meta(&"exchanger_pet_climb_x", NAN)), + "from_y": float(node.get_meta(&"exchanger_pet_climb_from_y", NAN)), + "to_y": float(node.get_meta(&"exchanger_pet_climb_to_y", NAN)), + "side": StringName(str(node.get_meta(&"exchanger_pet_climb_side", ""))), + }) + + _expect(not surfaces.is_empty(), "pet navigation root must contain at least one surface") + var default_surface := StringName(str(navigation_root.get_meta(&"exchanger_pet_default_surface_id", ""))) + _expect( + not default_surface.is_empty() and surfaces.has(default_surface), + "pet navigation default surface must reference an existing surface" + ) + for edge in climb_edges: + _validate_pet_climb_edge(edge, surfaces, bounds) + + +func _validate_pet_climb_edge(edge: Dictionary, surfaces: Dictionary, bounds: Rect2) -> void: + var edge_id: StringName = edge.id + var from_id: StringName = edge.from + var to_id: StringName = edge.to + _expect(not from_id.is_empty() and surfaces.has(from_id), "pet climb edge %s has unknown from surface" % edge_id) + _expect(not to_id.is_empty() and surfaces.has(to_id), "pet climb edge %s has unknown to surface" % edge_id) + var x := float(edge.x) + var from_y := float(edge.from_y) + var to_y := float(edge.to_y) + _expect( + is_finite(x) and is_finite(from_y) and is_finite(to_y) and not is_equal_approx(from_y, to_y), + "pet climb edge %s must have finite coordinates and non-zero height" % edge_id + ) + _expect(edge.side == &"left" or edge.side == &"right", "pet climb edge %s side must be left or right" % edge_id) + if _is_finite_rect2(bounds): + _expect( + _rect_contains_inclusive(bounds, Vector2(x, from_y)) + and _rect_contains_inclusive(bounds, Vector2(x, to_y)), + "pet climb edge %s must stay inside roaming bounds" % edge_id + ) + if surfaces.has(from_id): + var from_surface: Dictionary = surfaces[from_id] + _expect( + x >= float(from_surface.from_x) + and x <= float(from_surface.to_x) + and is_equal_approx(from_y, float(from_surface.y)), + "pet climb edge %s must start on its from surface" % edge_id + ) + if surfaces.has(to_id): + var to_surface: Dictionary = surfaces[to_id] + _expect( + x >= float(to_surface.from_x) + and x <= float(to_surface.to_x) + and is_equal_approx(to_y, float(to_surface.y)), + "pet climb edge %s must end on its to surface" % edge_id + ) + + +func _is_finite_vector2(value: Vector2) -> bool: + return is_finite(value.x) and is_finite(value.y) + + +func _is_finite_rect2(value: Rect2) -> bool: + return _is_finite_vector2(value.position) and _is_finite_vector2(value.size) + + +func _rect_contains_inclusive(rect: Rect2, point: Vector2) -> bool: + return ( + point.x >= rect.position.x + and point.y >= rect.position.y + and point.x <= rect.end.x + and point.y <= rect.end.y + ) + + +func _validate_self_contained_visuals( + root: Node, + screen_id: String, + requires_nearest_filter: bool +) -> void: + _expect( + bool(root.get_meta(SELF_CONTAINED_VISUALS_META, false)), + "%s must declare exchanger_self_contained_visuals = true" % screen_id + ) + _expect(root is Control, "%s root must be a Control" % screen_id) + if root is Control: + _expect((root as Control).theme != null, "%s root must apply its package ui_theme" % screen_id) + if requires_nearest_filter: + _expect( + (root as Control).texture_filter == CanvasItem.TEXTURE_FILTER_NEAREST, + "%s root must use Nearest when manifest UseNearestTextureFilter is true" + % screen_id + ) + + var background := root.get_node_or_null("ThemeBackground") as TextureRect + _expect(background != null, "%s must contain ThemeBackground TextureRect" % screen_id) + if background != null: + _expect(background.texture != null, "%s ThemeBackground must have a texture" % screen_id) + _expect( + root.get_node_or_null("BackgroundDecoration") != null, + "%s must contain BackgroundDecoration" % screen_id + ) + + +func _validate_bindings(root: Node, screen: Dictionary, global_bindings: Dictionary, metadata_key: String) -> void: + var expected: Dictionary = {} + var screen_id := str(screen.get("BindingId", "")) + var supplemental: Dictionary = SUPPLEMENTAL_RUNTIME_BINDINGS.get(screen_id, {}) + var optional_supplemental: Dictionary = OPTIONAL_SUPPLEMENTAL_RUNTIME_BINDINGS.get(screen_id, {}) + for binding_value in screen.get("Bindings", []): + var binding: Dictionary = binding_value + expected[str(binding.get("Id", ""))] = binding + + var found: Dictionary = {} + for node in _all_nodes(root): + if not node.has_meta(metadata_key): + continue + var binding_id := str(node.get_meta(metadata_key)) + if binding_id.is_empty(): + _error("Empty exchanger_binding_id in %s at %s" % [screen.get("BindingId", ""), root.get_path_to(node)]) + continue + if found.has(binding_id): + _error("Duplicate binding %s inside %s" % [binding_id, screen.get("BindingId", "")]) + continue + if global_bindings.has(binding_id): + _error("Binding %s is reused by %s and %s" % [binding_id, global_bindings[binding_id], screen.get("BindingId", "")]) + found[binding_id] = node + global_bindings[binding_id] = screen.get("BindingId", "") + var allowed_types: Array = [] + if expected.has(binding_id): + allowed_types = expected[binding_id].get("Types", []) + elif supplemental.has(binding_id): + allowed_types = supplemental[binding_id] + elif optional_supplemental.has(binding_id): + allowed_types = optional_supplemental[binding_id] + else: + _error("Binding %s is not declared for %s" % [binding_id, screen_id]) + continue + if not allowed_types.is_empty() and not _is_any_class(node, allowed_types): + _error("Binding %s has type %s; expected %s" % [binding_id, node.get_class(), ", ".join(allowed_types)]) + + for binding_id in expected: + var binding: Dictionary = expected[binding_id] + if bool(binding.get("Required", true)) and not found.has(binding_id): + _error("Required binding %s is missing from %s" % [binding_id, screen.get("BindingId", "")]) + for binding_id in supplemental: + if not found.has(binding_id): + _error("Required runtime binding %s is missing from %s" % [binding_id, screen_id]) + + +func _validate_fixed_slot_defaults(root: Node, screen_id: String, metadata_key: String) -> void: + var bindings: Dictionary = {} + for node in _all_nodes(root): + if node.has_meta(metadata_key): + bindings[str(node.get_meta(metadata_key))] = node + + if screen_id == "screen.home": + var speech_text := bindings.get("home.scroll.content.speech_text") as Label + if speech_text != null: + _expect(speech_text.autowrap_mode != TextServer.AUTOWRAP_OFF, "HOME speech text must wrap") + _expect(speech_text.clip_text, "HOME speech text must clip overflow") + _expect( + speech_text.horizontal_alignment == HORIZONTAL_ALIGNMENT_CENTER, + "HOME speech text must be horizontally centered" + ) + _expect( + speech_text.vertical_alignment == VERTICAL_ALIGNMENT_CENTER, + "HOME speech text must be vertically centered" + ) + return + + if screen_id == "screen.cash_payment": + var cash_caption := root.get_node_or_null( + "SafeMargin/Content/Summary/Margin/Values/Caption" + ) as Label + _expect(cash_caption != null, "CASH PAYMENT summary Caption is missing") + if cash_caption != null: + _expect(cash_caption.text == "К ВЫДАЧЕ", "CASH PAYMENT summary Caption must be К ВЫДАЧЕ") + return + + if screen_id == "screen.card_amount": + for index in range(16): + var slot_id := "card_amount.content.amount_panel.margin.content.preset_grid.slot_%02d" % index + var slot := bindings.get(slot_id) as CanvasItem + if slot != null and index >= 8: + _expect(not slot.visible, "%s must be hidden by default" % slot_id) + var card_amount_value_id := "card_amount.content.reward_panel.content.value" + var card_amount_bonus_id := "card_amount.content.reward_panel.content.bonus" + var card_amount_value := bindings.get(card_amount_value_id) as Label + var card_amount_bonus := bindings.get(card_amount_bonus_id) as Label + _expect( + root.get_node_or_null("SafeMargin/Content/RewardPanel/Content/Value") == card_amount_value, + "%s must keep the canonical Value path" % card_amount_value_id + ) + _expect( + root.get_node_or_null("SafeMargin/Content/RewardPanel/Content/Bonus") == card_amount_bonus, + "%s must use the canonical Bonus path" % card_amount_bonus_id + ) + if card_amount_value != null and card_amount_bonus != null: + _expect( + card_amount_bonus.get_index() == card_amount_value.get_index() + 1, + "%s must be placed immediately after Value" % card_amount_bonus_id + ) + _expect( + card_amount_bonus.position.x > card_amount_value.position.x, + "%s must be laid out to the right of Value" % card_amount_bonus_id + ) + _expect( + card_amount_bonus.text == "БЕЗ БОНУСА", + "%s default text must be БЕЗ БОНУСА" % card_amount_bonus_id + ) + return + + if screen_id == "screen.card_custom_amount": + var clear_button := bindings.get( + "card_custom_amount.content.keypad_panel.content.keypad.clear_button" + ) as Button + if clear_button != null: + _expect(clear_button.visible, "card custom amount clear button must be visible") + _expect(clear_button.text == "СТЕРЕТЬ", "card custom amount clear button text must be СТЕРЕТЬ") + _expect_visible_default( + bindings, + "card_custom_amount.content.keypad_panel.content.keypad.backspace_button", + false + ) + var custom_amount_id := "card_custom_amount.content.amount_panel.margin.values.amount" + var custom_bonus_id := "card_custom_amount.content.amount_panel.margin.values.tokens" + var custom_amount := bindings.get(custom_amount_id) as Label + var custom_bonus := bindings.get(custom_bonus_id) as Label + _expect( + root.get_node_or_null("SafeMargin/Content/AmountPanel/Margin/Values/Amount") == custom_amount, + "%s must keep the canonical Amount path" % custom_amount_id + ) + _expect( + root.get_node_or_null("SafeMargin/Content/AmountPanel/Margin/Values/Tokens") == custom_bonus, + "%s must keep the canonical Tokens path" % custom_bonus_id + ) + if custom_amount != null and custom_bonus != null: + _expect( + custom_bonus.position.x > custom_amount.position.x, + "%s must be laid out to the right of Amount" % custom_bonus_id + ) + _expect( + custom_bonus.text == "+ 50 ЖЕТОНОВ\nВ ПОДАРОК", + "%s default text must use the two-line bonus format" % custom_bonus_id + ) + return + + if screen_id != "screen.settings": + return + + var short_text := bindings.get("settings.scroll.content.branding_panel.margin.content.short_text") as LineEdit + if short_text != null: + _expect(short_text.max_length == 48, "SETTINGS short text must be limited to 48 characters") + + var branding_content_path := "SafeMargin/Scroll/Content/BrandingPanel/Margin/Content" + var application_name_label := root.get_node_or_null( + "%s/ApplicationNameLabel" % branding_content_path + ) as Label + if application_name_label != null: + _expect(not application_name_label.visible, "SETTINGS application name label must be hidden") + var short_text_label := root.get_node_or_null( + "%s/ShortTextLabel" % branding_content_path + ) as Label + if short_text_label != null: + _expect( + short_text_label.text == "СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ", + "SETTINGS short text label must be СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ" + ) + + for hidden_binding_id in [ + "settings.scroll.content.branding_panel.margin.content.application_name", + "settings.scroll.content.branding_panel.margin.content.application_name_error", + "settings.scroll.content.branding_preview_panel", + "settings.scroll.content.branding_preview_panel.margin.content.application_name", + "settings.scroll.content.branding_preview_panel.margin.content.short_text", + "settings.scroll.content.branding_preview_panel.margin.content.support_phone", + ]: + _expect_visible_default(bindings, hidden_binding_id, false) + + _expect_visible_default( + bindings, + "settings.scroll.content.service_inventory_panel", + false + ) + var service_inventory_panel := bindings.get("settings.scroll.content.service_inventory_panel") as Control + if service_inventory_panel != null: + _expect( + is_equal_approx(service_inventory_panel.custom_minimum_size.y, 772.0), + "settings.scroll.content.service_inventory_panel minimum height must be 772" + ) + var inventory_description_id := "settings.scroll.content.service_inventory_panel.margin.content.description" + var inventory_description := bindings.get(inventory_description_id) as Label + if inventory_description != null: + var canonical_inventory_description := root.get_node_or_null( + "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/Description" + ) + _expect( + canonical_inventory_description == inventory_description, + "%s must use the canonical Description path" % inventory_description_id + ) + var inventory_enabled_id := "settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled" + var inventory_enabled := bindings.get(inventory_enabled_id) as CheckButton + if inventory_enabled != null: + _expect(inventory_enabled.button_pressed, "%s must be enabled by default" % inventory_enabled_id) + _expect( + inventory_enabled.text == "УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ", + "%s text must be УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ" % inventory_enabled_id + ) + var canonical_inventory_enabled := root.get_node_or_null( + "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/InventoryAccountingEnabled" + ) + _expect( + canonical_inventory_enabled == inventory_enabled, + "%s must use the canonical InventoryAccountingEnabled path" % inventory_enabled_id + ) + if inventory_description != null: + _expect( + inventory_enabled.get_index() == inventory_description.get_index() + 1, + "%s must be placed immediately after Description" % inventory_enabled_id + ) + var purchase_limit_id := "settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled" + var purchase_limit := bindings.get(purchase_limit_id) as CheckButton + if purchase_limit != null: + _expect(purchase_limit.button_pressed, "%s must be enabled by default" % purchase_limit_id) + _expect( + purchase_limit.text == "НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА", + "%s text must be НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА" % purchase_limit_id + ) + var canonical_purchase_limit := root.get_node_or_null( + "SafeMargin/Scroll/Content/ServiceInventoryPanel/Margin/Content/PurchaseLimitEnabled" + ) + _expect( + canonical_purchase_limit == purchase_limit, + "%s must use the canonical PurchaseLimitEnabled path" % purchase_limit_id + ) + if inventory_enabled != null: + _expect( + purchase_limit.get_index() == inventory_enabled.get_index() + 1, + "%s must be placed immediately after InventoryAccountingEnabled" % purchase_limit_id + ) + _expect_visible_default( + bindings, + "settings.scroll.content.menu_visibility_panel", + false + ) + for binding_id in [ + "settings.scroll.content.menu_visibility_panel.margin.content.show_stock_status", + "settings.scroll.content.menu_visibility_panel.margin.content.show_right_character", + "settings.scroll.content.menu_visibility_panel.margin.content.show_promotion_block", + "settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet", + ]: + var toggle := bindings.get(binding_id) as CheckButton + if toggle != null: + _expect(toggle.button_pressed, "%s must be enabled by default" % binding_id) + + var footer := bindings.get("settings.footer") as PanelContainer + var save_and_exit := bindings.get("settings.footer.save_and_exit_button") as Button + var footer_clearance := bindings.get("settings.scroll.content.footer_clearance") as Control + var settings_scroll := bindings.get("settings.scroll") as ScrollContainer + var scroll_content := bindings.get("settings.scroll.content") as Control + if footer != null: + _expect(footer.visible, "settings.footer must be visible by default") + _expect(footer.get_parent() == root, "settings.footer must be a root sibling of SafeMargin") + _expect( + is_equal_approx(footer.anchor_top, 1.0) and is_equal_approx(footer.anchor_bottom, 1.0), + "settings.footer must stay anchored to the bottom edge" + ) + if save_and_exit != null: + _expect( + save_and_exit.get_parent() == footer, + "settings.footer.save_and_exit_button must be a direct child of settings.footer" + ) + _expect(save_and_exit.text == "СОХРАНИТЬ И ВЫЙТИ", "settings footer button text is invalid") + if footer_clearance != null: + _expect( + footer_clearance.get_parent() == scroll_content, + "settings.scroll.content.footer_clearance must be a direct child of scroll content" + ) + _expect( + footer_clearance.custom_minimum_size.y >= 104.0, + "settings.scroll.content.footer_clearance must reserve the footer height" + ) + if settings_scroll != null: + _expect( + settings_scroll.size_flags_vertical == Control.SIZE_SHRINK_BEGIN, + "settings.scroll must shrink from the bottom to avoid the fixed footer" + ) + _expect( + settings_scroll.custom_minimum_size.y <= 1100.0, + "settings.scroll must leave room for the fixed footer at 720x1280" + ) + _expect_visible_default( + bindings, + "settings.service_dialog_overlay", + false + ) + var service_amount := bindings.get("settings.service_dialog_overlay.dialog.margin.content.amount") as SpinBox + if service_amount != null: + _expect(service_amount.min_value == 0.0, "SETTINGS service amount must allow zero") + _expect(service_amount.max_value >= 999999.0, "SETTINGS service amount must accept large inventory totals") + _expect(service_amount.suffix.is_empty(), "SETTINGS service amount must not reserve space for a suffix") + + _expect_visible_default( + bindings, + "settings.scroll.content.bonus_panel.margin.content.rows.empty_state", + true + ) + _expect_visible_default( + bindings, + "settings.scroll.content.card_options_panel.margin.content.preset_rows.empty_state", + false + ) + _expect_visible_default( + bindings, + "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.empty_state", + true + ) + for index in range(16): + var bonus_id := "settings.scroll.content.bonus_panel.margin.content.rows.slot_%02d.bonus" % index + var bonus_field := bindings.get(bonus_id) as SpinBox + if bonus_field != null: + _expect( + bonus_field.suffix.is_empty(), + "%s must not have a suffix so multi-digit token counts remain visible" % bonus_id + ) + _expect_visible_default( + bindings, + "settings.scroll.content.bonus_panel.margin.content.rows.slot_%02d" % index, + false + ) + _expect_visible_default( + bindings, + "settings.scroll.content.card_options_panel.margin.content.preset_rows.slot_%02d" % index, + index < 8 + ) + for index in range(12): + _expect_visible_default( + bindings, + "settings.scroll.content.advertisement_playlist_panel.margin.content.rows.slot_%02d" % index, + false + ) + + +func _expect_visible_default(bindings: Dictionary, binding_id: String, expected: bool) -> void: + var item := bindings.get(binding_id) as CanvasItem + if item != null: + _expect(item.visible == expected, "%s default visibility must be %s" % [binding_id, expected]) + + +func _all_nodes(root: Node) -> Array[Node]: + var result: Array[Node] = [root] + var cursor := 0 + while cursor < result.size(): + var current := result[cursor] + for child in current.get_children(): + result.append(child) + cursor += 1 + return result + + +func _is_any_class(node: Node, allowed_types: Array) -> bool: + for type_value in allowed_types: + if node.is_class(str(type_value)): + return true + return false + + +func _contract_has_screen(contract: Dictionary, binding_id: String) -> bool: + for screen_value in contract.get("Screens", []): + if str(screen_value.get("BindingId", "")) == binding_id: + return true + return false + + +func _load_json(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + _error("JSON file is missing: %s" % path) + return {} + var value = JSON.parse_string(FileAccess.get_file_as_string(path)) + if not value is Dictionary: + _error("JSON root must be an object: %s" % path) + return {} + return value + + +func _argument_value(name: String, fallback: String) -> String: + var args := OS.get_cmdline_user_args() + var index := args.find(name) + if index >= 0 and index + 1 < args.size(): + return args[index + 1] + return fallback + + +func _expect(condition: bool, message: String) -> void: + if not condition: + _error(message) + + +func _error(message: String) -> void: + _errors.append(message) + + +func _finish() -> void: + if _errors.is_empty(): + print("[Theme Validator] OK: full-scene contract is valid.") + quit(0) + return + for message in _errors: + push_error("[Theme Validator] %s" % message) + print("[Theme Validator] FAILED: %d error(s)." % _errors.size()) + quit(1) diff --git a/tools/validate_theme.gd.uid b/tools/validate_theme.gd.uid new file mode 100644 index 0000000..0ae02ef --- /dev/null +++ b/tools/validate_theme.gd.uid @@ -0,0 +1 @@ +uid://cvvrmtg44julo diff --git a/tools/verify_interactive_pet.gd b/tools/verify_interactive_pet.gd new file mode 100644 index 0000000..0f6e6d8 --- /dev/null +++ b/tools/verify_interactive_pet.gd @@ -0,0 +1,601 @@ +extends SceneTree + +const ACTIVE_STATE_PATH := "res://build/active-theme.json" +const CANONICAL_PACKAGE_ROOT := "res://exchanger_theme_dlc" +const PACKAGED_MANIFEST_PATH := "res://exchanger_theme_dlc/manifest.json" +const PET_MANIFEST_FIELD := "InteractivePetScene" +const PET_COMPONENT_RELATIVE_PATH := "components/interactive_pet.tscn" +const LEGACY_PET_COMPONENT_RELATIVE_PATH := "components/alien_pet.tscn" +const REQUIRED_METHODS := [ + &"get_pet_animation_names", + &"get_pet_animation_frame_count", + &"has_pet_animation", + &"play_pet_animation", + &"pause_pet_animation", + &"stop_pet_animation", + &"get_current_pet_animation", + &"get_current_pet_frame", +] +const COMPOSITE_METHODS := [ + &"has_pet_composite_action", + &"start_pet_composite_action", + &"cancel_pet_composite_action", +] +const COMPOSITE_SIGNALS := [ + &"pet_composite_action_started", + &"pet_composite_action_finished", +] +const INTERACTIVE_PET_ACTIONS := [ + &"idle", + &"sit", + &"interact", + &"walk_left", + &"walk_right", + &"walk_start_left", + &"walk_start_right", + &"walk_finish_left", + &"walk_finish_right", + &"climb_start", + &"climb_up", + &"climb_down", + &"climb_finish", + &"drag", + &"drop", + &"landing", + &"celebrate", +] +const PET_NAVIGATION_ROOT_META := &"exchanger_pet_navigation_root" +const PET_SURFACE_META := &"exchanger_pet_surface" +const PET_CLIMB_EDGE_META := &"exchanger_pet_climb_edge" + + +func _init() -> void: + call_deferred("_verify") + + +func _verify() -> void: + var failures := PackedStringArray() + var pack_path := _argument_value("--pack", "") + var explicit_scene_path := _argument_value("--scene", "") + var optional := OS.get_cmdline_user_args().has("--optional") + var pet_scene_path := "" + var package_root := "" + + if not pack_path.is_empty(): + if not ProjectSettings.load_resource_pack(pack_path, false): + _fail("Cannot mount PCK %s." % pack_path) + return + package_root = CANONICAL_PACKAGE_ROOT + pet_scene_path = _resolve_packaged_scene_path(explicit_scene_path) + else: + package_root = _resolve_builder_package_root() + pet_scene_path = _resolve_builder_scene_path(explicit_scene_path) + + if pet_scene_path.is_empty(): + if optional: + print("[Interactive Pet] SKIP: theme does not declare an interactive pet.") + quit(0) + return + _fail("Theme does not declare an interactive pet scene.") + return + + var packed_scene := load(pet_scene_path) as PackedScene + if packed_scene == null: + _fail("Cannot load %s." % pet_scene_path) + return + + var instance := packed_scene.instantiate() + if not instance is Node2D: + instance.queue_free() + _fail("Interactive pet root must inherit Node2D: %s." % pet_scene_path) + return + var pet := instance as Node2D + root.add_child(pet) + await process_frame + + for method_name in REQUIRED_METHODS: + if not pet.has_method(method_name): + failures.append("Missing public method %s()." % method_name) + _expect_signal(pet, &"pet_animation_started", failures) + _expect_signal(pet, &"pet_animation_completed", failures) + if not failures.is_empty(): + _finish(failures, pet_scene_path, 0, 0, 0, 0) + return + + var animation_names: Array[StringName] = [] + var raw_names = pet.call(&"get_pet_animation_names") + if not raw_names is Array: + failures.append("get_pet_animation_names() must return an Array.") + else: + for raw_name in raw_names: + var animation_name := StringName(str(raw_name)) + if animation_name.is_empty(): + failures.append("Animation names must not be empty.") + elif animation_names.has(animation_name): + failures.append("Duplicate animation name %s." % animation_name) + else: + animation_names.append(animation_name) + if animation_names.is_empty(): + failures.append("Interactive pet must expose at least one animation.") + + var initial_position := pet.position + var total_frames := 0 + for animation_name in animation_names: + if not bool(pet.call(&"has_pet_animation", animation_name)): + failures.append("has_pet_animation() rejected %s." % animation_name) + continue + var frame_count := int(pet.call(&"get_pet_animation_frame_count", animation_name)) + if frame_count <= 0: + failures.append("Animation %s must contain at least one frame." % animation_name) + else: + total_frames += frame_count + if not bool(pet.call(&"play_pet_animation", animation_name)): + failures.append("play_pet_animation() rejected %s." % animation_name) + + await create_timer(0.25).timeout + if pet.position != initial_position: + failures.append("Animation playback changed the pet root position.") + await _validate_optional_visual_offset(pet, animation_names, failures) + if pet.has_method(&"get_pet_preview_size"): + var preview_size = pet.call(&"get_pet_preview_size") + if not preview_size is Vector2 or preview_size.x <= 0.0 or preview_size.y <= 0.0: + failures.append("get_pet_preview_size() must return a positive Vector2.") + _validate_optional_pet_profile(pet, animation_names, failures) + _validate_landing_animation(pet, animation_names, failures) + _validate_optional_composite_action(pet, failures) + var navigation_counts := _validate_pet_navigation(package_root, failures) + + _finish( + failures, + pet_scene_path, + animation_names.size(), + total_frames, + navigation_counts.x, + navigation_counts.y + ) + + +func _validate_optional_composite_action(pet: Node, failures: PackedStringArray) -> void: + var exposed_count := 0 + for method_name in COMPOSITE_METHODS: + if pet.has_method(method_name): + exposed_count += 1 + for signal_name in COMPOSITE_SIGNALS: + if pet.has_signal(signal_name): + exposed_count += 1 + if exposed_count == 0: + return + + for method_name in COMPOSITE_METHODS: + if not pet.has_method(method_name): + failures.append("Partial composite pet API: missing %s()." % method_name) + for signal_name in COMPOSITE_SIGNALS: + if not pet.has_signal(signal_name): + failures.append("Partial composite pet API: missing signal %s." % signal_name) + if exposed_count != COMPOSITE_METHODS.size() + COMPOSITE_SIGNALS.size(): + return + var supported = pet.call(&"has_pet_composite_action", &"interact") + if not supported is bool: + failures.append("has_pet_composite_action() must return bool.") + + +func _resolve_builder_scene_path(explicit_scene_path: String) -> String: + if not explicit_scene_path.is_empty(): + return explicit_scene_path + var package_path := _resolve_builder_package_root() + if package_path.is_empty(): + return "" + var manifest := _load_json(package_path.path_join("manifest.json")) + return _resolve_scene_from_manifest(package_path, manifest) + + +func _resolve_builder_package_root() -> String: + var theme_id := _argument_value("--theme", "") + var package_path := "" + if not theme_id.is_empty(): + package_path = "res://themes/%s/package" % theme_id + else: + var state := _load_json(ACTIVE_STATE_PATH) + package_path = ProjectSettings.localize_path(str(state.get("Package", ""))) + package_path = package_path.replace("\\", "/").trim_suffix("/") + if not package_path.begins_with("res://"): + return "" + return package_path + + +func _resolve_packaged_scene_path(explicit_scene_path: String) -> String: + if not explicit_scene_path.is_empty(): + return explicit_scene_path + var manifest := _load_json(PACKAGED_MANIFEST_PATH) + return _resolve_scene_from_manifest(CANONICAL_PACKAGE_ROOT, manifest) + + +func _resolve_scene_from_manifest(package_root: String, manifest: Dictionary) -> String: + var declared_path := str(manifest.get(PET_MANIFEST_FIELD, "")) + var candidates := PackedStringArray() + if not declared_path.is_empty(): + var relative_path := _package_relative_path(declared_path) + if not relative_path.is_empty(): + candidates.append(relative_path) + candidates.append(PET_COMPONENT_RELATIVE_PATH) + candidates.append(LEGACY_PET_COMPONENT_RELATIVE_PATH) + for relative_path in candidates: + var candidate := package_root.path_join(relative_path) + if ResourceLoader.exists(candidate): + return candidate + return "" + + +func _package_relative_path(resource_path: String) -> String: + var normalized := resource_path.replace("\\", "/") + if normalized.contains(".."): + return "" + if normalized.begins_with(CANONICAL_PACKAGE_ROOT + "/"): + return normalized.trim_prefix(CANONICAL_PACKAGE_ROOT + "/") + if normalized.begins_with("res://"): + return "" + return normalized.trim_prefix("/") + + +func _expect_signal(pet: Node, signal_name: StringName, failures: PackedStringArray) -> void: + if not pet.has_signal(signal_name): + failures.append("Missing public signal %s." % signal_name) + + +func _validate_optional_visual_offset( + pet: Node2D, + animation_names: Array[StringName], + failures: PackedStringArray +) -> void: + var has_current_offset := pet.has_method(&"get_pet_visual_offset") + var has_animation_offset := pet.has_method(&"get_pet_animation_visual_offset") + if has_current_offset != has_animation_offset: + failures.append("Pet visual offset introspection methods must be provided together.") + return + if not has_current_offset: + return + if not animation_names.has(&"sitting"): + failures.append("A pet exposing get_pet_visual_offset() must provide sitting.") + return + var non_sitting_animation := &"" + for animation_name in animation_names: + if animation_name != &"sitting": + non_sitting_animation = animation_name + break + if non_sitting_animation.is_empty(): + failures.append("A pet exposing get_pet_visual_offset() must provide a non-sitting animation.") + return + if pet.call(&"get_pet_animation_visual_offset", &"sitting") != Vector2(0.0, 24.0): + failures.append("Declared sitting visual offset must be Vector2(0, 24).") + if pet.call(&"get_pet_animation_visual_offset", non_sitting_animation) != Vector2.ZERO: + failures.append("Declared non-sitting visual offset must be Vector2.ZERO.") + + var initial_root_position := pet.position + pet.call(&"play_pet_animation", &"sitting") + await process_frame + if pet.call(&"get_pet_visual_offset") != Vector2(0.0, 24.0): + failures.append("Sitting visual offset must be Vector2(0, 24).") + + pet.call(&"play_pet_animation", non_sitting_animation) + await process_frame + if pet.call(&"get_pet_visual_offset") != Vector2.ZERO: + failures.append("Non-sitting visual offset must be Vector2.ZERO.") + + pet.call(&"play_pet_animation", &"sitting") + await process_frame + if pet.call(&"get_pet_visual_offset") != Vector2(0.0, 24.0): + failures.append("Returning to sitting must restore Vector2(0, 24) visual offset.") + if pet.position != initial_root_position: + failures.append("Visual offset switching changed the pet root position.") + + +func _validate_optional_pet_profile( + pet: Node, + animation_names: Array[StringName], + failures: PackedStringArray +) -> void: + if pet.has_method(&"get_pet_action_animation"): + for action_name in INTERACTIVE_PET_ACTIONS: + var animation_name := StringName(str(pet.call(&"get_pet_action_animation", action_name))) + if not animation_name.is_empty() and not animation_names.has(animation_name): + failures.append("Pet action %s maps to unknown animation %s." % [action_name, animation_name]) + + _validate_positive_float_method(pet, &"get_pet_runtime_scale", failures) + _validate_positive_float_method(pet, &"get_pet_walk_speed", failures) + _validate_positive_float_method(pet, &"get_pet_climb_speed", failures) + + var reference_size := Vector2.ZERO + if pet.has_method(&"get_pet_hit_size"): + var hit_size = pet.call(&"get_pet_hit_size") + if ( + not hit_size is Vector2 + or not _is_finite_vector2(hit_size) + or hit_size.x <= 0.0 + or hit_size.y <= 0.0 + ): + failures.append("get_pet_hit_size() must return a finite positive Vector2.") + elif hit_size is Vector2: + reference_size = hit_size + elif pet.has_method(&"get_pet_preview_size"): + var preview_size = pet.call(&"get_pet_preview_size") + if preview_size is Vector2: + reference_size = preview_size + + if pet.has_method(&"get_pet_ground_offset"): + var ground_offset = pet.call(&"get_pet_ground_offset") + if not ground_offset is Vector2 or not _is_finite_vector2(ground_offset): + failures.append("get_pet_ground_offset() must return a finite Vector2.") + elif ( + reference_size.x > 0.0 + and reference_size.y > 0.0 + and ( + ground_offset.x < 0.0 + or ground_offset.y < 0.0 + or ground_offset.x > reference_size.x + or ground_offset.y > reference_size.y + ) + ): + failures.append("get_pet_ground_offset() must stay inside pet hit/preview size.") + + +func _validate_landing_animation( + pet: Node, + animation_names: Array[StringName], + failures: PackedStringArray +) -> void: + if not animation_names.has(&"landing"): + return + if not bool(pet.call(&"has_pet_animation", &"landing")): + failures.append("Direct landing animation is not playable.") + return + if pet.has_method(&"is_pet_animation_looping") and bool( + pet.call(&"is_pet_animation_looping", &"landing") + ): + failures.append("Direct landing animation must be one-shot, not looping.") + + +func _validate_positive_float_method( + pet: Node, + method_name: StringName, + failures: PackedStringArray +) -> void: + if not pet.has_method(method_name): + return + var value := float(pet.call(method_name)) + if not is_finite(value) or value <= 0.0: + failures.append("%s() must return a finite positive value." % method_name) + + +func _validate_pet_navigation(package_root: String, failures: PackedStringArray) -> Vector2i: + if package_root.is_empty(): + failures.append("Cannot resolve theme package root for pet navigation validation.") + return Vector2i.ZERO + var manifest := _load_json(package_root.path_join("manifest.json")) + var screen_map: Dictionary = manifest.get("ScreenScenes", {}) + var totals := Vector2i.ZERO + for screen_id_value in screen_map: + var screen_id := str(screen_id_value) + if screen_id == "screen.settings": + continue + var declared_path := str(screen_map.get(screen_id, "")) + var relative_path := _package_relative_path(declared_path) + var scene_path := package_root.path_join(relative_path) + var packed_scene := load(scene_path) as PackedScene + if packed_scene == null: + failures.append("Cannot load %s pet navigation scene: %s." % [screen_id, scene_path]) + continue + var screen_root := packed_scene.instantiate() + if screen_root == null: + failures.append("Cannot instantiate %s pet navigation scene: %s." % [screen_id, scene_path]) + continue + + var roots: Array[Node] = [] + for node in _all_nodes(screen_root): + if bool(node.get_meta(PET_NAVIGATION_ROOT_META, false)): + roots.append(node) + if roots.size() != 1: + failures.append("%s must contain exactly one pet navigation root." % screen_id) + screen_root.free() + continue + + totals += _validate_pet_navigation_root(roots[0], failures, screen_id) + screen_root.free() + return totals + + +func _validate_pet_navigation_root( + navigation_root: Node, + failures: PackedStringArray, + screen_id: String +) -> Vector2i: + if not navigation_root is Node2D: + failures.append("%s pet navigation root must inherit Node2D." % screen_id) + if int(navigation_root.get_meta(&"exchanger_pet_navigation_version", 0)) != 1: + failures.append("%s pet navigation root version must be 1." % screen_id) + var bounds_value = navigation_root.get_meta(&"exchanger_pet_roaming_bounds", null) + var bounds := bounds_value as Rect2 if typeof(bounds_value) == TYPE_RECT2 else Rect2() + if ( + typeof(bounds_value) != TYPE_RECT2 + or not _is_finite_rect2(bounds) + or bounds.size.x <= 0.0 + or bounds.size.y <= 0.0 + ): + failures.append("%s pet roaming bounds must be a finite positive Rect2." % screen_id) + + var surfaces: Dictionary = {} + var climb_edges: Array[Dictionary] = [] + var climb_ids: Dictionary = {} + for node in _all_nodes(navigation_root): + if bool(node.get_meta(PET_SURFACE_META, false)): + _validate_pet_surface(node, surfaces, bounds, failures) + if bool(node.get_meta(PET_CLIMB_EDGE_META, false)): + var edge_id := StringName(str(node.get_meta(&"exchanger_pet_climb_edge_id", ""))) + if edge_id.is_empty(): + failures.append("Pet climb edge id must not be empty.") + elif climb_ids.has(edge_id): + failures.append("Duplicate pet climb edge id %s." % edge_id) + else: + climb_ids[edge_id] = true + climb_edges.append({ + "id": edge_id, + "from": StringName(str(node.get_meta(&"exchanger_pet_climb_from_surface_id", ""))), + "to": StringName(str(node.get_meta(&"exchanger_pet_climb_to_surface_id", ""))), + "x": float(node.get_meta(&"exchanger_pet_climb_x", NAN)), + "from_y": float(node.get_meta(&"exchanger_pet_climb_from_y", NAN)), + "to_y": float(node.get_meta(&"exchanger_pet_climb_to_y", NAN)), + "side": StringName(str(node.get_meta(&"exchanger_pet_climb_side", ""))), + }) + + if surfaces.is_empty(): + failures.append("%s pet navigation root must contain at least one surface." % screen_id) + var default_surface := StringName(str(navigation_root.get_meta(&"exchanger_pet_default_surface_id", ""))) + if default_surface.is_empty() or not surfaces.has(default_surface): + failures.append("%s pet navigation default surface must reference an existing surface." % screen_id) + for edge in climb_edges: + _validate_pet_climb_edge(edge, surfaces, bounds, failures) + return Vector2i(surfaces.size(), climb_edges.size()) + + +func _validate_pet_surface( + node: Node, + surfaces: Dictionary, + bounds: Rect2, + failures: PackedStringArray +) -> void: + var surface_id := StringName(str(node.get_meta(&"exchanger_pet_surface_id", ""))) + if surface_id.is_empty(): + failures.append("Pet surface id must not be empty.") + return + if surfaces.has(surface_id): + failures.append("Duplicate pet surface id %s." % surface_id) + return + var from_x := float(node.get_meta(&"exchanger_pet_surface_from_x", NAN)) + var to_x := float(node.get_meta(&"exchanger_pet_surface_to_x", NAN)) + var surface_y := float(node.get_meta(&"exchanger_pet_surface_y", NAN)) + if not is_finite(from_x) or not is_finite(to_x) or not is_finite(surface_y) or from_x >= to_x: + failures.append("Pet surface %s must have finite from_x < to_x and y." % surface_id) + if _is_finite_rect2(bounds) and ( + not _rect_contains_inclusive(bounds, Vector2(from_x, surface_y)) + or not _rect_contains_inclusive(bounds, Vector2(to_x, surface_y)) + ): + failures.append("Pet surface %s must stay inside roaming bounds." % surface_id) + var sit_points = node.get_meta(&"exchanger_pet_surface_sit_points", PackedFloat32Array()) + var sit_type := typeof(sit_points) + if sit_type != TYPE_ARRAY and sit_type != TYPE_PACKED_FLOAT32_ARRAY: + failures.append("Pet surface %s sit points must be an Array or PackedFloat32Array." % surface_id) + else: + for raw_x in sit_points: + var sit_x := float(raw_x) + if not is_finite(sit_x) or sit_x < from_x or sit_x > to_x: + failures.append("Pet surface %s sit point must be finite and inside the surface." % surface_id) + surfaces[surface_id] = {"from_x": from_x, "to_x": to_x, "y": surface_y} + + +func _validate_pet_climb_edge( + edge: Dictionary, + surfaces: Dictionary, + bounds: Rect2, + failures: PackedStringArray +) -> void: + var edge_id: StringName = edge.id + var from_id: StringName = edge.from + var to_id: StringName = edge.to + if from_id.is_empty() or not surfaces.has(from_id): + failures.append("Pet climb edge %s has unknown from surface." % edge_id) + if to_id.is_empty() or not surfaces.has(to_id): + failures.append("Pet climb edge %s has unknown to surface." % edge_id) + var x := float(edge.x) + var from_y := float(edge.from_y) + var to_y := float(edge.to_y) + if not is_finite(x) or not is_finite(from_y) or not is_finite(to_y) or is_equal_approx(from_y, to_y): + failures.append("Pet climb edge %s must have finite coordinates and non-zero height." % edge_id) + if edge.side != &"left" and edge.side != &"right": + failures.append("Pet climb edge %s side must be left or right." % edge_id) + if _is_finite_rect2(bounds) and ( + not _rect_contains_inclusive(bounds, Vector2(x, from_y)) + or not _rect_contains_inclusive(bounds, Vector2(x, to_y)) + ): + failures.append("Pet climb edge %s must stay inside roaming bounds." % edge_id) + if surfaces.has(from_id): + var from_surface: Dictionary = surfaces[from_id] + if ( + x < float(from_surface.from_x) + or x > float(from_surface.to_x) + or not is_equal_approx(from_y, float(from_surface.y)) + ): + failures.append("Pet climb edge %s must start on its from surface." % edge_id) + if surfaces.has(to_id): + var to_surface: Dictionary = surfaces[to_id] + if ( + x < float(to_surface.from_x) + or x > float(to_surface.to_x) + or not is_equal_approx(to_y, float(to_surface.y)) + ): + failures.append("Pet climb edge %s must end on its to surface." % edge_id) + + +func _all_nodes(start: Node) -> Array[Node]: + var result: Array[Node] = [start] + var cursor := 0 + while cursor < result.size(): + for child in result[cursor].get_children(): + result.append(child) + cursor += 1 + return result + + +func _is_finite_vector2(value: Vector2) -> bool: + return is_finite(value.x) and is_finite(value.y) + + +func _is_finite_rect2(value: Rect2) -> bool: + return _is_finite_vector2(value.position) and _is_finite_vector2(value.size) + + +func _rect_contains_inclusive(rect: Rect2, point: Vector2) -> bool: + return ( + point.x >= rect.position.x + and point.y >= rect.position.y + and point.x <= rect.end.x + and point.y <= rect.end.y + ) + + +func _finish( + failures: PackedStringArray, + pet_scene_path: String, + animation_count: int, + total_frames: int, + surface_count: int, + climb_edge_count: int +) -> void: + if failures.is_empty(): + print( + "[Interactive Pet] OK: %d animations, %d frames, stationary root, %d surfaces, %d climb edges across non-settings screens (%s)." + % [animation_count, total_frames, surface_count, climb_edge_count, pet_scene_path] + ) + quit(0) + return + for failure in failures: + push_error("[Interactive Pet] %s" % failure) + quit(1) + + +func _fail(message: String) -> void: + push_error("[Interactive Pet] %s" % message) + quit(1) + + +func _load_json(path: String) -> Dictionary: + if not FileAccess.file_exists(path): + return {} + var value = JSON.parse_string(FileAccess.get_file_as_string(path)) + return value if value is Dictionary else {} + + +func _argument_value(name: String, fallback: String) -> String: + var args := OS.get_cmdline_user_args() + var index := args.find(name) + if index >= 0 and index + 1 < args.size(): + return args[index + 1] + return fallback diff --git a/tools/verify_interactive_pet.gd.uid b/tools/verify_interactive_pet.gd.uid new file mode 100644 index 0000000..54d195d --- /dev/null +++ b/tools/verify_interactive_pet.gd.uid @@ -0,0 +1 @@ +uid://dra7wpmopbml0 diff --git a/tools/verify_theme_pck.gd b/tools/verify_theme_pck.gd new file mode 100644 index 0000000..d78be3c --- /dev/null +++ b/tools/verify_theme_pck.gd @@ -0,0 +1,80 @@ +extends SceneTree + +const MANIFEST_PATH := "res://exchanger_theme_dlc/manifest.json" + + +func _init() -> void: + call_deferred("_verify") + + +func _verify() -> void: + var pack_path := _argument_value("--pack", "") + var require_scripts := "--require-scripts" in OS.get_cmdline_user_args() + if pack_path.is_empty(): + _fail("Pass an absolute PCK path with --pack.") + return + if not ProjectSettings.load_resource_pack(pack_path, false): + _fail("Could not mount PCK: %s" % pack_path) + return + if not FileAccess.file_exists(MANIFEST_PATH): + _fail("Mounted PCK does not contain %s" % MANIFEST_PATH) + return + + var manifest_value = JSON.parse_string(FileAccess.get_file_as_string(MANIFEST_PATH)) + if not manifest_value is Dictionary: + _fail("Theme manifest is not a JSON object.") + return + var manifest: Dictionary = manifest_value + var screen_scenes: Dictionary = manifest.get("ScreenScenes", {}) + var script_nodes := 0 + + for screen_id in screen_scenes: + var scene_path := str(screen_scenes[screen_id]) + var packed := load(scene_path) as PackedScene + if packed == null: + _fail("Could not load %s for %s." % [scene_path, screen_id]) + return + var instance := packed.instantiate() + if instance == null: + _fail("Could not instantiate %s for %s." % [scene_path, screen_id]) + return + root.add_child(instance) + await process_frame + for node in _all_nodes(instance): + if node.get_script() != null: + script_nodes += 1 + root.remove_child(instance) + instance.free() + + if require_scripts and script_nodes == 0: + _fail("Theme PCK loaded successfully, but no attached runtime scripts were found.") + return + + print( + "[Theme PCK Smoke] OK: %d screen(s), %d scripted node instance(s)." + % [screen_scenes.size(), script_nodes] + ) + quit(0) + + +func _all_nodes(scene_root: Node) -> Array[Node]: + var result: Array[Node] = [scene_root] + var cursor := 0 + while cursor < result.size(): + for child in result[cursor].get_children(): + result.append(child) + cursor += 1 + return result + + +func _argument_value(name: String, fallback: String) -> String: + var args := OS.get_cmdline_user_args() + var index := args.find(name) + if index >= 0 and index + 1 < args.size(): + return args[index + 1] + return fallback + + +func _fail(message: String) -> void: + push_error("[Theme PCK Smoke] %s" % message) + quit(1) diff --git a/tools/verify_theme_pck.gd.uid b/tools/verify_theme_pck.gd.uid new file mode 100644 index 0000000..f20db7a --- /dev/null +++ b/tools/verify_theme_pck.gd.uid @@ -0,0 +1 @@ +uid://bra7xmjf15hwx

@R$Yos9U@u`~BT#u1`zFDtU*-P%gZSm_w0R0N)PrNl*?k|4mVqdZCe}#cV zGhT(=KlOdQrw7J^r|u-`@=Df?zDqApzvldoIS5-rz+(2K+{UzC-7gHX|Dip(KR9#) zbUAszIKD|8zZGS;iQAAW{Ng9_T?BY5xRrvs!QpKgv-taiR~`6iWVzz1;~UAgKidcQ zgMliGGv}uUli5Bg!5AqM=`WMqx3Gl@M@hkmw;Sc6yq*A^0ye%qUwjaLsVsi);Ng+T zd!p*-gh2Jz&|w|MPgWG>&aVe;Qa&B@!3}h_G8QlVgyi||3t@pfU;=eumYHPb8u-2K zu>W+IVT*!E#2OyHRgora1U&Ssq;HXL0;NGimgP^&CtJM|ScI0gUU0~VJt z8Q$v;=9iqgs44WUsMJ2;mZes~8*#np&fVLl2UM+b3CDf99|0c>_Qh!?Ub%&^;f(6; zySV$xQWjdRH&%@QP#V$GHN6L*UW+2u`YAwp0ZLMjcyP8JEK0u4pzFl1-Wnf4%aQy1 zY(3NVYbhS>ZAND4f|f&tnA2sP-+L%IucX*)>wby_w@H>?8B^duu_4QgU{3h(orE>! zJh>1Ow8-tHXfnxoOQ8qRnqFuwkT}9QCWa{cY`JTlcT6VD1V^_o|LWcikW(rFlSSDp zTgVa4?te@t4ajCf1ij{)#e0WjsEQp(e~$8#Ao7LDRkgd>&D1nEP`j9;g~bOS5a{K0 zFMO)QuE{eg2Rt1(v#wC#zOOErE@mER?ivCS?n+YYJY{7EcN7ps3GgF&;spnlZLK()j|U zp2G_)?AgW;2um`S@$@Y~GZ;Yo$Kyxe zDp)^>Z5m7lg5;CQyu}m*j$_3|K-`UYwN4LHFB+};pz4DUJtv*u%qv%GdHXGA_59_U ze-n+#&LutSD=6w5T=gEe7w!vD#<-k+7^&R9zv<%?CMlBP0$ZF*V3=I|eo^}p>Ll57 zimJ@eUs|pU(z$c&V*GaGpRZ0|1fAoK?yu$PS}mRqi8vixd&NiV5D~&O;;)`wSyy=I z^CeE#?INW3oNlH|zps0-h7jt8dC#zebwnp$P>5=CoAop$4}<})1YlI(o#(+6@#*SW zrch&yczOq+iR2B=U&eWk{>`YQqep*kB{puu84^*BoYCO{D6R^soi{F(UFLz=97cLc zV{29$gcu)k^as{6Ui^?3i)xk-VkBGzZ9Rc|e!54q`zIXqgR+L2PMcmHc}T}t`xCEi z3~plrtZCF${szeQ8N|zha4eZ>zoHlB6Ry-@P4x#UR{fNm=s3GU)=> zpNgb;a;HNlG2-(Op8%(;2?^a_N6By+8!$fOa?qO#;_-^f`*HZ)SUl;V2$;qYpm6C6 zNIc&|6`U|aU4*C<@2R?NC8DU7OuVLvHy_emzb1}eR_bdOyO_MqIs6rL1pT`j>>=x-gX6e{gB8rnnb2hJ`dyS(@8P$%`h!536ZDWGz_$}`<+~7+r&uV@cYN*Ou z-Z#7R9A2*Wv~7goD#4Z~L4>3-q0IHHIy|mCp{F+`#m9wGGl&%H#(emZ_;(H!Mlxer zK>lTZ+3M&+Z&x7q%Apk}7vqEXZYaLUXFJwc#m@YO6u-UY94@kfWm*}tk(@q~FtRi9 z`YuKI)nX?B+O?YrLZ|rg^Fo=}YQ(8f&nJLMyxgetChWi2Y)+R$DK>Wg9Lw{LHa0Mq zOa6Xe&m;;-J3%Wyr~k9^ArBwN`xD_!eXX{7`SEQ$6>)=H?QqQj-lHJRjPa<6!r~dt zLdF%;8N6s(-EpV~0XEC%S#xwL3SQ4ZwA=c()zV2#Qw;B1jS`Y-+~qtJ=9+r$XOlU?&CKpuIK;lU7FqNLHmU;KWb_AvRMj z?aD>VLY^@~m2&1hGQ{LuBJf_Mb50N>tW8*+yb{zgq3|7(i`e|Lh46-PG|0sE5C(Keq{7t zLuU_0cI9)T;L;4G-Eyc55gFhsGiw98o6OqCG7RhNERhcZE(y<$Av>*p&9vRHk8%`N zQ@$2u)hF6vI}ue}=X3bN9w;}6Gmh-Eu@=VoD86?5(Dnx2n7EN5 zjOxp)r{23EJR7%h9O0cR=*`Gb^FT*}>~5I3?{)D*yBWh|Pb=b15X6JX%(cDfAP($e z$}_fRLBY9peF3ls*EYgdIKZ4}#265dD%-qHN>meZGsF$!>#PJ#B^ z$vRbgjsFsWwuAvdN{y5I2Rc6nyqbU*dIXOvkS3I8E3bS5jQEbZ@+R$%jQ4#R zm~~Go?yj(%3x|2iDM(E1kfF|-rvo=s(AV%odwU4At#rcT*qb%#ahGgf)OOvf&A-p; zpwF>pW^r%{rePThbO$gzhsr0#?d4v3@t1r+pcR-YFh@|dZhE!8&E(1WR@)@PHaTOT zVdzja;z?KNB>ti2$K|?Yr`Y-+ssCni7%K386rL_TOA0X+@-_nJv4Unkt6q(KkN;y~h| z$;yC%WEqfpQ_}1GK|otOWc8qxYT%Wtg{IG#gaVTosrq^o!Pv}qO}@3YO_Jnf%>`U4 z)S>|S8_KnNv%ee=b`q0KUYBpcIayBn0NMesbsLtCh77Te77wGuljLN0V%kB ze*&D;kgZvv0aN`~jRIPuuX0A8Ll}LXh&-Cqr+@)cZ0eUIa{%v;A%Cata*n$O+vS26 zbmLAp+{TuwD!A4uWdUAaEX<)B3|YB6$a#0x=X;oX?kZ>_H^-m1D+75B?P04>12Bx3hd-opYTPwO=WDh^rL2;0zf$^>~mmrjl22)TnwBVXxJGGq&qthAJ7Rm z?=Y%wj(MKlXtKW&JmC|6{a&;yvbLSMH+Oz$8uh5EbV<+H6@Eb2*|T+M z=>{3KY&E>Vw(4bdH0UVT)~jp5QlTBh0N@M+em+&}GW=WWL--t0NocuDsF$Lf22Bh? zM?f{meS1p3h`g<()UE;gSF+o_NTS~+SHa<5fJFehzCC+Z3wl+AW_dy^(kJ~P!xz%1 zIBw&~dvj$)qaUv0f5augy-R=Q!X4`nFB*2!(NF0T!wfH|%SZ@Rx~bb68uI8mwrUkh zTHo=H9M0ht^WkO;z$tWGCE(EY^Zd2uA~5XUbE`OW0qA@c2?tAIBqIMMCRJ`9o|}YL zWrg=Vg}v0z)`m_{#J1*8eNBh2{Nv(L9TIb&mn> zGLg0Bqc3A*L23T9Bpana)@mdWV8}_vkILT$IeSYW=g0P-k{%4 z+$0p-DzMWCSFQDNn`E7HV}_e~R(UOdgA@(3BBY_kjYJbd5a;8WMJLUC8REY_;5{d% za2*huSLBecD;uQ%V-JijH8wd;nj+nz*F6VWP~<#jY^vRC>A{eQ$zpO{h_Fk%Em#kZ zhKZa19D$4_El*g1q>?I&bDKZQj^mU1Gd~7?-zW0^MP&1Cq{aAkc8ro#Ae}e7LNae| zP~cgb#pe=oU_8e2uhrr|%;0C4JeV#g3-+%Q`H~ggl%`z~ZW92PU%RUEH=O?K*g3>asq+D#&M)jz%-J!2|BW>-HNhMz3cb8qc5 zHXjw=Y1qFlbVwnc7X#}x6)MDQwTJIJ6f|eJK`LbtbUPrU zz>J6BE3wAaqwAgqEmZr*9QiE}>knQs6b!2Mc?(-pfX-0>qyWs|9n9l^BCXN+cgs!p zSml!{FXrm9CJOsT(p7lG$^6}g$1x65Cs(HT@YO5v@ucHk@|s+W9|2Y~h+U@F^h{`n z#pG-iXCKsGlj-;80V16r8-bo>V1Kt_1bvE2l(6v$xywLdDUe zH|{$*_ZOJ1@ty3bhZu_1op&~hMZuRICCtHKaK6p)A#_<2eCwV)_DU#UTW{Cn4==6>_Mwzp>=5`vwjl(YQzQ#^QA``1m(mdx?J)i-YA$25ZSW;k z7PI{E)PZMd1_~}7{(purzvALUw!;`g#^Mo=x+3#5@ysZ(w6xI)x|JNiWqt)v>@A`e zvNIiU#i(jdDU;xb6|Cf!VQl$xBdcA)a8v2f7lzMw{k!k`la7h5QC|+gBDoUo^4&mN z9F)CvcG7wgDaLP}!%UtJF8;ytaFzxY#rTi+k+>0?1kLoXxcJS(0lT-3&vRxC1y#L$ zt_^S6Ys7f{zan(k?1K$F6uGvnPSm`#%nYr4O#i<`$Dz)i~WC!o-R^q6mm zPBKabKT?Q`$>wsSBLMGpS?pMz5EoUXI_o}hqb9gyeux#J2swTT-@B$+t?z{5yjlud z54|lsTkaR7O@r=7L0Y+dcH%Z4#vGreM;0zg=}xHf?GX~o9Cb1pzfhGgu0nopD5=9s zi@L`FelQ7ROv0P-bltkZ6QX}$y(c{S`ZhFS32IhKBvDfr?zh;|CMV&vtP5{57;ib{ z6~K5t@*iAspTiL-RF_wkJcM>&gk{g>dAIYYw|QgfSoXCjm_p3kmAy;mdFx=l9 zCKnEC9#_VNNQQnGvI%&(zpb4&FkCgwNO!i#P?0AV>1404H>$7B`cRcgzSu*^FADxKQxoM}fKg|2UpwEK&rgK&xv|kE_y;X-S80 zTBCzUz;(+7j49T`=SghV|HymquO{Aak2j$u)Bw_3KzdO?MLpTJa<0dQ|>u;o&Vsjl^QH0^ZHX;H(F1TEN4Fea^bEz20kd}yF5O+^pq5y z5ms`kB|JL+`Z#`K?6Qq5|Bd9SO(a?ca*Nn5WEHZ+mY?#8lEx}& z)HINF7*yGJdMBifMWhgSP)^rRiiN$t_OtZN8BJRzqgm6>f>XwlUb)BGYbmLCLF}biVljBxwg&Ee@(pku*`5oY?qF-#2kq-YaES zxo2$TP#gA^uk}%Xw5X=p?Wz^72>X_keJ^Q>^VrsAhwl`v?mYjKrUAWSX=VI~EOr*L zTeNi^@jKU3hkDJXx&&ri)JG-Kn2UaQ(EWJ<8iDm#7FVkae4V@3xBUg{#?lim`Zm5y z6l*rn)We_~0fj0As+N-RH#OrnQorHM!6|5SI-l6{9eiI${H zX`q~KQGPpKvAHqWd9WN1-Gg3q3)Q`I7R-)zjXsMWy6?*S=MH0lgW&n7(3kPU zqQsdrZPTBEyt*;Mtax`rriUnNmJpSjGl?N7MMyybJ&VKsmNf*!1-Q?{Tkp60Ldnle zivaN&+b#K$k7}owKs-&%&23`6z zBY!|z^6=}w793z2LT|Ga^V8Sr zy0SSYIrwwXV<&y_yQ@a%X-x=>0;CM8#OTw;KDb1yQF zme+P({rf&h>m;`d)NYQ5J)mz+4NP@q8C{!EBB$xi4j*|rqq52nUp z+=ii;Tth(3ITX{`Z^K`AX`iUkBpGUuBYHNTkDhY>Jn4C(otY4(sg4phCwMPEA0`O6 zELKAkCm`Do$pi1!g~!iH+(N+-5bB8r4Pyi0#-?$TqU@fxxe1Bn90?(D!c#COdP;t@Wo zDjUl&ZWcBH1A3}{G_sCVTz=NesKmf9!R(siPe%|-belKqwR}`P$Ry zF{v=dQZ>P}*S=29{I!GNAszm zJJ_{=rs@$ilxO_>aA3=Xo$9e*lk3ny)U*oXnzA<8#RbB@s1u^gn(=v~k;o51V0<^pAsSNMJ zA4e*K6Yj1w?P<-^CvPOoCkgSfon&!Ew7rZ|Qv1ZU(81jur!xwVs3W7Nv!SDHx79CQ z?-NaY*L34Ud+VT@X@6AkZ)3TZ(c~G`qR63NA~NZYzFdo;K9MLeV??+z)N3u?^7WesLTr+O_BdW#e}=9T<3cyRRrp#-$$T5;=5P zgpnizwF(b`>R$*mE<#=aq1umasogLX_0@ZegPMlGr23Ch(R{D<=(!I;VK5Usx9X4| z2|aaPhf=Jr=Gn06qHy!jS;_E{;NIC(yi6Dq8-t(yM}^1T+?4n}!GxWL$70&83+;&^ zYeBz-RB+$Es;lWYU)ZNB%5`mC6LZ#%1CyPaNe|K$5O;$Kyr1ESaGcTPxvTH27+U&M zVgZSa*PQ>&_HoC}mf(Fma;(5zNH7mClX>k0L5oF1z|?Pd2Yd0IdbuMj!m?x_sU3BH z>(rH~9m|Wx$AUWz7+PxSxF5UhJb=1|PrWVxVvei?sw99$im9uA+QAWMxqbM^htDFs zWt}#)q&rrKa;%MrbE|=Ib!}*2+y+%G-?j3}r&`K=c>)@~RmtojvGPuq&BFUiRZSA6$bvu1rnv{#u)!PSN~h# z)tQ%$Eo+p%7J?d;VSG*bf zq%jaH0|i|NNZJQtWnlTOplf|TJ?-b0bw^-1ZOmo$o|__!mz^-&Pj~k5<35dDcEj>t z9b`f}nFesj@_9#EvSP%0_HjGYACJfmD7q3?8G;@LHs6?jX-Lmk#m_n(GKAXbjjNxW z+M@>d{JdFb8adIuJR5BB>dXhw=0l*d!`UVm=aZQK*U;X<%1n%!mYyHbJU=t-!=5_1 z#BNt%L8u8>4Ih_{k{W$&oLf+O(g{P~tl85>&Zz#n=OaG)UK0e0sE{PJzw9n195GCa z(Qn?bT;GkrFH}FesClfi>#`9V5V_%vDOguVJ8jO{Wm?@Wrndv{JHX!7F|%GFy_HtI z3Ca|2|ByRJA5OtF1^#gf_&(z|xfd0rSc(ug+G4>Ek45RjM(GIfd2N9T0fJF~DyYowm_Om7=5e*tQ zLTR4^tAr__nwfztJ|`6R^W?HV**LM?L6oLI^G#&zg)tr7E169e!QpZv-e(aLRq`?mf$cd#;^se6@uuR3=kz-V zMXGk11bsK7|H=%&v7oJu@$)O#!b!@L3#QbPBl49?^xFgSxLK>s+Ehg5w=BDt2-vG4 zH#SevC!X=@)m0*tnyh9;&A1GR6o*^V2OK(^7Z$}6#b96e`U|^wfh2aoiD|d3)uNv+8MoEDyVts84JUg@h!0x&zBuN_R(J|nstTKS z4TwZnL3y7hMfFj1|L;?z8SFilQ!L^)`8$cCMwH0!#;Ohin^cA}z?s=ndCjoKW_&|Y z>uvyUtX()rtX1qb1xCs6qIftsejIS_ns%){M2*#{lcncmKB{uldE|`zozBc~PL6WF zp{f1yUmg#N$4C!`9W3ox8Q}o5%sWUf3Ur8IpE+EVP=62AhC2>-nr}x-LcN%;+j97l& zChgg?9PC|m02i{0v4@G0yiMOK-Y-@I2GaYEHvWcFF{Yq_tp~V;5L5CrSR9Q!1KTRr0C-kc&FQJ zO6+m>W>|{2O4^9)>l4O4WH{X>@&4#|LT0QMeG>Dea+Wp2HC*I`6BewSU zlud?ea$w#pGUdfrLbk|bnOo@AhzP!GRo+9*5W`lD@Q+j3~V=-!l8|F z5too-eQjq61oCiUu4J`fQfh*&61SF3#E%6jWDiZ~dETQ_>M1C2*K+kKX7!+S9<79i_H3SY>Qtkzm+%O=%?TcW{#ybsnRwqKk>ze{|XcxgD;0? zHn7TzH8t(cn+LyS9z&N6NpIUu`mAk^ewxM-X-9vf53LguT%?-A*m;=z>Rt$yDK?}4 zE?FjH{|@b$urzbE#Ev!n$ zr?!BuvYMZYASgD^Ji^-pWP7>psyu4<%x%{!-z(7i0SWeCn$!b6ktv6Zf0uj#tBwu| z%#ptn-`TyG#y+on@WddAvOI%pl7HR&Hi4az2J@tfT5w8TuM9DT&xReA&LE(N$`5fp+t=@oZP9;>98%n>bPI+y z-+#$(Fl=e%W`s5CBqJrY86VyM8jaG9mtW3PMvjIV$822BsK7qaXQVzl zgekWWt5hom=)l1mUzgo_4{}k_0K07lXvn|`{mgfT3SO-1d@JY!xMqE z^2(j!A58eHv_=U@Dc9T_Bh9PDt{+en68rEt|Mr8bXkYv9Gn=E!r{De9>7e~6BD4k< zkXwki47qE=)83NP0^2S0wSouc1Y4&$mt~Cjw~m_2(AgaX^KKZnOl#m;O+Oqrcy-uD z=s4>i-QthC7N>MEgMHFzxMij0+7}#U2WY+xd1{I}!{m&_$zgog31`GO*9&H^lfn-rydldOB>)o{OLgA1G+Y3rR>m%)1x69d{Iwnx?ri{!~Q)dY7!X`$A%U?W6>1fHRc8+xZhPVZg;ClpnYO z^7NLX>$t*0#w9E*YG;J+#uFyq>%L5Dk-H$^Qn@9QpFL8olYMoE((p)up|+KbfjI@! ztMr6C{4eBS@_ZBNk4m?%#n6KT3~t=>*B9v8Y+cYB z8rl&lVlj+KP;)s^C=wUjDkgTWXEpZxUhHv9KVIfRxin(W=jv9b4z9I!q*Cw7zSy(; z^39(GMFh{$RlT9SOZ~ItimqA{Ui8D3d~%T>ckUEJDx@qx9av>*tsj(p!(&EV}g6I|pVlN7;aYv%=R6UAJm}KMrfr@#sMQ=KWrN^yq{l zLkXem<1$WT>X8hA?Kq9)9F#Q|Vzn#`n&-`*A+}!j&yt+-)7Pp@cCa+MvvEB`=Y`lM zAn)TN=E;gxr=IsAJ-`pmzp!?@uS7Z~c5WLR@#;XiCfsBjW3TUWAxGLPt`w2uvoEES zQDng{;0_({ie5lGhN*K`j*u}s`P8l~B#5S@^UTyg^AT^HDAZiJB_r#XcwMKs7%LOGj)lKZ> zly@&1qJ6#^oIPyz2mNVTGgN>F45F?DnAT2<>^y#=CgCnFczGY&i?KLtdP$-4OZ_Mi z(#+8{gYx~pFJE5KaT^bqb2-_<$L+gzm`ZX&w5IHVz&1pZ>Buq)l0x}?TyGBG3QZw= zKv`%wxgsmemH|`cOgH+@9X7-;*0N@|!bP|ZjIV7zp^4W8&8Z@1W^R6WZjFB2&LA9z z-aS3Pp&g=MLwKe#BD^J_AI@uoP-7}IHntT!ZSXF9zylGZji_PJGeEjqbIw%qW|Ix7 z6vY@SPOb5c36_U{SHTy^vg8mN#Zg+b1_4P=3}B-ca!S_hd&IkrE19TeXt8$G6m;#E z-*QB;qgxdnz0GeKZm9>)5%4XmzKN~|nZW4;QT<(mKW`U$szs`0y`Vyt$%BE>*A*YX zi){MfnuC^psap5jsd=Z><})%vGu&%r30Sqz+96o#Res!mXu>yhKk;!iY-S*NYMyF;q{#D4s=bj0s5*Z8ws zIbV@%*c7>28|}OUC%b8E%XTxJCALgfBqO(A1|81C9$*rrHzl9v&$uv|CHDta%)Ff)=RRfoN@tLi9)O- zNGEXWo!prHu+wv|L8X8(9$OQ7hL8rDJ3oRzOD)Fir&{(*T95K?BHge;=?g*_%}dIz zr8Bc7*lcDlIQnAcj-wp#8#dwoDLHKS7hB&+7Yj__;%n`Rfrk*xG%;-^d85reW`G_G zP`0p+6ZmyAV8v+aby2=}Ga8Oij-E12A0T5(Dhb!FnUVM)uH6p{XV~Wyv8^EZ1IB?h*w9K z$=-H`zPMiC>^+Gs*9_cCHk%^(a!}l_+f|e}a(|tFgMsCv#sdB|Pjt8O@b175@-~m% zkPjik{PW>9>m@jOCU~|=B1rrcu6DeD&Hn>!g|GbFHmG{~(BAsF%GVnQxXhT3%U6U@ zD@(|Jsa0($#Ihk&d4Y8@psxfpFA^IWDu)5-PBoV1t8b&m#Z~>6NP9c@*NxHOq)#>! z@0X?kb&R#rr71MlaG9YfYSP=d%RSIC8#MD+=hE4*0l=6dy2U!4QnSA=GK%otaO}d* z)?3g2-aKQxsYz!d6T6ZqBgCac4bhXGo_jY^ZFK{DdxzMzNZV4axMr6iu^&Rc7i;E} znU8ABs(A#3FzR}rKD8nHqwD}5aLztwBwtm6u_?oFQuEhXw<Pq&yeLT{Z;9I$8ZG zy+Vwjo~B2vm=^3I9Np`B@)aQ=Xrwi+)HpErmvh|x44X4&K^C<|8RyI$R6pPZk%(y|E^J=CbFI8XJ>)#wU-wY(3N^-5oAAp2h(hIp9PM(SICO0l6Yh`X;kH%`W5)(Y0;7m$?Y z-(`Hj`wFuD7Sfdo6Zct^aVCFno9oS_}izluY}7RfCJ$LDYKtqD=Ov|U134WsMN9NWEUtMKXIMy@3^ zH@X7izlBKJ_!1fYbfyjVTTc1XeioeOsRl?3XqglvkrcUfKx_L$Nz=t8#Z)&vQ9urY ze|BN>lUM^x3B`wcCLRsXL}<<5mgJQ)7KS^^ZC1$_M}Nh4nZKw`U<4PIv9*OW4O%LL zT7`HN!efzz4ay(1bi64muT&@UX}K`&o}O~l%Pj5Bek*bJADbOHbA#f0U-7jjv7(!% z2ZsP*JVK0-+`n13h`qb%b2UB|drK$Bv}j80nCBJT{P*Rvcn|;Zgu1$tRaj?&OOMQW zUg(K^y}7u+XChZS1c{rvWUSXc<&jv~w3gfw;Co|eqq%v&|CL-bto{JSGMn+=|n0d{f$%8{Rc&-pxEng`wEl)&m}2qBy0 zJzCO~_VIC4@^obE?Q*MhM9{?;eD__8g+|>#QmP&|V}Bf2EOe@qxtPdvyemp0ZYy6Z zZttmeP*8@N+w-$7_G<3epT{VA`4jgyK|kFMI~>W+8&BwTZA)J;ND1)2mvTD&@Ilx3KBf8#GLC*j-bQ7E2~M=`-qDYH+;n_}p1Y&}8wthXF| zZYSyTTEEC3ox3gfq372F6T^2Xp_q|j^6u_lsTAGi?6_&ft?m$H+v%AvFFvwu=|h`7 zsL)5pg-G!5%5ZKhEmZ>bEpTZ&cSwM*wZ%2sU?g=e()8OrKz8D)3D@ote=Q*GPq$Nd z4v&Es+D#9Y2LNen4=&qtXFW;eLpZ8HX(ymZ z1IYyc_=vb8=f-?4ZDDq%cks=6wbyECFN1+Un++^o@D;xjZALFS49N8aJXKII0no*U!YxL2VgyK0sgNwNa!W_*I2B-NY~7M@vc^zFSdZvYBUDD zj~ouC|vtIW|k$N5yL?4gRN;ekm_3x_zH_x zCY|T;xT!y46IoETx9)4G^H257Z^%}MC|@`F*pAKENX6L>R&kEwqC$c5D-p)z#Jp`3 zBR2fg$#Wm?YOA%-3~v-{{p7ix^M`_e5-3y?Sa$(E>!R45ygYSgH{nR5H1vbFWoZA9 z;e*usgFmD^+$i|t!XY&kSD*-fv6$$bHZS3Q`A_^Kg34QXC~Vp$OaC67I2D#M9z-AJ zZrl4MQ%avZ{Y`5)RyJPqJ3Vw0#LL z6@1QCFWngGI$~@G(%>xJ`_`HX9^|eU3Kh$OK2R_N_fTXh!V^+Ic`d?fx&=rMqj|Np5EB+MS(r?VfI%WBfTWf8KU&n!Woa zQP*bX`n!sN_*ld+k@WC^-LJil(I_XkFEi&4s-)Pd4t=g+2@O$$_OWhap9@}<*J@>a ztbf@Z*;f?qD2Lxm%XDa|x#<*hMMc}HP~LgD7S41Dy;Oo#4QK@{HjuT?diGZ=TZAH4UrF5355O`#st#PJLPgP&6<9wIESN86}8 zN@+JdtO_Qhh}r>X!@Hl}zgM!6w@1tb_!@TJ?(k-cMqX!QtK+<^kaZSceJVvv2B zq*@th+!Z8~TCer3?~{q=9Q56w%DyhTi>o`K!LSs{Z?oGu5OFQ(_(guH-(#xCIyMs>DuwM5Y6-D=O)<#+M>1vML{!jZ?BgYZY=wop=Wp$+U2 z%+ty@#}mxIdI`P!ZaVK_NCD5e+bj!9#!Hm9!O7w+hsu-b`O2^yq`#3HtoHFQ+1rM; z#a}@FAX(3tGHshK^P!@A2TpegikMsiB}&`CGsLGV3*Sc-*}`*IQ6J9Fyfa4sgM08s zgR-|RB#pOV+OCA5hp4(H3A`rRAb*=jco{s4ITK`L4<#>)Y+)4=Z0|tro5$nuZmm>Y zTy>bedU(N?eQ>LO>7yZ4^@rDi{~@9c6}Ea675C~uRVAHnn!HyCz*@o%KJ!j`>RG8d zVjkW960g4v4g8!V*4;irKwAHq927|CjlYd(nJGL_eXLkcG!=T84fr%~bl@Xf9YahU zbtR%>OKqNJDz;r~-`QM@MlJ0d`+$Pb5j)D&aR1kBdU3g3Nz7n4rL4E+c%yl4Xg8%} z7yBE!glo)u7^W3HzQj}uD^_jXJ}Q3~5?-gWwYQoii8X7?18^xBuN4zj&j6x}Oq90E z4h#g#Y3=oJ3qc;OctdEg53)Bh*oDz_em&1E^fzS zYgpd5z#xQ}+4VP!e(7n;YEKR>vhb19nEXo-N3uwBk%l}^C^6*JgWMNGRlY(X3#4Pe zgWuZVQAaWrL&fh&ZDWTM!M!qIMi%qKx$g=B$nF!%XXusU zUHj8|=O}poJ|MN5Up@onGoFaIHC@1`)B}%h5cH#_85g&OHF32@<8C6wC9j~|@PZi2 zDu$@P9j3-;qEjx>`FcF1OmDx|1CsEbe}&%s^ckSTn_GC}uh|m9%4j3dOc6&ZDhuyN zwPtF>Uq-tTnK`2=`|)pObm7db-w&HB)wJ!8QVwC;m3I4CrF1))F&x>e8g1Fa2-FiE ziiS6t4|6J9mQO6?++QdeUWw7-c6f@8`%EW3$6Kj}>Pe3u(f+6ryVH z=um+D8R(Ik0IyzgT9A#0PX%$WHAka+36P?>!8jV|o@ zXEU~Tn(@bI82Y@#9I<&Do7ku@)-X|DXERHDR0I6Ac@edob{*1(K(C#!6;nUrGNQH_ z=^8L>W*aVeYIER}T;PRYciOJi5U?jRFCL)I%*<93B-3kera9OZySkBEkKcidc&A$o zBvz#{alJxBm)Fh+q>r#u%CFrot#Ov5iOwUQG18Pi2)A8Bu;>;MU+pY^Wg4CsV^1Zr zRN>$4EbkxO|MfMJ3(C`o0|rjG0Vt(EpBgIgHr`2qspaI+OdEKG{C>$*TIeaf-?USf zm?QP)F)HpMer&a37|QR@9}g9jLoMmW7}#D}fY$-Ys#Ky_;TL@SI!y&yWv`xm1(V9| zM(fo2+Hbu}f`tU7s4o8H7|+N!DwZS&dKWiMx4;_PE^Y~A`vS9N(qcIK;4>hu%vAR! zsiA0_n5_wVzio;2J914q`lo?{YS%M}MK)-dx5-tn2C-?!OgRL%EedrMFE)X$z}p|L zvwv3krrEc+%09?cyGLu{dwDZFL9e?Aq0fN z_{_U>gJ(~*xKnU_Tl;ee*;|iuHE%<&ZB&@?_eElcBR`VOsl=H6CZC&)l6Pa2saKS? z@xo5wS6heDjUop`9swa4j*!0V<~A(P{85shqPyJ4`6&BN99wA77yL-_WAJyGc)bk(U3F z@oJ%b-eWTa`Ym4^PmH$jI7;_QOjKmtYFuvoc<)Vxa^UW$n=Tb%K5XJ#C=Z_gv_((R zFsugZZYp+vDb6+To|f0P+)Jyru-Ph%+t_l=-ord^-Q#=9zD8}H~(kl;aX*zW_k3peCCcRAa%G$-BkWPDEB+Be% zl$XQ9cfS~DFg0K#WsW%Ibul88kA^wrF7FRz&J&~Rs$v>jV}NAHPnIrQB5i| z=H;{kNeR^LR1T?$<8fO*Vphk7m<#qy(6i9f3xzE%kr!os8Ikk+f7sRkqCJ#fZkcLOl`5_`ikGQMXUovtT9u>C>pu?SP|+_{%i}r*omxB_ z-lQ^P-s8qi#g8}=tJID-nyl_Eg?NK6bZM$NeK-_~HMWkqGK)`ZxI!O39#k`L}hE7uqKAR)|8jn4FW=28|byDHw!_C(clF7-HW>cFbg+Cj!mjF!Le1G3H%m6)` za(utJ?ax5Dg&r-1m@2#enM>ljSA7dP=uO*FqW5{f*RL)4AyFCmAIz_s6M|^B!ddcd zsHU`*uf>R4DQ|s$wMJZ-#il#k`Uflut{oK7i&xzbzNzKntY%4tbZ?Fyg33q#$%B3Y z0?ps4J)mQxeFPO$?igqQ0MOQ9Oy9}DIwdrJDwwXC9BDy@jTEy}%HCv9gRn0fI zh?)Z2Dvb?&aKl<=yDB58g6OZ-X#QfqS#dVHUFunTTg;s9e5u~tE|#+kq<;-`GYr&U zN9vzDjM?QfMJbS7EOXp-U+ud;E!8V&mGLLL7(?Hv?mtd9ho!)9fqq#k24}@z;2?AA zK)3_X`4_)2BM0r|fK~TyJd9=NlJ`2mo&oLjP>0SWAkq&w=ZJcTL13d9G@K7oOOQ6B zhk*H0M1X`%prczf41u!ZpNk38dlmU?`J#Y9bDAsznmthhzgfvRf~pRU(c7#J!7g*K z3LU2O9yfYMWKU^sff7^89`r5BXMUYGcbviY7)R$FCvg{R08{^9m)i1t^NGqG$<$=a z-JLQ&HFl2DC5Z=`b}iUwtU_w-u4MhY^756wuE1*VR;rqq^ruNnJ*t2D)R6EKyzid1 zKUBxi$Trk{qh((eTJ6Qjldm9$ILIyze`Lu)rkP6Ip!YK2N;dU9pMRO8w0R7xxf)y}w+r zISX>cWel5J(&d1(J@rHBXH$pUj9zKRTYfYxS`UwiBtF)jERZ2+)P!~13V_pnpeAz7 zbm~D!Ps;99hS9p(3a8*a9aB4>PbK_nw+SfD_fXeesoR{p)6 zhjisS9T$ki4a{RtlCjt8C?xik1wv_*%`o0z-=(S5p*9K75&7bD+#HTbCFQ;_T_g&B z{2WwU$J255gm|nwDq1}43ENX#sie*7<~|~#@{&sifA%@9Eq)ncc6f4**UO?Mn4A0k zcp02}qFMFMPo|4eW`=e`e{8n%t&aiGD?Ltg6Dh)RlQgLok|AD@V*3}*Nnnf0CO(?h z-;;{#- z>^{^}J@m4G-0}j#v_N!0Cwhk%Zm>-pGWfd}4OtML{RJm|X^PP53q)LrPP-8OPzV0P z0Uouod67z#w1m8|b89?Rq}^ER8|I)bGn>FXJ1go-pMm{o#^(1|rb=nX(_}Y#*YALo z#LryNaokrNR`uM1_Wk~G_XwI&!1Y8`39G*@CxK4Kvi9Pt>9j~21~ivjIpF^IB4JkJ z_I#dHoV3cz<-g<0nA>a&uP5|*S>gQ?xOv))Y-~f1_?BTSBQN|O+j!w6$kpZcLF}Fn zxMRdg*{oG6w>SfRgE)~h@o+BTHfCcMol5HRb9quu?~onB`+GlO#u_HWowVwcF%dk1pVL;(I#`Faa3M*BiBi+xEqKAA#< znIpOYhKL6t91Ke{x4=<0zI)U(4Hyj740V0hxxPa*gO|rCnRJ&3$Zhk^^cz@Xmu8r0 zP9_bj19-u#>JgZXO*~>h%Wh;ekUa=1mkra)GNIwK9~hN8z`Zs|br8UPI6R^C7Y5|b zO49+LLnRaWSYeHqCQ+6&dDNw=Emnnsjgni2^ry!|g#aXBbU-0?)DkNe#uQZbZ&|ol zuq9f-QY7tX`Kik#*e?{pThUWv2O(_xQeL7|IB%nF^36iU>+(?PBEHoD4O%XvdUf0- zZm&Q@7e@Y8$t9Y<2lUDtBi7Usp7XkP9(J)4%l^6$RU1sl%~IIs6UDXQ-9&g}ctQW+ zDd!6CIEQKC7~i~HKdpG(kxUE=tMvUfs0i}~)7Gnq7bh`|FDPBv2;qv}f1(_CzW)(; z0-TP99a_~n;BwQS`ab=ZXem&BLCps$`%e2x{6qZAG7id-5r=1zM!}gKqVc{_90g9B zQP_18B~bmdxiI7T$+aCINFMP}?9I+q8Ao!;Z#*+XKs3{8NxwxJVc61{Ko5Q3sJw=L z%&L1PQM5GH^qaF<6HVaj9cD<7?>aqr6@P0HM=F#5irBOe3JjA(H@cmZ{CKbFSm^x{ z;Sp7_Xd^9_(lt#n4L^a?OPfLG^qz(aA${4Q+o~VC-Z^dM58sOt-@N<03Gx7*$$)td z>qy(UAap2ve~-YCFEyWbN0*6%YIj@g49vG$0FrYV%W9p5gRnvwt)5sZsTlVJ1)F3C zlXrQtsRid@_=2)r^l0P4AvjQ4@CArX1RJ8e6CvJOHH?4h@o`PlA;U@VbFhiw2zg}e zU=u%ObLvN)HmmhNqJ=xx5IKp}(Q{Ye71n%5;)U!#=#BzzvLxBUG{UdZm5*c6d$% zIL``d<$|G1C1k;|OGuYZ$xlV(>sUmU$zV*RsjM93U$KTQ`cKKE@K*NZ`_pfS&sgND z#f78#$e&GvEc1>*{B#$QKkI+HzF_V3H5DmoY(zO>f`kjF)I_h%A?GCywmVT*#dIf! zc1#j=ad9#A%b2UHd-ZpwZJ9detK3)jen~gy+e=u2x`+Z5(X1wkIjzX-ekf`6$TcV$g+v zag)<M@njQElnB8Se zU*;s|YrX*_0jew_$J$E$o}##pW#FjtF0y8ja<#D^YqNyE z_>S<(`(VFp;pP8$At`9*!GFKqf1Ti~yH$~{BM7#;Few3zmgx2O3H3+lrrjSNtHwBo zd5Nj8u-$csj`7W1^=Gs~kn?8i#fwPbhu!zAt9dYwk)l3V)ppI`KfdgLedhl-!9^}) zBCL4oI0)C5Dj&9=E#(j4%5INI7c{Y%LiFJcxtadwPs-Ng8A1{r^MCz%la?&-$p3lw z|2US5=SBRlC;j&|H`W3s#DAatuLC;<1*F0Meu4kGo`E=r_`k2j$rAqm_OHrCZV^mg ze^b0yHu&qr63sX6%&g1Aaxbx#6v~l6qf7qVxenRWn18{JzWd+)UIL$;BuLWWDuFl5 z(ih3Kc({WAsK6pc?m%R@}ysUCbhw?Q&z`yGg>}Uh~@EPL*=jcC`jNRxhE260f|4K1} ztcv@o^Oif?DqYP^!g>xAA7jXjnl0;w-})gi-+yLE&Q}FeAQ2I;?sAq^I#1$ z{%7T|2RrwD2#r$z@$%hT$O3tU1)G$ZZP2v{oJBY@V+PwZ3T{;3eimm`2-+>b)ydC#UA{c{ zw2=&CW0vq417oUYK(PMb5B;Yst{Sc4r_wnkyCIU;oD28%dBnqN~p5SGHhY48ky{H2mN-8CoVH8-7=Bq7~aOKsER;H)5Bt2bmHdkxZlD`9I|g zKmL7)%flajSn|Zra;q=rzq!97j}Lno7n z^#~Qr3AjjyqNI%WVQc(j@c;1BReWj_dSU_N`j=-NUeElJ1*QblwC zzKXaVmx(k4?6MVc!8jxM5Uw3Y|NU9;JZ|T~|L`z1B;h!rNj*K=ne#Gqiv1XMdXw+* zNZtqc2L{$`Bvz@l@l!5s1x&BEz%%YPYB1gJI{lsfh|{%+CsL9d%AfXyuS4<7%PuCa z67+B?b}4}ej%|#g99qMAI3%%rsp(VWQ zMHj{?(L;TvHn+;`o`dctzUW`%>FVjmIs!eGCVhcbcgW-C`#F7cXp!Fg0^bLI4~*rj zz5(n!|K&tDORodL!~btJZaZHgnG!5kbe>&-wpp{IIz`>JbaRgjPILO8SA2^^yiQn; zvsz~b)&lk?JQx(CIm3na#st64#&NgxNN-I~Q8`*J&Esc0#>>otaVbTWf-tHvB2CyP zxs#Yr<5AA09iIiSUrNvi>s6scaMcvFr`<>Ye_JoA(Mf~N7k?m{c8e+AZi?sCbFSEX!8OO@!cRhT zb%I9-z{5Fi>}00y#WU(qAF{B`Rc|?`V2S@QdD||P zah>PhIoo*{@p5Q(T z1`dW8tp}8oE35K^-PO{Ch{-W$)VArR^K~3R(aEZiYyTgha(Xc9RxA$7vMFjrJ zF#R?G-XWrSAY!*5I&?rcZo!eJ%Tu%^3cN=nAEFaHH7RgqGYDwss6r7vp!B=7xefn* zo^gIL7C#MYrfy`{U$)AJrk9#cV_$yOqm7hjEZJOLp`K(H=4?T2N)@Jt*yTB;Nu+p# z=Lr(FE~WNGo~4ENZZ8=}dV~2%5dF7WN>4{k|{wn_J*R+?nlncNT)UvsM$XJjYF8hzEP2k`R%l_c?P# zEGc4(u)W{**d_zt^Xi(X)?(sL@oS14;cctJY)e?8yjaV6#Az?plDClK$0|+(OM_23 z-g(?sbxDOQmoc5PaQ73ksobF)zVyd>2ah0fzSf{Ko=rtYwcxfqpX>QRGXahXPKJ2s zpEw-g;6j9pI+jy;33AK@SO7b@IFDNfln!nKLos2G9XmajN*ftlG}vNe0fcv+qXNQC&NFD@W2P>ituJ9}rJCzU zP^67ZY|)7QzTO{gvrhOPQGEB*iT%hQ^2*rn#tbVy z8=rUxwa=kvX%9v}VL5Uallv(Dt&)qBga~)RNtvTvyWW-!wp{J1;>4ZXI@x2O(qk0= zWH;#$al;uAce2!h=R}yx8<~1E!MUlu{Y0C}<*LMkO(jW`uilRJQ4H==f^Ez>&g*9Q z^CKzv-!)lv+zywm|rd$GIgBRDIrVqQRP0^PE0B2KVg4 z|Dl+fw8OsOr2Lf=!rxRJB=0OXM2B{S2gR`jhenN(dLA5|uui~vzvaFygxh;)upyP%y z^0hyz;Aq#oCSxGkSA=!aGYB1gr%Y|nRRgtM+Hze?4XA~aeGb0awFyPC?#s6JX5ift zGnPVa#pQHR&e^ZOm_iit+^{bVQ?;Pm{{Cx7(Y*yHY?Zust2q!T)Jp|9&+`8xJ%i<=zZa#78*<9DtLV{B6T^n zbT>6L&6ds7qKm1C%T_-ZpYdDXAUrINt)+gIF!!zq#tC=>!PkqKXrWp%YpcO{(_Na`A+q@pGFPh&BDSeYXZ$* zqnEIOA&OLBFgF}BS+rsz@&}h8GBO(pYdDRbk8by(VQs;J+30E5TY^OP?w$fvk?XzT z4JU3DF>K#*kMCyg`oEevgF`4pEhk)6Eb9}chOBOvxBE@@u<=dTCxXP+c|iI6#*z@s zMPc%`09|p-+lOh%J=28(a28Req&^(}tl3&vIv^lV4(4J$q=CDtVXsv)+CxDaArmav z!qvrVpJlDdJ&^twT?$~f*jE0Q5F{q7x)EN3Ms=Oc6^jU1JgB^Vn zZu>_*a0vN7K$29&IqW=~hD2U}XGQ0-QMW}=TOLuiED{l5V2fsK=Bnbw4VTSi zQSwr}rp>%f56YQXC;vb(2T1FD^r1UIAum5gZn1iKT+vq0(FCzA1=q#jZd8dp1rFRt zq`qp1k8x}Mu?E~&Nn7R%@kWnwfgUU}`&CpWGJA;;c9eU^=Rnp7=hPHn3R4lHjdvG_ z-!tF=VGo{sls<2sB%XV&OKBOnPJ#E|8GQSx+uC2CU5#Xfk0C7ub4pXEpQ3f?8cwb zC^D1!DYyIGl-&J6e~d6hbYd98bAf}Q7lxIbitRG*5)e|cn{RQ+9WYe8+P9^WkYI&A zIoT@AzQx41PhrHM!(1rH+=#(b#=rY`P$b6-LH|LL8HdXNS`L>sr(l%WJ43)`0>%sL zIEvIdgTN~X*AVr|Ir}*>In(ckB=XLxkg7s=GF$Ks$9&_z2cq8t`@vwy3#Mv*&$|a- zJhS4CF}&8+mDQF}jJ?5NoqR-a_FEx|I_W@tGcY6hP^KE(z@)lVXRwdBW~kR{%mD9i z5V3y1?`8>K6RdNn?8F(p{XocTe)CzVG(Kt<8&P($~j)3?{WIrApNk+ z#vh=|=l{67_y6hc%4(oid95!}$&W|nFdvHD={t|}aTCN^a5($epslhz4sF7>DihfN z(jmyGR>WTm=>ieHRYV+M%niaeGGf7GLQxZ_R&63q7^DZbq{e1$W1?hZLSBKHJ7ItC zl6duCaN=z3k51 zS`=vVVqF^8E$jZEX9o)qEPe59fj;v|6Fa7(NZFW3{QcCMm6*G;kY5U%Gl8bd*HBKI z!bRhr99++PjF}N!n$REpNZ{XZBWmy?nV(_qPiFF z#~LCzA%E3)w5i71jQN1D6gcHF$fS5Ylv4(KQ!nQ!2rv(*{a9 z9MAEUYaP8&=XlJ=Jg4j3Zn^eU#%7c8WpiSLHp)`Giu7e z#YQ)#m3ByJMMZ*J3p$E7)i?6&MUh=&V`!*t^UL>^o2Y(tbZ}NvpnPM+9HJUgYs!-? zEhobV-bk*u8)4kuY)Tvr6zk$x3B=&@$C62``euC~u-hEpG!&yJj_Txm7{=&u!+xuD z1$$Ix4yKiRX2f?1m&O>RvbJ+d2-_Kx-~$sFoCqn>RVFrakdGqT3D^8UJazs?JPCPU z5%dPuKt9PgIM0C0JyCmsOT5?8c=4)x{yC91AFZrkGebngJq%tyxd$t$Z+byl5%a?F zMS1R<-&GbTt4Kv~Onme!bB5=Mi5liy4BCKDteZKz?$@JrpJUmP49r&9b)l_r&WEm| zE-c}6*=Lq9kJ%>uoNyXo@P?XoY=$bqbt~YhKWcB%EOM&Dx_kD)-SWS%oIoEA0uOSn z{D4#WROq}hH>l+=ffpBah*s@l*5%kDYisaqhDJ$Zo`R{SxSpyXxois@6`OaGPA#n& znrL#KSa6@Y=8(p$9*_Q=Ymml5m%g>GKt} zUjB^(6U@fd-WU42M&8stJbn)I_Cdcl&+RXnbG^k9nD<`37=`FC>m4Wq6fyqSs*%g_ z6G#4bIduO4Kz+j*gO6}l4&cRTt+-Q(@6vP6H41s$wCu!Zu7HOUq6V;8&3>}o( z7G4DeyErKdg~KM$W*Wz`Yk9Yx44Ye+(hgO;O+a6LyL}oHMH6Ms{f4@V3ZB3q?JORb zk>F6|4d>+UbwW?#FRXg=DJ08BJ@^5<$LWP?-xro}UA)>m7GHmhR+w z&>5zRQtEuU!NL67L;f0%_=>!qtw8}AN}kbT4a>+tl}^B8+vka=yJ^%M^cK2U+M`tp z^~w=w`DC_`c8ZwsTLhMBjv zvU$&F@ik#Z=iv3{-E6Xk#G7K_@%3!2EKo`uvH?3{X>#+m(Z@@@;Ibk_tWz_0WKyUNG*L-{ngM!eDC z?w1V|UYmyVaeyp%#|s8B-aI#g2O@ZaM4?B^k}JTCsKM)&o?@CoW5y@>x~jIF{tMnF zDo_UNQZV6TnP8}*RW9s<6wH_c)X2boA!U)e*DMS&UG>+-W`6{=KQ?B4|7Vu6pdhuK zYa%f|X?S`aEy(>uJ)(d~&HO5XhN5XK#G)=vl<6ATx%ctbKi$E;6WC~*7q?k;YmaOf zfR$R-W+I`}e4TEY-2}=jx>QAGR7p<=DichJiPQcoyc4bqp+v#Wm3IB13L@Dlt#ma1 zqggmC%$MfcHw&2Oze|AU?o0~UiA!=tDs5>_R)8s}X!lV%|qYV!g&F|IHzAzDh( zx(=vug$ydU=cBQE z-!z)2=!UhS4am3`uY6BF~@I9 zj#*lb?)SeImF2?avenzoBW~i-dxasJ)P%#zDM^EuUL8(_ZBsq~j$w4}o?yv5=bogH zy-0+8Bo2=9!XDEchXd=tP-#T29d0&=*)-i`;k~=wnO87h?SymEMKI&>A8%b6F>2A% zokjyksii8K5Xn9xg?Nw&HxOZ^9H1lQ7&H-eVvSQHjbQRW4j)-Q|1W??MD`m~%-Sz83_r*I7UerP`%a7cSq0l*%h*t@txj|`uK z8)oo@Eo9(go7PJkj`!;=BJiOCL)-OJvp#-w{myUvb^xj;(^v)>Go5Vc?y~N&1hujh z_@n6ZCKk0FT)T(fR9J!=_r0z>KHoEb`!FIM_aW#cJnY&ANDiUP%}%D zQcOb}C-e^R)I?dxxpd?EK}EeGTQ;=VI!P{TM~9D^#Czyz+O(4mA7%CJht* zHDkZZn~V%n;di}JeMfg`ptnf3a%Yp?0}Ac88{FY~ zV20ODN9gDSa)TDLb-j7seH3dHgy3U4RK-%o1ICVbB(u`Gq0Tj2HvCV9*dtv{7OGmqr$=ds*tg4=f6dO=079As~eG>^vHE|jXbP(#Vy`f z=Et-gP+T4fys7~(?&sL>p&sN!3Q_5Q2G2!3=$cWEEs6Op-_b=*I%Ed#cwuWoMDp76 zi(8HX*Pz5+r=pDUN-$&=(1Krd1VS5~4!WopP3b}fNoYSapmJBlX-ME+%VsF}H+qu5 z8bImZbK-M`FjIPOli5~m=q>oJD(*GBH}>d0&{6s!0?vO=pL8$(!cCA+8?gBYVsFYd zA*WsLdgsdT;zpzSynKOyLh)}*0z;~?kLmJX`mwKX1flXM!?DX(toBVvx_X!@C6jY^ zKBqC!qiioxNd7Kuv9xaFJa}(eHzj8KLTK_(Sk6W*E()#t0q_*$v6y3Bxg%<2k;fbP zGzO4`^C`g``m=%AKv5`a7EpmPKGJk_uR0WO2_-f`=Rz>h}CVg%~Z7EnJmz_x_nLZQ_c|tURcbMf;k$D ze9sUx9i1WhhSM1K4YT_%YHH&5Vg`nv%rEhkTLuS4Rbv;dNNb8?H!UuspF0YyL~sA8vr`g+R^d?Mtlo8N+?T?pIc$ zUzsu#P0}m&78tg|J=joD=qO!^9^I0AcmsGZ@owJNy=0{r*X+&&0ROdHQYnS}SK#kv z$c%|wfER#EdR4Sk@jJ^~%|jie&)Zj?z)j#)paOyag?g}U8kYD`YDen#l81B7$ZX5& z^|{o*?JAMp!eGAKg?n4zXNnSV9}?F8u+804f7|AtW&UZA z9}rLDXmKXX*Qer>O&Pj-$HQj3z7BQT#1#3(_l6D~0-MRZZQYGlqjdwy z_MV*B4@Fha*4-%|ZbfuHBNZLZi3k|w0kYS0&tBW*Q(1*=1`fXp@cT0Mq8<}Ml;uE% zdUNtiW$<`p)hx8{Gsn&8eVYN8bRJ^R$pXl>Slza%s{V->re?^(z0&n1dDnz!{@K|HjdpvCg@sDpFFUJNN(n7ZWx zN4+i&QTJyz;Gr&#{dMsj?+EQoMhGU?b8dq+s3kik9TB|&a{jXOZj7$_T>&jrAJ@yb z1E*gx0@T9_0O%Sdjg4FCWGO2LC}X^a{`{#ERXE@W>{HF4GFDbhzCPnq;+*fLnK zl+Jx9Dj^uh_CLk%{$NFy&)pz9@c2Y7ehIX@7AiQY@lN_^#2$!~N%KjM^zbAsp2AGJ zwL!T`!?P$EB9NW*$Q=?p#|&MMhbharV0FkF;rVDIS?@QH5m|5OJkh|I&?J~$|A?-$M4Wgva~1cABegKu$(z`@y46R zx(#Bp!TC?lD&Jeo+O;NlM7;;nwMvGEx;gG4aA|Xa^E)f+8j~*y9l!$G`O^{(o~7u# z1Y;I-=S{a!0^c(eIyo65>uyM1_&XDD7MygrYV%+cn+X58r$t~lQa$^}75&8x@fP}z zD@x`bE=mmJ39J+_uy#EZ9Nz@_L&T+>+aW(|Wp>EDl9;ozbI$f4)OhY>eZxze^qEea z^PRK&6mhCYVfo>^gft4Q@~-mrh>QY}AQkiFJQpV0U|F9)dsqqwW#h>Y--l0KNvBnK zcnWqUF~_&wXMki z&ph!~`F^{Px8!s46yZ(H@~OQAmJt!eJ0J6Bev z1vilLWWshMYVR_COyK7tBgfUCxr?BQpJ+|9RupY;{Z%}v>FVt8je#;1PLRI6$$qII`J%@xs`rIt1_)z5_zxua zKSB{};?E4QV?*kp0{5LGHmj#%Egnj(lJ%atXDBxLb_t$-TJFJKe4kNiB%r&+^zi3~ zty@m)+msRk+_j0oIN)K@?fSY>p)bd;Eg0v<(~|WOIeLPn+sqb@0rUvup&9OYxt!Pn zug+Pmao;)(J*yq}0$=yWr`nzK^HiuY+O)iV3bwiXHMt){qt_jq{5=`|vI1*foLikg zH>!AmzL|omDWz-FK@#RBEg0Q!oq?52p1%!7g?AHF7bF-*=gFU#gkV7z#XreN_?`-%z<>MaFF zZ>l~5oo|BGw3yQh;!sN9!4SeC)7xkai7!J>ERpXpuZzY6 zw?+obw_bUr&_FXli1Xn~BySoa1jJmQ{W8}2g*3#<1(t^m=DN3kHf`#LlhU(2q_(#K z!5GV5A^$J8@)NxHRki966UjpLWC*n_MpNb^9;k{xKODU(Gv$Z z?RiQHpj=1|Yg~^>S>{Zm4yYi?M`^sX)sHC}wqSQFSC6@S$hzCz2V!X|)!|ET2S>?) zbKnV?TlSS($3Ga5eN9HrFn(!!VV*h3PEwv%_zDrAHO^9zKC{p$USC6mDV*UIbFlt zV$$!^m_f2d?qL0N2U+z7%#!00?Bb(*3Az7gt*r%7nLK~yDs_ffHitf7+nyS4-9Wg7 za4lsk;^Kly#PLL9h6;V;*>r8}7NRkYd7;2J_2z?&?^Yw?PO`bX!jhFISYZ(+MI&E~P7 z?)_1cZU-GMC5Go!;Y5QvW~^%}E-1Qti}$BLYX`N#vnmPlM=kj6)D(z4p)FxLcosG8!XN(iRzs`a$;2tuS4qVe$)+9M61{OR1xjZswlC$Q6~fkhp3Xx$hrOQ5Pdqo1(-`kY0h`- z5Ax5hYLWJi3G4~hjCME*24j#4`6woCEvhM!bXLq$TtP*=m6B%%c%rQrI8u@TjZg{N zR{L9>Nmpfg~fRheBz{{?xRU1!1YB&(`}SXwx821np;lxY%4S!b>_Ark$t>}aHqYj*=sgFA!}ACDz6$(w!{z5n?k{LR2RpESG`wN;YKZM9Z>f)9NF zvppWG&bOI*kF#YnD!B!Y-`5~=mnKAUe+bGm#$0d0Idf3Mr>-Q|_|nF1B3AjN3evR4 ziF$J;B50#BUh_Qm~=)jq4(%Si}UVr(orvvR|%s0V0!j;;!E}(Abs5HXN z{zWqr`8y{>cxV4o>G9b0{0g`A1>>MS_iAfh1U2Wq&7^pc{*b1q%-cXPmTDc8!0hg0 zWn7w?2&572BH;*EA!UBH1m?A_bXb909lldcI)qAN!DZo=CNc~QAawu1=cX8mgWzF@3p73Mc& z!la7AX4^_)Kb+hQa zE}bisUrUaRp10b}yK~xVs){&clG@!$%aD*(@}Nwlod?IlBf613b}>EsGmxhUURs_( z%Sq<&Jy9ODOjv%k#&|^J=u0w05wYtfwPd=7NCw_ za{0>^ZE=BqWMqy4&wt^MDV`TLqt>_77bJ*x>9IBP{*jN8zVHjJU07E234rHr}a{Ffua8{DWDjGXZX= z00dgy`9EPDSBZeYZmbkshQx|j5eWDjAKmqDTpqBQ2Xc{ag&!~;LbMGOiOJo(d?{_`loCGHu)^?reffGw& zFE(+=e;8Dpf8)N<@X>gQC%TN!!^8`Z82hRUD5FI@>s;iQWh%ZD9<+a>6x?N^BeD8fyfJa) zkO~c(&mm;O@gFj=hG~Hw+2qU#c)ow*3dUha52pn_yZc+q$G6tCf7zEbQY-!0^3lk2 zdB_{H1M1yU&m`aRT4K_Mc?n*wJ^Pfki?~}OY9cL= zaf=rh`4E+xs)kBzS&K?}68j1T+<#wEif4adzpax9--OWJFJxo8iT!K4BzQh zE*(l#MrtZ^z4WRZ$YvQpzD=Bpl(`Te0_pzoSl*-SMbZ-*sqmGDurHCN68u4S)Xo%`U_5TJV0LLlKT-Vn<5tv||3KvMIIa+V*8gc_*^46a z&%rBK+Gfq&3$vuQq$C4+l!?fToW!U&J(ytQ-=q|QJZ@B5;REV*3)|>#0e;2hAcc3r@aVw483{bOpJs*0XA_;vDs?)Np}n59%(0q%x~P zb|##4S2l%XLkQ5Zrutl~KT}Q^Ndq+>ApD8v+;2FDzyFVjs($51-h+_HKUs0*nb;JT zw6O2LyDf0^^A4nmYooNwQ*y%^0n?nYuS0M#)1dh5fS*hI#NdgA#rq!MZ;UF8alYDl zd13P`E~$If&LdeqtQ9i}P}=G0@}p1c>N|KFq;C0knAY^1N_sOit{03olLbT)$Eh3! z(X)wZo>1ux9bOzMs={#^HkNprWNivkKSMbGX5xup#}=ND&+6B<&YogS_-dnSMnu`I zV=d2^9*5Lku_N17iHHU!-Yem)Q;fh~m6C)8Sbb4a5(mH3`U6+~nnoIV zyveZ5?RV@1W?>w?QN_Y>)R9L`rySn*XH76%UMM@q$ZH#yG^wDl8pa86Zgd&e21C%w zp=6@dwII$D%AJaeT#Y6<{L!xWS-FBzES4yq>nY7C4gRzEH(cQ0SL{ZWQA|QmXxr*_ zm5QbQ1cy74vBM4i4;R92%chZyPAOsRx( zj4FI59CoNE;`PHg!d_%PLX0lQH@sb0^fdraehil8ilkJE%L};i$~iU7}-*uiO*SrILASz=27_#at&y zw~T&P>Z6s=&8qD;ky)#eS4zvz=FPdil^hga;dnr%RG(Y}%P5 zg2{!qO(#*t6h>G)drF@T7gV_2VhB}YdZWpdMdjImK2x!CJ&Oh94w;3{L(z-+$uQUX z*YNdP(hB;(q|MrUFG=*ENk9`(SV53h*C5)4NFi$F7Ibj>kg3Jblq2(4T_Jjx%1GIl zCW3R~V4trH)SYg^$$DhuK4;G#^*fFDm(JqlQ*YrnsDRS1piKhzwgGB3i)&q%ILWUSi*y22Y*bMQ;L7e7hmg@yo4s$T9W@;s zeE+IeI<-MUTOQnFeznR=$o>XQGXn^+1L^oQPQOmuly8;+ih?@cB#=U=1RRU5`fpEz zBaRT!+^IUd>h?#(DCVsNg&II`!C1tf!>M?8@|U~*6vrCJR!bB#(8~1fnJ=vTEp5Y; z)u3By5F*;wIU;rZ;%LkCx@C@P<;A@-4a6u?T7$~!`&HOx)Ulq^x5!96RP6y$A6c^N zVed|sfJMS^)L8mCp~63(FAO<=Ca>>pRoEA_aeQdW>mGXQ+IxgUD5qh(>&M%+mHnF} z1Yg?ytyd1#{X5;cx)DKnoL&k-2%T2;Sv;SREfyp{W5sC zYfH>d30}pcJDkph<(H`v-Bk72CWA_9n~tCgD$qt1o;-mxnzKp*NoFqVNqwLT|7Ucf zc!14=tk&t~#*YYA{UAqRfdf1_ILX-|vLNI8wd_1ur7rZQC7xipw;9f?A#{6<#cdC4 z-l;tj*g2kD1EkM>{{2EPf4Bd8u@cY%R?LFu-+D1O^{-KHK9f=KqXL;s=Xt`1`1*$9 zaUsX~5$W$RP;?AcBQQnSZyD}FIks!y4%b!ZgEUfEp4Dkh2l8&O>bTp1jRn7iV=w15u}|Lh05Bk=`;6q@`88#pfIMy+Qi`tiI;3A zYXie;OH20UuV3>lFIk}t^>%~rj|HYWtMApj!CxDzeAxYy{LCrOv#VVqLbvuE+p|qj zUH#VH{M)EF*-bL(G2HZq4!t~SXp>u}rnhLw?B$H1&TH(N+Jg7h>yamFsr0QHV|{1- zoI40#Tr4~BXW<$&%H$$vNS$MCvDN=fQAApPX>0YBQau+Vqb>b+O&J%zi#S_cpDlg; zepDzCpPC3=EM6Aroy{h4F^hvoO!+RK9x!{`yEAo!^kpnS8)64p9D0@x8$srBlSkWN z;3(Zh{b_CRUnVSa-SLZ`2DjJXZknY%tJs}-PVT2vgoQ?Il zLGq+LSY3(<`{)s^T^o@NaV}mvGSN+1T&eD@xKE+?O&K{54C)vSSp_$vA;pc@fWw*W`n!Hi0~9!HtF@pg&4(Q^2xA5Mx@9^c0NVkZ&=LAx(Z5#Ch-R@y6f=OL3W?RDzwFzMyVsnD88{pHto^-wFOWCUw*Gbr3* z$JBg=R2Bz(()830A{a@*NuH(dG{9aVaQtm*YJZlr?!;_p0`NH-ebscFOFXNhHKa@( z4%@6Xt{AjU2ij5Kxu?T~p1s;m(O*6YQm7wwpN2rM-fe32Tr@F$ zb%26kKP;EBI_#`_%A#1dHMyuFrOzNS>0_KO|I$0tL>HsjS!1jbKWwNYNKY1Ud=lTA zRB&NEaW(Lv*oo42qO?QxBU=R6BuBH#*$?itxSrmvDJJKNO|_Bt{o z5<*{SFnzjTRq9%w4~O{doE#>?igTx#+EpDxXLe@Qr?XG>j^mELZASDcn5??f| z*+aC-o0JYC_4Qg>S^`0V0qo-VvB*Pq?%5Zq>2{D7!w^?2_EaM%KwB!|VtR_xz6km+XyH1g}Gmmwr z6K$+wnt7E(%6y=fMMfXVWq}ac`6c%46Fcj*N!nY&wnefzg-W!E%thT#Vu7Zn7Bitr z0<;Sb$%bSTx1O86c5}~ywRtlHn4|mLbl!5d!sY|qU~{VqexpS+6_-n|PU}#6Wx6=B zQoO~V%rSaI`Vw=Np22A`Rm!=K30>0{FGzT}!<0DHGHiO)o|yC{*yt&V*xsj(8CP66 zdrdSk(|H;g$PQDTlfUq`_Ns_ukq*7PfIHO_eyTs9O$R*EVRO1~>E_jVG4{)O=DGU`Tr zv-5xvZ-x%#ioo-o?+`{ejmltsdYeYF)*e(%$^)TF3V#o^q3_}v7AHGKX|-XKRpesvh)vc&~i<1tW<$=drfuYU0{n`+nELre8ZN5W? z(4B)tS?nq?3#0*vl=w56%#HnQqN#DSe_gIRwA`{2Lmf7?I(|Pv?skbZ5XNR-Oq@hCm%XsD-90q&m?aXFL>%*t;7@j7Zj;O(5fv}8(&PPcRPwl zdvtcEq&D?k*q{PeBl6CqQQTJ`@aKjZ=f7<@=E1kypA_L4STd)nh- ztpM<@{%kOCIeyi)YjVoBS1^~zKl!4Mj-dr60}n~0GsWN;{MQJpxY_N~C_mqCCLHULD=wHAEDUh6g75;PzKmu0fqCCDDXz2|Qpqyz3);2OO9 zeZQ)FF-N6iy+v#CN8n~72eR2l6ziR1`!n)yoSR3XF35Xyj&1^{9E)o}SE zb-~kB1a(;3nD14uT>C7ki;&hmLoiHRfj^`JehWJa`cPd{y>|;46$dDsGD>ktD{P^J zcKri(OeLQ0!eIM!bD3r?eh?*xTqs+?nNo$X(7WwUeHk4A)hJh3q{kRz0f7rOh3)X0 zFZ)S5S?$s0GH}!bwlA`W?>32{4s^hX7G$2u_e&~WaaztlHQY&2?6vO&z1i*zkrtDK zeXH@wzTpa-qEEaQF4?NncPQPAf_Qt-lAm$alE3Q|*d1*#gD!{=HaXJA_}IGs(R6Ge zV=sL>-s&J^PT9sP{CJ^Wtu{=mm9)iGz_6nW2Kvd30zZy+mk^!7&O}kEMX`F z-4NhRKOFVbr{h?7he4jz^WRL*BNwiT8oP<#4{^Q*H=g86} z!INh}{5@E@|1^Vk>Xe~&uJSZw0I>}i40jGWEP5L@7s2aR5b1>yUu@FsneZB zJ&*V*l7JM;ULvfDmJCvI8eU9lz=|so6i)@RCrH>agIujeofhNz0a=BTMjJQgE|ZHv zHHQ3`E!~Bg&%PY@o`$nLr*8PRv;roa!`CLMEwtdk6xa-Q&iw-(>0@>mASLyH@W3|O z2|6w`x)or6G^Pv*t}GweJ*NPZtx7WB0K*^0Mb7$pT(uA2h*E*i-_6DDZbOv95c*9{ zMk?P}jbP-pcV_ep5$FTSHDp;HXz#i#{?Zv-juE<<@W2Yc7s4U-DX;)(f!DkZ2VB$7 z8TPgMICIAAHoCuj-xVdBAs zhY*wvGKhf4|=tHN^KOc}`XkTn6zoYLvAq%eJNWMvz67$9=RSdWOJ0@#WMwc6iwe?K&OEQ#3O5 z9-yBM=mVWEH2Hwka!xu7F5w+o2~re-MhM1m9*KW{Tsjg+&agy%^L^-m4@;O;{DA?u zGMN6}&Ax!+LaF3ioe3s$dX=s z9s2z0^4P?xtLYoF=KI%-X6h<8cI;&p%o97O3Goz|Sjj({Dx%c8k+?WRsJ61Yl)V?q z%H}q}!Davn9z(-PU&88ySOe}L!wZRy2;W`Jw_L&yW}Fx6`Tkata`|E?ec{cj&@%U& z(T!NNuF^v4ta$YU*pJFBU*8JUaUxqY;H6n~R^?^kqL2@SLs0KjO)JZ98mkK@zdk=r zpr^of9UK?rcm7ON0%sBHz;&(kTcXlai3-ww%aJdLxklkMSn{*%i|6J!_E@iozV7a_`Z+sVJ55i>GpdBz{ zq-?&f8SOC*1c|V)wX7&)(naesk&ljn8jT$ARV@4pSwDk_H-!p~JAh!M4gxEdW*~_K zkBK5oJ82QF36FXHUuU(>7ZdKj1CE@R|03r^J6rD>Fz!7Tg{w0|Yd;I#P&_n`y@t7} z42L0d)0Z6z?7#o5<1`w%=~*n&V0Xb9t163eGL%dSCS+K(0ih&7flXloy`VQ@fl`cQQ z*rAW~QEa__%6ij=p7_f;x4lVGn7U_Ltyiak;jeW&5F5AmKK+H;B`6sE&1C^4tyWg} zQtVT3t}yCK@Jn6RKr0YFit_}tXV*y8T)D1yV4L@~U?`o5cVwU`W^Z|}aZ*4sK3CIJ z2QDB<*shS}h)9|m{Tea8-#-4gSe%Z;sHpEI5vVkuy%1tj6A1c>^`YGA#Ptv*riarZ z6_bvAR~o10kpsOKJdue9@lk6^987T)#v=UTTS|y?bF4+(+P%vMDx2(}|F?|+J?~G~ zm+w)3Du20X%il*48|;m2a{svhW6yll|7U&w$$GW_Z$IBVI>SEZOv1#km5={>ow5bi zET8&!{>$3+F8s`MU@`Y~&Y$PUXZ+dTkFPHKCCbou+rBVsdB(3JP4;a6{%lphxpPt-b%eqDNr~L#u=GUL*i~T%*zdq-p)OqgXr9aODJ5ne2NB;vh z8k@WSC{MlfqSh#uKL!^QpU=N#Jdyui`se<+ zKaXYqU49f&Zwb5x8rTME!{M!B`jFCLom-dmiXw?T7< znXmiz_}_;wFH-!!=jUVdeP3017yR}HrwMQi{>lC6Z$3)AfTR+r2xy$czC@oPWjXIN z0p<$1AKuIFnr~+eH-De~;eI`+Uk~oy0XqQuQu>cOfP4Bd5#XQ_u-#e6_~1EM?7Z8vp1bd-NQ(8boR76lvdJ}1)6s5NlKq&$uDn$?i(v_x&fRunB zARTE+OK8$bLQNn!`{jO~w>;nV{*h~UPtMt$ot>He&F)N`$t?pOPBBgd0>N|r+Lb#9 z1T($Lh+t=>7e{*~>*xiC_chC>2n3hFe|`*zjQ1i42JyD*S9Hw+->=a)zRH*f;doFZ zVSRPxzf)R1M{Tv^PgZo|$Ku#3b-wR$I%c+@8LqQih;5xxlwx%{(R23S^@Pipudyd= zm0dHxAE(PCqTo`QxFL1&wBFjEms#^F?Qp_%?j^hHd+&#AapPgx&<@t$+|N9~Jb>_# zMjcxjG4=Bsf!9fY`@{WT7nY>oJpJa^gA4Eet9V$W{;3J^f7|rO@oA!n|M|)b9S^^3 znd`6BZz;JOU6zHuINY@~SKJEw8ua(->yu7iaz;b>%XpKfx8>>RS@ zzZ%_l?<_ieVP$IW`?Y<@hy3|u9`jkf{A(V@7P+QX`VDV3Pk70ji%6N)V}XxNw|;y;olB*6oI*wl zC-cl9Wudgfm;^}Nc>(2VNlBVulJZjdYmdK@w3mLj{sFn>aI}9pQC)2G1QR}k6dKs} zA*F4NLE*kiW+eE?HPETmLnk@JjT`jGc6R)@p)rT5Pk==B21Hh;yuQWA9xsPDS6Ui#rB-d`S;UjW|pnOZn0~(jU8G&QfkXD z?W*D-4kW`|sjG9qfr_xDH%LD91I4&)E>{{Rj*p$xsve8X~ zY7|5l$mBO?9Ys{_oM_C}x1&|x@D;YkjGK!F7s0XM0$g(CG2&uP zTi2W`V?gzUGP|bnkHNdlO$6uBmjS4f?{!jm{k4bEkgC;1Q9z;WiT}W=MF7$LakBYb z|70RmugnDu)X>;Bq>41`*L<29yuL_yKt0n(s zzj~H?#q_B)1~5%^usxOJqKvsFt$Ffc3Kw`o-jR|rfoKHD9utY$Xd%}`VbAVKlI(}R zb&-?IWvDGvaBjCZIWcFA5HM5mXbqArVQ0{vp1#t8qJTSCz>Im!nUn z=^nGG4}tG`*%}V6rmM(8`I)4o7|5y_rTjSf(L2-w>clUkgrG~jt2CGs;)24jxPqhgb zN{pyAC34qdQDc-_?GU_+Itgc*5?!5gNELlhJ;MT$hVpl!zqe(Oxw7ST2jILwB6vg% zv7_+*LVPV5YhS<`&!I@OjLbh!B~OhhC*S>g|M@9{uy85U-$Fkrq*Ql5zW>VnSPW#l zjB+ur-ojeXRCu`PoIytk&pe8A*`L`@>WVWzQz?Ufw zjKE}9$@ZI7H&#yxS`v{m76HqYJb{suaBQX10!j`RH-obhpppcr8n}J38iDfwFKoI^ zCsL5=h^ST8fisVP`E+Rk^-Kz_ag6`slk;qbd|z_#v~15bkuBgf*Q`O;?fZWr5;O2l0y1rh!34 zEH(uMll!efS`hD}VG|$@_9;&vkU9MJy2e3v2lhU|k&S;r#MVoc15Zk6*(I_QQC?^q zAjmOz2K?8j{KCaTo%XyxB7ofQXN|fj=vSY8(t|kHr6Si?Dlexlc!xLtSe$JPFyS2( zdz+Lvy^F`wKD8+}@-BEo;1ce&!weBUv}V8lgdmPc0b2F2Mdt`rUJ;+_(d z>KM{rU_+WrFeOyB7VyNmhicj{-b^-MRt^JbZ)c#+DEvz?$+_z&nO**^hL zK3Ghn8x&*8;y$1@u$d5dpc{)k3D8+d!~pSr-`EuvHw%wlkK?!s!jvLTFj+u(4slVE zQuWXF8d;@jD`{ab{rOTdSB&*>?{}(1@!*6I?O7U|jjr}<<1g@3*NRBIDB5xl2Dc5D&t zsJ?v^&wGH3?~Lg-cBFQ6cR`b4-MBh`aMNKOt8`g&xC`7NYY;FP?zbSrt`&635)NfR z#jNO?poB zD>RzmK{$7jfpwXicpJ`4337F&ZK28atjqSIpnwPhtl&f_l#0>KdOU|rDW!Ill~OT> z9S*!`*acz$E1GSU+)u8-A@J_CqjM+y*lbP^_2rKCi#;v8uxcXI%~u~)iwnPvgY2(_ z%LlMjOFv}Ni6X1zGP=F~f3cB|IO2B?OAiC|wI+*6YSuqn>z|B%+NE;>QYVPuOd30gt|G-xN4YaT#lv@Iht4EEtm3Bl2B^V@3y6_s5Ys883 z#o2cqoG(|#`SF-6$=q3d`F=|982Ie*?&i?{L}>pDu9Y!J^_KfbMasr9UO!(O`t}!_ zm5Km&#d$BGCmwekO1hBF8MiHUA4-AKW{kQ2@Aue?DnAjG0<@=k0_nTx9)|QI+R9~l zSFK)=?sTP#@2`!1OkYW+LoTCv@K&^Hzxew#JI~1T>ije&73f$7>$+DX032#u=l<7fcX)};K-P}-1DevMwR>P z#x=RrH^ee@ZrA@@7wHac35{+M>?!np{I)0}dO}w(AfIVz|8i#pa#iQ*SV5cOlM3BS zY41{rydykkuZV)$k@Ily?RM<<|Dy_JHdb}pO7Ng4!k=-;(U9ege~k&bG_7NEfWXJ&eRiX z2&wcRs*M5W)E`gcZ%Ot%yNS@z$9(DvC!}g{UzlwEt#{_{Z?@5rx3n1dFaJ%;Cs}Hp z>-~>%|HH#D@I>%2;>`D6$X0U}yzwf`!%%Ja*EgS)#}iMf zD9o8(#ixoG-)7;sg`dtVF=k1TvO^v;{#flWZ*Vo;qG-ey)U(ea)u7ra`ozf^|JtGO z|1i@Gz6UybkqfweXoqAVsQ~kfBKBEybtZ#fM7)-1k$AKx5{cZnW+JADy>AjLA^p3r zrPD+MGuOY2AGZGVyP$uj{r*D~L{x>he$oAg!p)j}ES=K--7&5U(qeo%?b1&+a6#a! z1ud*+ezmk`B(!)u-@pf)J8{#A<;Um7ub7C%wl2B6&YyY4{oeNPeB!%`Szuc9X3S1S zzffAqfB5@Q9V(~8t?mD%s;WEm#u}BbtIt>wBKC*ZZ&rkC94QvjEa24Q8rC_I>t3p} zK}e2x@87pD*lyiau0r^p%yF}dMBszm`5+mlma21-a1>G;6jSEDe|G)suKvFSB6Am7fmzCP!s(xi~nBMkwTd6j22PVB2e;{ z91TGD8w0`aBG3`F9TLx&O$X*G2|Q6^&}o||J^s}6c-%ULZ&p5*&*fNBD;ZHGL4Sb~e1 zqQ%omUf7Ht+zO!lM{C|ttZ680DL~fLQllW#E|ArWNA8}2o3!^j_tWaogFbCBV__GM zDKIy6J2RqCf$v-1D)nEBoKf=zI;?mmCR@PYKqr_HJif7dn$$r_1XSt_-9?@IkA0`J z$P&nVQWmf{DVRe-z?&LFUx-^w((z4Kby#Yj2O^N$12Oa3ZKHeza5(@8C>?7nkNy|&|r1B!L2fZKENB+O@o*ba)&8g2ODIoz*V1|sc%kR z@6al|nYBx=8zs}F3JRkt)_O8ReN1%cdIEtzoY;G*UVpwew!uhXXQJ^KI$>3zhCG^c z^VH}G`>FiAR7@7KcFVaO8Cs6r;AJ~^wB#@jYU;wi) zFR}|q?(fHG5$?cgY(3aj9*g~-)W>{(?!e&`c}~RcL;j#d|0B4MNde0XB4BeLtG|E~ zyiUjIW7e>mcpK_29p$D$ovi4Si`p|{qp0BosOh!%Yd=e zF3%k5LMPS+N#IMCo)cldm&M>E1G3A3j5Mei{r)KNxJ|$gKLe;+0jG&{RkwpjLDHS) zH0UiDpddXv*)^!$0?8<;nk2t62V0jw*;4t&W9(tOw#tD#2Ft1ZbvGHF9y;^N3bG(W z4NXVmZ+$_j{_H}IqD-}@pLrk2JHTFpuKu!IegEp!jppF@jcm}{gK#GD*1rAwFTl>wZNKKn}WTN=c8HrS6{1=puF(uJijuTz4{{aYn>LW zpgMXO=u@SKp?@61A7ES`()z$&7@9tOVSW>5o@YFs!0%tA=&2)OGF4C!VEVSx%l)*@ z2MxmkJ>=!))6IJ}>fSbyD##-0GtH&9Y)LMH%;9`puk3Tp{6u&5e%OLRcDm)b+h)(W zAm4@Ts0}5)TUmuBCOLXG7BnTOwq;S+fRBbqi8m4loU=)q!~#~La1z+s-iIXPa&eE{ zijH(g@2~t@`d#eYmEL496w*5}Tb3tr*7azFoItX@7YC5-?XItmsx5a%yFLI-$!z{tD?uHD7hq zPJsS=+Btz{ou_sFB8PjKQPY1prmh{y|X%-YlHlh+i?CHADq%4{X zY|r}&Sh2v~2X=WaC|GCqzNC>=Mo^4j9s}MdvK=nQ-JmO-wbn;H>=6eFfe(DW zM9mx=@s1-~-uPqW$I=oq=78v|IiUE7k|)D>twSr_^KBCo+(M?%u;0z zv2`cDtU-^(o#vi!c@dMaNU#R?pD-Zngnb#~n?f?a>wahdJ4Z&Ifv=;f9U~v9wm5Ne zt|?O*zJ2J7V@}M)L$=?|8~meM*_KEb%ZI#Sc5Yvru?R20QYM4(i(z#OW%~T!ioMsJ zX<@OGsQMP_l)GJVyY^e3+Jm`$6L^S~{NPqesV7u1UDOXgIuctWrc0KCKg2eep*)^Y zV(=7(JmD1K+IU}qj^ZxR%c4C#37R@kxqr?_qyl9J*vQS(!Bo_r9g*t#_Wh}1 zgD5sT;nyZ7wjw@*SMtqiyZ)2>VWD9(BsEc}6Hbl$gq7On|qIh3swt=1C zFbk%J7%@)n1QKdVO6?_C#OHgt`v!BZsRctJM0 z$qObM1lyy9)WOD1f%*ZHbcHn+RlR~iqyxF}_1IhRclXw zh04d&H|y>xV-BuK1{O{)+MQqQVPFcIXYo&hzZ4q3A!B39^YpOiX2B^M&0zbtRkQZu z&fR;U$`Mb{pEqzz1$JdzIjp0AsqqHL96Jc$>_Ux$ij_sR>ND~^dF|VPb056)A+`lZ|PtrNA}ta zbqpF;zFf7oZd{r z#`&TSrA$~;EclvzoOo-_Y}}MjydW0qHvY&otajw}KBkeW>1sF9KO~~{6}Z%7k-7OJ zfinXfrGZjZ8UZ9FrU>S7Qcg7LNrT_-|ANzWC(GANK)77$vXXPHz@tx5x`OIS>CanM z&Bl&=kCETV`SCGk41sZLWlfWPaG_@1x>`ncQXt6IRbPtvSKX8O7h-os&8%?Y+Mfq= zbW$iqPdBk<$SoovZA<=911^V-{tvG+-*;dZJ`Q{Jh^gJK9L>8RM0jWGSdo8=^p#3K z26sX_b?n(MlRD1v5HS;9o63yJ@ffMOLpADaoJnK6Iom6T_F|FN;EeP~plETf9K=W* zG))WJunH{jwmM>eM(H#mMQWr}H*(~fb@=Qq$Yr&Y49;jO!+XCEqqXa}Pw>_r)axbD ze4nZ(nl2ZcgQ96AZDVEfoO$&d9;aW&R{_fwvII((*L1rRZ&L;8lO?nRplWp7G0X#5WyhV!8)x#d_u&hxwoMk1aWg z@M}J{A!0slOO_Yx@%>_mwEmHK1sxX6gZo)3m#5oH02>uqVBgbE-jxi1OJxLn{hp!!=^Z`nZEWZNm^FS45A0&%2KB1xn z+-ONS)#A1CE=1)UGjsRo#r}2=wmHRK=5su+O=1f-g{6MSCuSM%sg}_)7w8Sa-{mYFNG5Oz08}3Hf5G9rHC6RhR{G0O(#58Y8 zn*aQt=j*S^`Tw;TchvW_?td>)Vw}8qqU_JQgv7DEzpb6p9~{KMHSe~#)D|4qsCirwVnYr0Xkq2YYzPQKB26!aS*=#_6YtxUzPxo+FP3pMH$e>Y>)SO+mSV z|BO1>n|DxM9OGMz#+9d2z?zkP9{m6jqqh9sZLh}t$b`h!Il|G$LOY=70;6&cKqXIo zr2&u3Az=TOlM-VBA6UIaO*E*6`bi=}+)lUEHJFbnI6`SMYiFMY2-hymn$Nw;_vJn~ z)y$d5O%ftBEDeVp3xKZ!WnahEo&oI0cC!v5g{k!4UE0aZFQ{DR2KnYIQ<>dNHMe!| zfAWlb!m>K#xQP_+$H^~Z zR)^PqzjG)h8T4|&ao?Hp8k9?qy~|(I)-HGVXDeVJx00FSHMkMj+uqp&WN2Cg<&sj# z)g0%Wl{v5dUD3JY^Gw$U;dCR=dvMeV=5radv-AF9LczXHIHKU0N5vT#hH49O?1}%v zN4-=US0!nppQ)3w6tCjZltsp|S#`;4J4Zw0*M8R`MBG9@*edF@dp=(KFXk~%f{OWl z!X7|Pe}O@y;8D74qt}`mYZNkB~b1^7QqvzQ1OKPL~sCH|^1QjXQ-*>%rBjs|- zj(JN|ZWEu{Yn&(3{24+^G!HO`BEy?|d2XNN7Zn99RV}tJ_`*#8h|1LLOf*F@elvQ0 zZp8BN7(zReH5zOA`EXVmmP>unSHF>J$b<08ZIOg|%U=ezuf>`;|9h#yr@9vxq^pd| ziO@UsLgk)TFqCvC-KLHl`0EyD#8!VfNoYS4c|1Tdcc)ieU8G$lU_zXBsbgK{Ve##~ z2<$8KHd+Q!`I_6U+)+@m>%#usYNK9k`;Epaq=enAi9qu%u0NtVMYIUn6?UhbKul_y z?TX5g3!r;R%%o<@sOqn6R-?KY?;eB4TT1rTjejcC*%1&(u!90Rq+bmcf7^$AXjsQ> z=;p(<-1O5QC=}`8jf(0HF1H6#1Q&{rT5CA`Quyrese+aY^LoPRufVCI@h1&9pWWWX zT=hhVWSfkYKZw%GZKtv9hkZ!NHKYo=7?|JI7SMd@lAzGJ_Rxtb{zCZ3j*PZjaafJy zZF4QBHgaZWe+K^i1>HNE-hMxS$L6B}|MzHCUiPP1r~s6!N${*^GnactvE$hh z2H%#(m>yKUYAHhpw^V)Yabz=(n8eS_%y)$oC%c;dRBP$Z(4fc6fL8ioih#>{R0#{tewn1w7l9) zKpok*)aN?1_D?&w*F9+yTekLVNom$r=r9BkllC8FF^bKqZ=6(Hcqtc8+V~vTB@3?D zF75%Faawh(<`q=;9&lBn-=AWCe}iNBO(EB@c zyiN#p&dTi=UT^KO+0_6>23x=q>mfVY8x&SbM)_bwjh6&nvouV2SH zS$tAGT3SJ!QLfQmJ?~UtGIi$Avq<@$QQvHeb}uxlQm1+SqaT;6c6P<mV;;|$SDyaJ&Rc$X%l75o_hEvIZ`DoxsJ*BD7CJZmpttE zvj29JPSUsDl>z?@>crhm?9Kkcf(X3$?7aG?_Hu?M8@7o0vpKV>qEYvLfdxTXvF;mCmxP0*bn1}b|O*!TdZrxt4}4}oC3g_pW&oXb(v9!gT;btqcBs4TCR2Hz>y9UHRcm%|ET)>7mi0_L9`P4q?An>|EWq znv2{8lrS83Y=t9f&z`%CQ;jNkx6TL;5aIE+a6m zerDtcR4V#Tc8k$lsp-RW9(S2GY+lwSi4;JCub~_Symui3Ws@AZ(R#vrY`OZHcH3w=Pb=Ny;%**;1 zNLx9WQjXtK*Q)+p;mM9*6A2qUqn@(Qbry8o@aM8}ra_`XaC5=bPu2abz|9}%RsG>Y zSNnuz0I@q?1kBe!ik(S zy-{9h-VZt5M;tdARF1*>PNm2A&xd;NwV;k>1|}|duCcgkGc&c;{Z;vB$buAFSPwFe zQhz6V+0sQDXLt-{oby?j6U`Q&P-Ld@M~JiSTG59?@S{38yuJErl3(+mcFu#w69|jh zx{$I#TFs=8reV<={dsduY3VNU(I42%-z7(J3We!+Ff|seO&ooepkdTFivn zx8#KjZ|8#RQhC0u6bUpitl*O@krTyw4yH}ffc#3MLQLp<4iRE z+I#sGsyDtp{LA@u_we#vaT^+8TWdw5ETzrD!k-3}h@t&&+wV&2wR*_}ITpgGCfB`H z!y@CV=U;)qK1kXB;8vsX2U7)*hISeEj*&2w@rvC@T~tjRD`M?#keKtM@@s#^I$Oj7 zN4;v-hh)?+{p=zpnxoRsW_6ELyuLis8eVnBeH0?&yht)x9%f6)$C9;Y>kcYE-3Uh! zTcBu9#95oIm>c0pXYbnZGNCJDf{(XnxWTi|4KfW4^t6 z28}BHB4p^HuS8I$^!|^R$n%dOmxX2et$EU5<6D3AA*+Y%h>ng|Lbb7|t_S*Xor7_$ zoWjp1FFV!I@n-EKvK(Z0FFZ?{xB23iBfpRyP0v$9FM9DRk!7@bHSexIGx7>C`pETf zmhj9fKLLoJ!{yp4RwP-aeCqBW)poW&U?H;e$)7#xF}MSyi=oJzq;v{arK#c77WJkI zXUGT)-I&lxeSBcGBbGV650RC1k6`2-O6wF z6e0Ti-Xl5+@@>3wUDsRV1k)RXL;Of65|#n_q8o@%;f&4d4uMc6gB3Xr3oD* zgA65bWsKY@$OO7Or}(lWRA!AL!rRY{a!#wU3l@@weE;!c9E`}G>#=r9pGX71F^=p6WF`ywgo&Nc9 z(PpNP|Gs$!8!XYA-i&_#_K}c98-|ULB}$&t{7`TDXMghNg+*1w4&WF!zNnqRYa$}< zU_-$az);E6tk#y${WgWv1}_6Hiy0QIdwx#D~Z zu+s$)EBw^{gjY-)-0Ahvbr4n9kFf@RGA_dCH}06lD{R4)o4JSaexXOnYZqDCbe!=o zAxo0|t=fEQ?>ebeldQsfqgy%*U^lTkm1=?;<*J;;#P|A(L&4KU!WMbnyGh2X>dHS6 zCT_`3CDcffjihf!=2q0qq*xXo%<+NPI|xv7h8cRB7I5ft3eAbSe?tk zI&8%L9qQKV8zU=^cjt$ErV%Q{{+|KpRY@_w09l;E9--jhbK#(ggGc9htt9U_(Xe@G zgV6D&7;&oj-pG7J8lSP<)$KwS5~Lz)I$^>@Kw24u4T>qU0vlZ#ZZ84VwDJ+yU#syx}Y%(_E{h^;QDz$$`Y5LH;fDwngc96X(sMwyQ^Ui>il^hOGxq-T}T-*&W zR5s%0?I(8X-a$BlZ6gs{`%#@`8PVRqi@jIDb6bnlj2_5ZmE)&$rhkge?E1X2 zH*}Io$I;Q3=gN&1Nd0-YguidL6>Y{Pp3^^mmoxSDUjJ{-ObS<{i(%!ayjF+vFr_2M zNe@+TJr-{j8s(%DFVqR%EDJgL%YpEvR^AnMk+3E)^PCE)M1<=~#@s>it&Qcc!8fxAoxa3*_KsJ~lB&>9B;b5RbcfGFBII6ab~I0&xbw%aq3`)%raQ$JMr)py5)Wa)4f0s7jpX+(E=2e9(bU*nds&516PoE$*U3VbXeBA_-rM{?GApwB<)H?K>4z{{yf81 z9^@!SBQ1+C^k{qJ#G=S!W`|0&kcHr6nxI(|K1uELTjUTYQ?qge#3^nUXhhW{8GrRb zDKx_TsAIe*eH>n0LukEkO;g+t{dST14)s|qvPa#|9cFW*0+nch( zX(r|{vbX~c3jc8sL81Rz{G|4v&m~=q?IM9omEGd`g+kX7jliToc~1WfxLn~qk1*Tk zz-SB`fk_nX?y2vMo0N4!gtONO+sNy*oP{3W1N0%arUnhb7Ty9 zHDFSpoT1r$vF*%lzKeph$5)XyKWw+XB)40hbVkXRPBl04N?_;q!vl16q`0Ry3VPU9 zN#9fv;tx&!lz~MxDS1+9h(*UxK|5NV<=T-FOCwdp@RtNU$HQN%=kyMV#V#G}1tsU| zkBvCU`zTYjLEiqFiyz7uOH+A#vT{ne^rr}UbszW5d|vlojQ#N>gxNpTz?iat=ASQI zRc)~n1A~iiwyW|o)Zl9;urJE>*QBAB1fr1D7pKYAKgTy}Qx^!*ivqtSCP&11M?yb) za07v_R3J$*b~8^>p-rp9jtdcIJ{?;+Ig6d(Iz;j40?ZN!vl+lxCU8rNDOr^EL(C0+ zEynoL;~j_?{af#LxmlkD&^MCkG~s)OOCL9sp?I*ZB!PKP+y84{3yL%g8Gm|KSAx)hNOy=#=1r?X$xaXtucjKl25BQMp%(*x4=FYMl@jJ?SDCC z7csTY;_J(boWS_)P#6>q!c)J!d1io^ygX=9K@vsDE0E(UKnCUI1LV_e5yw3{eoBaJ6jVUH=-E9^y^8*v z{ZnDzlMf&VzGbCzuL!m6Uh8xt9p9w>&8ZbyLhffvS=>T5v@r$uz*|pFPV*!M2zKeF9)y!@Pf{MuHOZX`&G_Ql3~~SBb?oBVfu)m?YP0Ii;~_Sn!w=SXWh?!` z>xEcy2@1dQcRFv>#^SD8!(VJmQe)0*3#Qn2;SC*+HpfyLMZgP=P71BWogn)_cI@s5gR;HzH!Q$Rcow9C}^y78z+_Jp`K!o)&8|?-_%pRM+ zINu7$t5|&bb7Z>&7aK8^7JmRfFUBOKSQF$0yBXYRw)_-RtLUE-a!r-{PvS1yUbQ=_ zwVtQ-s{N7pTi#0Fz(nq=7OqLBTKKdDtX6pD6cVl|oIPM=NKkYvzHG%F79Hm;!tq6X zj}?BT>6XKgBPV3eYMlQ}f8b&{o@D6zuhu&+a*?1~GSe*cL+$K|M9=kaUn9L((TdUN zjv=wUn2>v_n9qTRH;59f%y`@om55VLdN&b3o<@`$VywM$q`#Z3Ds(~;sBms@=zZ|G z2|v2HiXzv2<_*cL#S}zao!>ObJCwvfe5#xZKKD}9UI1fLw#P>yUurr^-FJyBG3E!_ zv7*uV4ig&g-DkKX;eByS=Ll$r7S3-U(gE1K$xCixF2tgB;Ivy^M8PL*hv@>`CX>$~ znWOF$GK#4)eP4o~LiqlbX=CF8H}}O40m-fvCfw17QkFxsqI!dMPlgSXO0{iIjB^FX zp6HhvZHpFTtF)FNus#o&G{Wj-&*}`x#bTBooGRiex@%Aq`^*vT({j|;ptsK z1v+o!rIY5Ik(YN+1V+<#WTJY5fld8=YGw;ksqrrPDGhaz!;hKYrZ0=0ffGf$?Oa=* z4;z3AHGN6|^)V6o>}uqJ53u)Ts~8$#f3}(Qcj!C~I@+Oeq}1c)+01pMyzmll$&ad0 z5o1UH$#pM~_aI$&-`+^ziRM;cJpnCj(B;a@o3K~ez=RP>1f!a8tu_(2+W>jnE{S{o z_D_1`@Pnd#x3cQ5>5f(MRgtwhts>#n&oiMlWA)p`bdS&eJ-bFqL~-@T%`d~v0y*ZD zxU-D)$3A~96R$W$SUGY>BM~h`9T0zx8i~#GUcBmxo?|4h(pr#-tS$%#egCQ(HC8`y zvA6J;vrrG`&2EhB7dO7_*L$!6i;PHcGe*M~9<9)ZdKg6=iuvI2WYbDGwsw;gwF5GypK0ZV^Zj>f>Mt-NAj|M{MW^?62(Q&E3o$sId2^_5(;|= zkX!M*yi#+xn~uZ|YBJkL;^HPDI}xhl)?xpxDhpx3Sne*470mfXENb-{7Uw&BLq_@Z zkPjX!bT~z*HS@2;v{Wq)P5T`knZmpv2NWFzes0`4?O4k#-BgsyTvmqrf1~YDs3)y#gx5qLAa>`n45b09M@wm zmxs~RePk7Mm%P=(5@2<+cL94h0>$`T47jYu_933sW3Oig&EY&FWXVR>Adj|4b}S@) zx1E!h7`z77n)=-nn$nRcblj#iTxPlaN{0PNlBQ&y-UW{ zp;a?cA%1sfl62eBV#3(x=*dLskCkB`x5l=oPs6(Qk=F3Lb}rpo+fo_!XhbLG%EGS^ z-;3mmg7-qzfMLtn+@$8KhV@pDybEHG{Vfl7V0(;GayL81W^*U=-y5#U7M8~IAe;l@ zLJS|Jv^4xVEMvN9U}m|BP&KgV;QDNCKC+pl>6@M!k)Ck^19{zmEt1}?=nM?gld}T- zo~0rvl~_JdxQ(o2l?|CZ$m>8V&AL}p(3p~+ogA};$i2>#^J<^Lio z@W(puD$3o+{+2cbYzkf6t>6pMP<_#j@pJSTV1;I7xEmL3TGMkhkcoI0L24)o`CfG= ztDLYHq^Nmu*OVVTD_8uoi*1~;+Q2`(>hS3$^6VA2SIwjM-=Be8Oy7{J^q*M4;U`Djrp@W8Jt*4meL-oZ`01-yN@Z*g0p-H5cP+3k%P!xh_REY1#)C7FY&zgOyS;4Y5$6z)?cv-!G>3vPIe>bTk zne-?JGD~B_?+m_nTK%m%XRp7$KKi6t?#j~#hI|zq?GB2vm55_6ic2h?SjUj5Lzl?b zl5XWLGfDjeBsIAA&PPL?KYYrv(3wvlQ~n>O&jb!axtJ=M-E%om+Ei09Y)7$^5ZI;9 z+qcU|Nk0&;`YmXY5l7Vn-*XTz8E~fhyP`*5OvUeu@jYW>YR68k2olpoDVZ6)NYCs! zauEwPtTm$K(hbhZP!i=UHA@CIu9~mk+t*+;YQ<@ZgWb)=Qx5G|33`;hIKrP9U)z0r z?+{Mx*_`9K$T4&;qsrAw-N(1yr(iR$E326HR4ExyYIGfxezIo!P@TD7vQ;IQ7O;$ zJe*B>(KdXvKxIpfNoULK3}jk0pFU-I0&Jy)(h4chEV1g{kfAGs^|{^stTxP?e&P&f z;(niCxy>aNIAz$ANe43;!T4R!BJ3{<^Hrvo>~V89d+*rqMXA6(^lSp@-F-!v6xSG@ z0EIr8+$c`QilQ@qVQEn6J3H=% z?0tf8hP*|@&!>AXY00CPpes2+6y%3~x=c+qAGMxC7BR55Vzv|wmsAi{ypu7E*s{tv*v~0pLw4EY508_^HGC+mgzy#)wNWO)OM`N zpM~#P_oangXY`C{&S=F2OqIrAM;LhM2N8ti;ZHA9sBvk#zP&BcZ0a0!}t)<>=*Z8$&1m#aPWWac-Z^~yZ`!;y6kz0&6zUyKbHrc`mfB1sE@*8xO&I@tyLqoz?5UEFNzzsCs2JV;|B8 zU(X$PefS?Nms>R4iPNfx@64lx=eYdL&K1M)P3G$UPHC*KtaGDl~^X8Ua}` zf$#%5B|M1ZW9J&)`0{yw>YF~;6|-Yo(bzrFDwRIGpq?4(x4~}e(8XEc6ciattx}{q zbHcQS0~2vhNIb>ol2JFvd^ih5j;5CD)_R|-xu0RsXHrv8u~-6fO-rhkPv{JE)n3f& z)ujHM!`^y~7G?NhUcm~J*Z7Zr(ZyA}@eNoNNJ94QSQ@Jo(Y(L6j!f`Gf^V`6B7HE^ zM-OIL_sX=cL6+^N2ld~*U;=A+g&DbiTWOKi*U7)_x3eMQMT*c>V$6uA9qcvIHy?e7 zadNJ1-G}L+tz@l^#sQH!h^f!<(rB$|v9FxUnBT-2Y-Mj~5KLnLjFzMKtKMInv zffq~o2Nog-^0B~?N7XGzsz;N^T~>pd3*&&piy(S-K;R5wOV`q7BD8q5Zgu8sL)Yj zes0O8X^J8Tbb*he6oP4=2Mcw|)rFZ|iC5DW_vqs>V*FDg;T40_AhoiDO6WYzEX(`M z4KaD|-k(EHywN1Dp~Gm2QbGaa)Zpds{)!^J8tb|^X`&wA_N?n5dCSH1;L z2)Tj#!bhAw$7c;K8tiMjJw&gKsUw^{n zkyXC40^U>~@?KRdnj!cW{bM+1AvqxWjVYCl(e(1w3AUvtIi}|rm0!-dHtg2KiFKev zl5}>TDf8L%Ceu?c8G`2Z?JeBL z!>~p{)w*1#eUDjTNsMDi8QQE@p_ z;*+1V(8%4Du&b1*x!M#OQ9rlADiIXLU8T{r}DS`IK0-4H;FcEMo*VQV6q#fGGB zOq2{(!&49TI0z$6SzAa+dD3LJqMymN@ngz+=y~=Z~U%2_d@g2YOCN1Slj0ROBL^Dm0 zaz`pF^7!||1-}mbCQ})8Mskzy3H7?f@WBhUOkD(8sjtIUKCJ(4-P)Y|DXnCz0Is4F zn>-7|S-TMi1iCE{lld88EWTnbSi?{sw@$d{AjcQReirB-cGJ-pvA8*OOF#1{dvr7U z9Zju~%ZH!DW*9F+*5Tq+*t<8!jH5?rHR~6g;ZKL3b8Y#BFs&kv-tT{bz(8w>}me@?@yO7XMIK|9JXfjF0l#IoUu&PR zyyzr#$qft)OU!`O}G*C=>GG)}?}!v^zZk&{NdVg4s+@=E8`pNw*w z>hqhl;i{rp3}lBleurwI12+>Y@RWCd9^uujJa@lYGvDj8&_K4>^RdZO3RvW?OWZCV zT;Ik#CZL|Mnt#V;uc9q1XUc8gShzV=b}okzv?X ztMTE)nP?}+L_x>9G|I&%#duAbC_OtTQ%bE6yK)WMtDW#A*Hfl_vU7r&6m$NmG3Lr- zQlFjOMJbc4$&YDT7cB*@SaxCu)5p+FxtCk-VtMNpbM=63YEgjpv+IRy$mW2UJQaGd z$f{+J{D!Ya9C-Y}-RmGzUnCjJiuMMX4D{8h{JXOSa!3+oOs=~k@arp1J)l4ZX{U9M z(mHgH*sXQg;1p_{5euqxV&<-=ecM1Pw@wEwbiqaNxH;UJz0G09ZtXxU{Y!LxXvUdk z$>(8;TgVM6w2(VKjQ!UDun@u@A423b%dJhoD41LyKtxQOBrM zn!<$N?G`@L%@%YYlxQRSfT!^O|a9YQ`c!P3w3RDQt55kb0J`4GVB-RpHDAV*dPHOArN^leNI>X#2f;Sb@&iE&l)w}eD zS+`+T0-EEFWrd8RvDb7qxL&39q#;Sp_JZ$E^|feG6~})dd|?eVq2@Y&ipXKP``E|M zLXtgPQZs__h~^)vS&Ji7>d+xp2Yw^1c< z&7-)dDB(AnU81*H>2?QHupbMAAp1-ud1z(1?nLbe0bylVy=Mz1WbuL;ly_B++s zl}&gsyN0%}gxT0S$=5`?{Fnfx2BrE)QKE!C8Mp;xBAW2t%|&M1C_mVPyyaX|8)f-I<8a{mQM0@g%)xy`10ih+Ee*)4wcdMhZY7l@ROa4T~n>cO#4xxGCH;$DP z)LzOy;ny2JP%mHBfAfp{)giW5YQI?tt-K-+QZ?T{UYdM;(sopUI>QYJ-MNRpu4ALa zp~&^)!+c0%IM^v~1&_^t%}MKi`n*Nztx*&2L}d34Q+22n)WEdaj=q=^yhz9n+{G?? zGW$ziD-a3rBsICf!p1+x!c`9uKP_`v>{(-D8g@#v`J2U5!4X%?>#j%oPLw}i%0q6` zhq4l1a{%0OtjGL@i=$rBmei$ETcc#31hln3AE3OvDGWRfYqt=8I z!X7__fu2mjs0HlW5VvPEO#msqLDl~8r7V>gz_PyVWon~_W}+?qO$!y7jzbh0x`KaY zw{fW`=0wmb9+2P@#_R2I*F@@D09WJCcX^B~yt^D*ydAp!UJr;j)Y*JD3X9F#MqfvS zaW{lqop{0Q3;&~`+qC5WTqyTX!&|$WM-ftixFB#KAjSZjC1Xx+5H z#nI49I*Pu+Yz6=;s)LU|fw0?&K1q(c4{)3P3WW#7m`x&U&)Fw`@M^w_8hR%*AQPQ|T_ zF&P8?8~w$A+~ZaDZHz=&jmuWR%wHOrufF^gm4|(jn)>mpHZly(FmxB4$Opp zQBk?vJShM50_jp~6Ur|he_rs>`PGMc%R6gtzF+?tsc;xQDsj?roV4x08!;*bqe}Os z^DRBZx5MwwGnHE+oGGmw2>Nwb(aq;7BItuf{itlYSXtYlrHO9BOA&3{=MaQ@;mP&x z+P+MbitT*O#-L{OJC%sZ<}J;2<6bE{Jb*ZJ&-UAT2sLCYChOS+3?7mFijeVzldykf{#Jl9H02o!Y<2W<{Z z7P&#Yr$$XC8i&-=xp$T4t+e(6?~%KKlB^AV=fBaYiSk_>^enxoZC#GG|gz`D7NOhP}KjRUxkAk`ar_UCT`F;rKWsZ$|lfM&i_1a&NLruXCLlw^a zyXt`d@ZM_`;`f7VDPbRYucl8ioa{Myr~(ekqZ=Qmu#DGs=gAG7TNiW*Hy~Qu&SbNHGulhWd&&ke5qF)Jt{YbxC@cH@t(_ zQh!57^{Q5XE$D!vVUtS%6U%194{O#VEjv(2+(6UwpB=6wLU;N1!v2Gfhq2egl6Ls$ zhIv+IHLWCsDY7@RIJbW7m?<#SIN36=2jnl<*=BmV0%N~cx%Mw6y`kYw@5IxEOG?>m zBBVSjkHNJRsT{RTc|Y{d+uLG~k4!ZtsC%pa(K3t->5;^sQo)=uTwjR_W*cY7k@T^g zkAy+RQc-pYF6&a2n`LYLT(j4bwq#a-JXIBw_P>#NW82{q69+JMTGo$=tD8EFYF$YW z!TUGKdvX2o*yO|H^9Bbee_IR6HBF-RtrM?Lqdl3>8;snbtZx}FFzSqOwC;hwf*=F{ zfR6*3>=;Ng22G!hUf@Ng?!N2gIb+?N_2Emn#fJEmTMH~Atd7$u*)ivd#s(x?c6SHX zoH8Hct(d_Py`-)H6x||ka@Dw}@`Sr@uQ0C}Ia1zzWL5xtf1d2#thY~%PT592 zKBl#M7AC%asx)mQ^egbk@ABWh4||BSq^a|bT)aZ^&5^yo5;s|bq@4@6WVD>IxM$W@ z$IwN`e(Y`mublW~S*;d|Ihbz`-=*&D+`B=JkX2jkYnDn!Ii`zl;R;LOz6jU!<9^nbvW;bv+!x$LO<#MI>$ZhFFuB8avNjRMCdS0^cv(k$y~foyC65Q;&ye|8;d ziT%d>1%~TB0pTWp#!=6)9%=GYR<&6fq5G|}BC1-ql6`x<>lr*XJQb5cVQPaz={kFP z;8Xz|o2hg`E<2>x@Y+2ge=iuch!e4+43N@i-Qzp3F&Vl1Loe$qMHhXi4K+>N>}K1| zkc{_Tb5Rs4xR@w`(Dc6l`)85M=h;iOR~RRz!I_iuWDbh#H@V@+O#7ok_7H!eGZ7uzz zw4`k3xy(<0!nfX!f5R~WgAynPt>-)*V+9KL?kfUC79x>aIK~gNkAB@RF1Aj8*tkY3 z;QKLPMq!=DKI=+@gSdjNaS`tYfW2qKp3v7e&dcO!zYXx^d1@#JK8JmBd9Hr?0kkDO z7!&gei6h$?!-A-`L`B)Z2EE8pq8lOGiB`D?*Jqa`M`b=mA{%TgvxHs8AiWM-u2Me9 zUVO``UhwqlI~F?nXE!`whVOq@74oDy0%?X0FRGGgW#P>a9fBI8KHes#oy||hC#3&6 zMIY7@wIAEdKUv0@V*NXVYR^nVXV4T2o?rr~ieFfnN$(%-GDW<1b+%Z0VLF0N&s$pC zUbD)%Q9CA=YjipB%@(r0N9-bJ-@UA#Td23aQBHn}_JU8n=--uJyHD5CuNXTY{+v+q z8?ZaVGY;OQ52TjG*t3fzIZk9dC^YHPhxhYR6(1&UNZX0s6l^=4p9jNzcjXr8LP+rL zJXUAG9aigA2hZWM#&ByfbUYF2JO^5-DVe!_3jWKnUGURHC3x5o`Z0YZtX?a4GB`xi z!wp$EpdghUX`4sKLN#RGqDk|v>Klp(#|T!puRL=$~Ki>R%Be)aN)S9q8l@Gs8f!-{Ku%d!cH&I;nj z=AqFBiUhg0&oBO~8Q1gLx>QN$Y*R!b-lU7EBOv=PDCIwFN^zQdCu#o|m{Ka`{{~b3 z-%q@SHU9@}3B4nap`vPqQTA=#*j)XwS3zzVum5@-drrgzT{C^y*7<6u&9M#m{;v@4 z%cSMhsaD;rF^{Qn<*{utT99?Y<;tejZnY^1>!5UT8=RFmK; zUUbfUPQkXme)jVI{=VnNz1z^|+ce~#gQB|gf1AnPwMq~h48?7PI9^7?>QJFO5K7OE z;FK>Ypoxw3iepliZH$D_rYId?@mK*XV2EHL`x4>Rqx& zs^bj!)bp3LA9EY}D@E-AEyEe8d&fzr^Y1I@F$F8CXl0fhd-Xi+vECksrce3RFP&ONiP7MPA6CX0~nL^wWoVVy0n2 zHqgC(k6V}ObSQ~W6@bY+*mSyM7&4G>2out+j=ib-x1=eRYx-~BhPHMQHG6gJ!?jqc zFzjdYu-~z7VHchpO-x9xf@0|QLlip!;Wvj8L?3IQM4~pJm<*Q6h2MxhG^2icb2Mjd zXa53Xe89JLJ~`*Kd(4lgpTg`cE&@pruE;G-v(vJieS!OuQac(Ur9pu_Q~tG&Wg(eC!2%0U+dKk&iiTBbm&y2O9SWd;clIM8(X0o^xXl5 zCe9ppJLrX=k8I=4Q5%~((fTDa*=JE3`>|*Z%3yOBs)i554}tl}OGOapWpW)wf=D2S zW>g6FWCw^b3jlSl(5D`$YF$6bREz6^8wr}+NjE%Ck|}-?$o0TJQ~x8X*0kg>Gz6Vd zCsDh~`I(&(Q4*A{_eGIAtcW6$iB2GW3ikyRe=;%zz`D|`tcCv6nRJj67IAKNADxTXn{xQ)HYiEdsfPOmc*rRxdzp^gu8E;sfvaK43U=ge#y$`BPu8b5 zx0kBpTU|`AB8_r3k%5pzAOtEEr}o>k1^1*;$g_bfKd9;FDALB9oNy62Uj-Yte1%d4 zQt8{ksZMn2maQ1rg4CTKfzLw#8o~7#DCPt?JziX-{-$2Ozlaq1yybC+Rm*QKlJ@Cs zBoEM+^9&<$ndnFNIS5$7l(2KEf;DZTpEB2&4DOQ{ zL)z6=yT4((_mUe~7xAb9>PTN4$V6HE0=APi%bnhC+2)_$Hg=T;-P@Y3OAl+Eq1@Sk z$<{EOA<(G;J9DrPJ2h9-#+6q5WU{ZDwgV;&dyNAyA&G;{E{?y?{s5jCMcP!rWD09v z3}nUP$f_qB4Cy!ql23*-C0Z@oUK0)Y9KANIt%g9(@Q^M(-k3SgKxQEm5^W;Occ!jk z19G2GF~tE-HF#7XJXCuxNZ|{TfD-4z3&^d&C@s}>zjh0gfl_rpy^W43t0Y3Grz8;K zYsz3ylaX;~t6l6CMoa=+?j)5=!i7?!l^*8A@d2SGj68S4E|T8Rht1xlk`zRmvzU4C zH%!^qJCQ&+_`GtlhGjz*_#QId;I~v>e@B9n8vtD_GPFpn^37}eQV6~_W07vBa=ok} z^RkiiqTf%~CT>Scd8*IN^_@$(n|iWreto22k)GH$be1O7g}Ss{b%t+$-^jqz(>E4e(Y)_eoYnGq58K;d`CA}&97`Z#mf*EQO z;Py6`+g>e24rJVZ%o%YWvx!GKkWX!c&|BuA-9Ru)APMuoQ~;De_C}@a>**F+^X{;_JAEP_-$>>g;^Z*d&MYQ zPh&~O#G|Zs?HWP4FUFVWuz48?rsVqP0ufwcYSdgG)j8B#tii2MxvJ$vS$sm4!9+L# z*N-5fBSZbVJHc+s1zlh4!n0euzDpGB=aHJ2{qsi**R^=5PQhI)Z8zweS?ycTD?5 zZ?oJ!PhUk}_aC;UG4cYnvJ(PzLMY9o-l8L_GH99MaDjS5dS9u9>dR*~j`KE22!bu^`AC_S^5We}b&~|> zL8*T>BIx7)GQ0jo$n0VUPFioiGV#&ZLL^-z8EL-GX|a0yA4Fyx>n4QAG&AqI|G7w# zUu|XoMP*f_%!{dtNHoQf_gV-1X5!{e->a8&9Rjj!{vSr6(UDPTNc3?)>xD9wTJ0Nm z38W7jrE<>KClT?_HBk<2s~7MOAintjv?QTlI+y|Y7$AGiflh2d%OIqLV0_>9Bb2hH zbMM}cRCvLHVKx5?=d3b%Q<}IV?fGv=rQ!T0P0HK<05#c<*|hKhj{s+0c4~1QHTn+e zLo;vt>>Nq$34eMO4Ph#ru=FbwGm0gx@$|ZN{&y?Pa>?}?)Bl2K77kGS0`^$5B9s88 z2k>UGWbZ@mY+H$$AH&L@a)jHl5}lXjtk2-#I<)I6uBJxecW7FUK&}6g@qg@G-hbLb zJLI`cW-#o^w1C}u*}QywPTcxc6sH@biS}HFr*4ZExHr7ftMF*>LP#7#ApLCy_pTFz zL;p6GJGVBSEqFoyF6>qU#7qBg8M%K?@xTIGENxUYeW4ZLZ;f> z5n{d#oqg?>{FT=4{SS%q)&^hioa8wdQ+$q6Umw|bL1^`Vay0Ec3j+JakvyS~T|Ar* zRf@U15Dr5L3ih@gLVJf+gT4xn+`Q|`(hhr9bwW+4B^D(w#^%7#oopnJO+pu3qX!;> zmq|DFm8*zCV2?n7oU6SBh3fp!{zm-NZfeFl#FFJ2@gTr!s5 zmz*B}kgWHx%9|W&BNxLGe1#ry93N#qW1jIb13iDUs!BY_47I1qKckRSF}|3#+sA+N zfpWd63=Ns1?YL9(s2ug?^?;)pTwCF_>_o|Z{om874F%cS?f^p{3v@&|Tl8^xASl(| z*4!p*+v?mr4E+{B7oR@}d3{EW>}Jxxe8zIWIqU4!#k_)}Zv3w`_oa$pi%dm-VuLrk z1$w}nNl)d~i(Tq(bocai^B>M{{_;pb?a|iaY36c;`vclzm4?luDC?=??{Mwd4+nooTFg#Ll#{*)G>5E1i}2cee@c zT2QuD7evbpes~^qvq*eInUjJrlt$Evo*BU^Se7j-?PqbgR_d`wfHG!3Q-aybRb6G+ z^CwS(*+P6sDzQaA8Hiv1co?h3m9lp6rDX8hKJ%(WiictHQ8|Ke6_0Xz%G`}N%*|~m z8|t(hWp3UB`a9Ldn-t{%IIjS#edg`=;mym>%2J(qi-U$0=NXL)F7^#Cn>>>>JUdMl zAh)|LS_wRAz^__}#GE}(LwiyFb}A(0AI~x8pxiaPNj$_gY!{^WofAy`M`c5zegtq= zS3y_$%07R4P2XjczOXm<-d8H&4(Z<2wFFA2fBYm^*F|3a(<>*LB3?@qazxHFKN9mG zgycK|D3j~rz+j5ncUxXFkPjUDeU2L53m~A;tc5|x?#GN~s889V@t0;!q;gG$+8vuD z2i$aXO}xNCUk^B-4atctr+lpy4P~GMLE$n*7pX+uhIo*%V9Lk^$gF^FRkp66p)w2O z-@)x<>iBnP82O-Kyw0l$6s2rlZ&E&FS(bAQx4I{iExRxo+7Kr6aWz~BSM#Zz>-MQg zkk9H}Xp|Gv{svQ%&$EBNAw@CV-fDkz+%e?RB9aH(??nAEfRoBwprQSVgQj5@7RN-r zhrFQ-Ln`?I-2U_o7Fc64kb&){xzf%i@Z{j}w>qKV)GoLtA5t#S>kp5(EQz@Y%}v;< z?LPESJX&sU(;n#<^fk&9r%4;CiHQExNBf# zf)2XUxa2YeGwlRiq`-dSWK=Yh#ltZPWdxW~ew=88I>1b}T>k4pAhKD7#~b-goRa_t zx|D#wd>w)#9_bnAl6&-a{*qc|)KzitYAb1u(uP+2XY+xMO!B@!$6^I+dQJ73+=@}X z&OeAu6!^p=jml%za7F)ohg?tMTJ^f=pc}@Wu8e1foHv|SxwV^ekauu)7EZ4Lr6%2+#KRX|v z0Q!euLN|ZYhsjA8NYI*kK@n{e9i#sEY1S^IZ>tCQ?Beg;OsFBS-{`naE4{g9PJPay zr)}7>cy-res**pu?<-fnOW=`6r)9pQ%VCt-PERfZomJizCLINzoGOL1Ivxw@c9N}t zEPCY61g+K~W$-y+as7`v^{tJRaLGVRPGQ%d^TM0Ix-N(`A9X_kn1@6^4YMm1pJY9R zx#fN>rh8~8(XTzTil6$zDCx8I?H2C^`BYJpbRG<6C?{301eY_?zJY4tAUk$I zRtA*n15OEpU0;{v5A31F{lI>j3<^&LD}rh4eoa@eZ%mJASc?m9a=t3mna>dRdX~a3 z6X!*_v2nnR2LmkxhH`z^|BdEMdw_>_%yW8rR@r4b%Bd%YmrV^vQxm)Jm+Nwi`3pMy zs6@+1t_?->S~lwI_LObl4W7x((f;jz2p#MWED2xT2pfs?&-w{(9&v8p>}mxC)CU1s z9j?TFg${U-&U~tZp*5Uv5q8aQ{x7KUaLwrzq}&uzu!9D1=p+i-#@3STQORowZYvOIn;phI9!F{q zz%Hjww%zjeesUOP>v1RZr+HHp{o{6*qGw~<2Rid{Nj63voUcA9q=DNN9!ncr4?=8i zdE`B1YTGDlIw!1D8FipuMwDUfLp0n!t6cj|@IeIbH%y4;yz<$)Ckwat$9rfF;LT4Z zHA&sfK*;0BFA3os;;Gp~J+!lKVg$<%=WIo%y59d}t7Zi{HJVNfBL|PSaOB*1xL;qX zjLc)5oPMFLs=3Xmf!^5R(s*@CT>^%rTHCaG?2l{h`V#uUf=Kk>qa#~Jk0e*;K20Hy z9WiEGmc4un6sRq(ld+ti3}+te?xICYiI_nCfUR>hiN=rlx#x?Qozn2%Ju=0Gl?>{A zGE?cTiLbBvCay67GB=U1;HId33&VM=L5ZKW{ix55P0)UKc^gbW7Nc)QJ=;OVokHk7 zqMI*=6qQ)*k_G94uFGBe|%+o5BChRAl zcn@|;FeAgy3)A>Pse8*|>MQQVE2Q$OFf;LVJHNF43$q1}p^@HQ!FF$f(q3DQqrL@J zH1>|<53-*}%K_5G6g4Wh*3)J%P5^z%gR-5mU-*0KKx2RZ^UR(~^&KY@H2LX1s)C4B z3`eQ%8#%2WSkE7iKWG)wS`@UXW^e8Z%|$-1P1oH0r0A1E5f8jxGDAT}jzf23SeiBi zE#KEQ&N1c=D_BDP93|qI;95&?ts5gqtAy0giokp8+KR~JIEj9@&kX*I=Ssho)0^{@ z?h4v%2pEyt4T6NxAF)m`wzg6U9->`Rqax19F%*{!Y~YchO{OTpl>lDw$Cj}MwcrW& zouAlScEGtG-Kf>(raOZUQ`-ym*AR65Y6{lYu^61>41^!`V5z4dpT5P#FB0Ru?@d?d zxeOKG15Gs1JBxMcdJVmT@N6fgG*n%j-z{9J@m66CE}H5V1Fgt-;-_EsJx*P7W1CjghwDV?LpQclnU!!trlyT);@$myRQO3rCmE_Zf#PPZ6-@ljmjd6jQ{Ph*LW>V+E{2gi>(N7p47e&r-S z!R}eHbZI3nW~OiV5d&plfgALC!WG?NlU~qjhjcH=!C=ju1}FFSBrKgq{T^N-w=4Kl z5U?%+c2(8fb2aU2XQ`#EzbE|tgzmh#8nI7E@O?@5Q^y}If(}l%Fu39iHt(BCD80uL zQK@JQ7_(!eIOMwQRM{7HF{~vtr(tSabmF&11yM#j6-Rae(#hBz;)SGOgzG z^Dy>cQ|Z#8@ZIUCecl6a&hGxC&&JX!V&~ok->Ab!ZC33D4U=Q4D7h@9L_tCH&`C2; zrX5)Ob>PE$eFr|BU}UFDZHjSvM>Kfi!PVcK;N*8tQn!|T1f1$2P8q^=-Gnpj12+9w+s;bVyB4`- zTaS3Zykt276LPvQYI#u2&HuZ?;ZA|+-V}Y8@3=JWGp6>_)wyq|k3vZIM^2+HMLmth zW>K+h1uWE$8p-|)4^7FRS}@`lsfk;*>S!Nm&f#C$zE{H~n2 z{f`YbQat0uRTbey%>|A~{S-v-Mkyg%xSd>;+-MRy-T6Zmj5$*5bksCm&x_Qp{341V z(MqzAh%VM#n8Ex)8{PwY*IzUhm*-H6-tyA%x-lqUTR-RMM&`kY@>13d$AA7gH>b@5 zCXu3UQoBg4a$BFE1+eW{u8UybKxs;UxtYSL!C#@>Fm}T6lJN&Tu-Y1KCo+zn#ROc) zLPwv4n{RGzK+N^OgHr2C&#kC3zxBW4u@{cQIq7BUp4Uf4qpPWiRnIz$QGYW|Y5m)E zH$s2V7JgWAr64i55cgt`5!&QylIOs;TI9LvHgry223}eUjC|A63P5_ zn|GU{ld09u4%@Q2z!=?Ljde)ujYK`_6L2~fLLlVChs^W)5f{se7on*?NbPpw$KYl`Z@xS8wu>7K^c82^l4u8OUavo2-##bUjUNe zd-hL|)j_4OSGN2u_3d-=49(pkR5BFS#mA2>`C+2_5#*>r$ z;#0)xF%Upe;|QSW4*?V@l~c^qsG3i6@|F#{eFZFk`=i_j>cC5P$*Cq?=v*d1LwI+(GfQaa~YyvS#|=BIbLb|&2_ z#}Q{BQ%T|q)zTEf4Stn7tPR(kl*7qIvI((MHKafeveO;|*RT%anBa(y*0dZqLe{ly z-F(nTgqhU;xGm)P1)si48Kj8D(svhOiPql6cTtJ-X!W34gAqD=6T&gJT78ScSe#)x zXO#S*>`BQ#X8wfYt-WW+G;BjeENA`FW2_A>)j5kRvPJnX5qGSbqI91t?CXtiU6EG% z!^D2xM7d+^N+0^q?o(i8diR8W_Jw@OCmgIt^kQ^wrd{rVj|zV%3~oM<|7`NqF|MZB zJ|n^7_sPnkvT$wZ;k**p*UkiwHLjy`P8TWa%d2q8@9zub9kN2whO{BN(PI2}o8Sns z3BM(1b-*#d@KWqobZk5rwt9Xt3c0+fq#%QKP$RwnxaXZ-{rpb;$pjz$gZ(`yF=zHz3!20dmv zZsrq2-OqmzKl|@Ht)+@WU2%O1+82adbAqN*P$?m?R99z3y1q*j3Wv#cEw% z4O41uFN$7%wNAil>0eB~x*tJ%qfhYMnq#ZBhw2{>E*MrHByZt;UMG^U*Hfh){R-RJ z#qSB8g=)cRCxdPO)ss@Rq5cs#J+1b#UAK z?~Rl=a3#%3D?_dL@`#Jx#K$ouKl+Nhvg&@59;U|am#AeQh&U1GW*&8Hw<(VPp!kq< zPeaC$`OtM1S8?Kzr-BCr?phi6ipO5C z!sKl4y0HZ?d@Q-{1emL$eONE7{sYE)a(|}43%eoHsLOw2h>tAjA&bQd*M|Z-@j&6ft9~rv;>VQjpvW>dRFt+ zXIJu1Xn#V2)4alS0fqV?=fV&jq~`J4s1EtU%h1M^ih@Makc)IGAn?fHNKqw{u&t{8ltHOM-9JR z0mJ)$+UA~>lCBxqtcbkJO8$X=gAvK&e%~1KjAHwF(>RL&7>Yz_ zQ~zY4UAjd(JHeITyl~(FTZVNbik5$zN8G`x$3CI2u^q(yIG!JgezuR6?QiGw$-e{D{Ue{~Lbp%w+)u{aR%CjZ zkUcVB05r!7WSg1%h@(@#Waw?~DQ)x|`9*)zQfs5h-0ZC!TS~r;GlGMQeb(K+L!l_H zn;J28VUuIC740D+>j&&WEEBB18%C4e?oa=smqPJg?=IXuC3=(AxqHLU=kM`>?h&6L z@yvC7%ORd(GG?J^B408DlUI%yq^{cb%BLTr(Aoa zz%L4b@)*#c)WwMX@ID~H%$#=Mg7x5~LmvA-K6lAT{X+9O0adW&2&{!Z_pOJDil906 zf-8gc{D<`|sXd>I0Wdqydd#0s^Nz=M#b@OlZ`m=0y(`iC?RdoMk^^6P+vY8{Pd622 zT&j@JZ}|HI6ZdV}c1o{jDeaDQBPP$aZIfCXhP%W*9+KkEv^@tla;qcretQ0NCpstK%M2b1d5B)XwX%EZq4VTl zBDx});>||Bv0~-!tm~D-xnJzALTt&v-4$?-Dxx3~sUv~zPx^3Vcb;W+68J`bT$T^m znpTKt{6XyVbu7-|Su#bu_o>;xpvsKBuvS_^G}Tq{xF}T?3|1(me;B}EoK0E z>&!d3jCHtYuucA2+)H}I^VeX$N`elLmFq-*Z-r-oQW}4lX;5!L)ZmHLw{pH2q>!PK zRS52d@|QRdE}gtS3tm(0)xb?P@Zjt5GHtP#e5 zQiV>AKU}Ms8GQ1E6~!4fZ+5o!go!{8pT!I1yPD2b|A>NX<+?0=STS4U1C=9T*qXwp zQ8_SCs|r5}zk&Vfy8U7((RXG_o^Zuy7-v0!%4RuU|MW6}m0<`lsaceBY{@o_gFPaR znz8sTJAGPNyn=Xd|AvXqdVOv8Wu*4w@dqP2P+p9dp3_H+Z-U+z;K z;s)&~X77-hXM|CP?qm5AxCI_quZajjnTlh5g(6VbE|v%!oMdKljsyvv=+C}EH^}I! zXbLM-K4E|2jqjtx@3*Ozkh@F`(Ant?asf!_ittjHUC=1XIKaL!v5*962l!PIu^8bS zxt^GO4mvlL`{b;@_*h!O8MKG}~G1ZL-@>9>4YPy;9_U{;| zvMLwj_Yj@mlQ*kZkeLvoHg1Jm8t9lkckj$kDpDbC@0x^=_srH1pxY^36}TE7?c-&r)pPC4a z&83kf@HuhQ6>*Pi3->`ttD#EfG*w1;PN+(Fwz8ReUDh%6MEd%|ZWMzSB2sHaE|%bp z8GiMt6?mMz828PWlyiY5krTshy=_CP7j+5T$Zf$&U@p;HaUxc*q(;YW#7W2?-49(;IU=(|{`Vwkf{4Tf}|M`#=2J%HaCD`#ozq^pI)zf${c(h{;`>E?apInWftjsVN>NDOWU#a(72U=DdA6 zM=Hb3KgCCS*B@TBm{a+&e{0ao0gv|W+@RYFw{wbKqaG2KrhY|LTdyFc)^AUKWc1~^ zyA{+)3h%tN6Y!2nGwmlGdI;`$>>1&$Nt4zhYevLD!JB4!ShtaV*2@akeI~hC*%J?x zHkc`6{{5^FH}6!}#z%r*kTYg+Fh952GER+~bPw&=O@H5PNg03jbmTYQ!}y6fsf@Fi zLdj)i72#oyvSUI5K;sFQEw5Uy4A-h znHQt>hNQnF>^XzIiwSP{Ea`v;zCP2UJx|E)g~z*4B;)fS|M=Br8E|^Dmx|lzvoNJv zIsn{vKUH7A119;GqhLa+q53{RO*RLEq@L^emZV8?_bcn|AP5kjoH!x8)VAPM_OTq@ zs5o>WeqItWaH*Y78zXx#hcquWy6%&=Xet8=Vf+UQRx^LdQ-4FQugcC1e8@hmJ{ZZ8 z)jNcH(P5kKs#Nl2usKX5F!hc=z{ELjuZ>;$M}+Axs2;Ip`Ry5GBwIsR>4RyVkc2uq zFg$2-{ZP5k0G~Lf;?$YGR;2YKKsXy zVFNMOS5?exsDMm-hb}r5@#I)&5etpokUm)_0Ke}tF^ARLXvz1m3L!Z4jN#PG@Kwhs zF0z1X)v}|+5_m|ZzzKVb$@AS z#?O`a6bt_g-*tw`T-Wcf!l!@jzupQDz2wX^N&tw$TLkbeEu) zisR1L4Mw;&(}|hTF3O0D>`W{mo%r6Q|FZ^}8|DsfxCG#d5saG8Y<-?<|GNGI(uHZI zhz5TM&J;UC75ES|DWdT>>du>Y=lUA#pPX{1*oC$5NmA?@zqEggZp8=kQkPDx{hBse z6R6AE?I@0bo$K8zh>-f2`FZ3e*lH)ZsnS@b0spbS?y2!!U!>*GDlj;Wg%r!1B5=oq z8bV#8qLfebLu9C$IZcmp$n9mR>XkJ5jZ|gbEU0}dCg)rE4dhms#W2~!S752Iouxh` zQevE$`_7j2lM^eVLN${hZyT*Fm01iF4?s7^4F2pyLnQ@jS#~TNp7X&1deiPf;-eD) zgzGk?eO1<$=U|zx=cscTnQE^NC?m(|gVYV4_pWVM5(D|a+w_eem1TJQ4}cpD@<^mQVlo7 z?)1;$<6k~da0PKMlR-9zz2ubchX=3LXQUIHd$^xwpK9@M9uE9(tP=}`>AsQ#+G=h} z6}aBM#-^dC(we~c-8ReS>|L5)hX;CLXEy)#Eyh?s^If@-0gLz=ZI9hK4`q2~@A#2h zel@8?h7F2WA*=#!q_B|~*8@l9kTR@0eErXbZq|qguWzjcL0}yks0#cgQHk9ianRag zrBcy>yvdma?mkHYD_Ms@!@;bDUhlKDi`jDtuv33VQ~*kiV}!Ab&X{k8itZ4}8R$1^shx#q|pD0`rVd z>gkaJHO-Yf`E{Wi*)T*^`7CfhU#B>4m4HAex+^6glS|Qm&e^U=aEF*-EuBS_)K!`i z^{|3WT-nJI?gMwP?e0+R(#0eX3$gD~O;W z5y1B(U(rnq4`;c)!H=7I$Ix#hP+)Jep~1mIw8mZ@9w#CK?6bHBU6bojGHB$1B6HX| zs35$Ofu;8l==wMb#0LTmwwQrqJ}(XC3a@4_frRPzgwo$ibKPanT#}^xzF0 z0ZCz*3@g2((A~N;SiSnhLtp-;TK%RsugGTk9{j2Arqx1&*j92-xAF2XQKovO0oLwF&q4)UaaKSC! zzdF%c^kI=h+Iq7#xtqSveIA4e?ihJ>J>?Utnp<|YJF6roIvzf5-VKy`9?nE937~Wi z1X_KUuJ6la-qq2Empeqh`8CZTmo^0B5B3Wmae0*3_9X@i)6|UR+I_R|GvB6H?e7qL zzd#E1yxI39W;EF@ZJQuMZ#&?z zhj>A_==@^HpVvT9H7)vYP1tGUy_&t-3OHmkC*bcr$Z)+ChHq zyNC86>z;9|9ghT6=fh~6mq;b4w3ZglK;rG8t6i#(5lgM_cF8oVO2S$Pa=}-%^}a7g z9e3>J{qRa`CLXu_$y^l8vGrhNTCKt7xj!EYRJut_XH>t|(K4&uJlZn7UNNG;2QL%! zuRk`O)@ZsVgsxi+NYac_B@_z(Gr${7s64i`)7&&!L)#ywwG5X%3ASB;zuQ;JY6|nd ztC=HVTfBq`jTE4=5@MYD<&>ix z;bZHst+!-lEk@$eH)WR!y@63d6d?J_T**<%U(Fa?WvD&4Kc!SJA#B*cB~wQ|x1w4S zX8jHs+O{!WEA`8B^Tpo2G(Y9BCyNqXg07`K5#z6SyFr`7V+^k^B$#{29-v?C74vM$ zoZESQO;qib<{Z`TS=*zpnb@lwH>B{`!5re|hNU{(q_qoeW|L6B)ip-f#@rNIQzydg zynxPZ$mnu~Aj+?>E|t7pn66QI%FHYKhbhy&8WL#9o@>5B&JR=iQ@tS%e?c_166{g{ z9xxMs51no>9$6ONG8XZ(+?X$)kff*e!{?snVrl9vgmM;tBf^r^Is||DHi$Fdm+jbg z;_;{F-s}I=Y+^X{e@MIYa46qDaP(uBZ7QyJM>Tw~aNhq4G-b@f4lB2@vIVUx6F<01p`~s6m9WqLj zGmI=nxlO!>KJ11>6;XN8pyhiN1qeU(s~?r|^q7tW`zc=H>+Pkx?*{+uL<;5F3sX%^ zF4z94%N(RrVto8kpq-t-?+C4QX`NLEd7Q{ggp+2h_uibHgk?YT2HY z87UZe=O&{G=ZO`TTI`yaKEjTQSStQFX=8+B7Vh_N{l2==ItI&iq2v{!k!-c&p270A z*VQID7{gReN6xZ&qilwC8}EO_U1dFjrVVA3?~f`ETN?L%wwOiHa~$iAIp{^S7+Lo| zc0CSl&P#TORA%);RZ_4UKcf!nB)EGmOeXC%0l$gVyRj!VbjuS^$U>0}i0O2ZJZk@r zcE;E4?r^*n5127BQRtRJ&fxs?$`t_+jG$nhAfw`<7wZz$X|C8SMl6OX+MMf*3Y|(2 z{DNY_<(6Ml{l+$8sb#{&NY74WRafQxd>&|MZqGJH{q17dO5$UTY7EL04GYlLxiS}q zcV*-wy_KS!>+aY+J0YC>6W;SWT#Hs^W^<5|15-#mS!nk)DEQN?uU*-N{K2o-J~!38 z!vo#Kd0aK+*=RGK&w7Sw8Mjc$d5PCSE+kk|jqtTx2doI|1feGgprpwA6DlcqP z@oe#fC=hKpl>IX#O!h<1#Hr_-rQs`Gj_1bTJ#@G;ynv!SW}Mx~i}0BYDK8Sqw=_;R+)kp zuQt=^ob-z@^sBc$GKcaTZOG|N@^~)$Dhgx&BQ!#>mm?(J!aY{0+JY(PC_|cnKk;W< z2wKlDD*WjnPXtzVb!voIUa#ZV9wwL_5wP;C!nisecxLkJQ=C5f4B?(l4zXtvJZRL< zZ8jk7$XO?SJ)g`^`!eQit((`wHwK zwqFN_7SSGER%)>H=10f*u2Y>87AsN4x9w@xYGtW%)+jZ`q1dS&yrOxAqc~$2Q~guo zViPrMrF9xD1r!TUh3gMm%rL_B)5rbbysY`l$c@3>MEoI)*lSgqebT3|gm`+tKT8d} zLa2xbJ|4N(d9PmnaWk#S?~m52-nd)Nekmg1tn5v*!)Wzgc1B!%>_c~J&K2zKJ*K)7 z8>l{|u|>kvBAR;4W<>rB@!NJgrrhUtoL*OY9agj}T|@4y&WnTH@2HJNHT4gSRs7a4 z>f~O*A$nViYOzi$Q7Hv^Y=Sm?%{slV!p>gQslzAM-y%;@=l(hA@?PJ`dS&pJ$wl>t z66YX}#+gg6Rw!@VF_~#F8uM-GnO{-YBc7&(vZ~L*Cqv^yOxsIqIU@MDomCjQwBC4p zSogKd-S4#wvC+1!k!a+N+Z$^^}gklVx&1v|misspLY0PQtr{q!;2M{*T;caKlU)KA-Ui~ z>T}(8Qz4-*f{pK4IJQ_s7+8&4W%9qRN)({*@Sn+ln0suPsHvn7~I)^F^wh!~u10 zs(rEHhPnOc$X|@O%O1z*nvCDRs|}*fCrw_QFC?e1xV|d+ebIL&Yp-qcxz&17XL-qe1P`|^2VBmN{#4LVE^@%8!4mcg`xeX!|CxIQc;LqUH_kt7+w5$yxc`z5;aNE@iB?nhe z6M}b6A3EKv(X*~ow!f9?Nh0JjI(su+qefemz@-ntpX(?eE|CAQJwF{ALM6>Wp>u^d zsC2V{?GWWsBK5sTZI~~$g#lIPui`=yn|>0Phd-M4k?eyUYvdroGmnli zQug`T{L)72&zY3oGRBx+&@HQ(iEY}IBb zBa)dUvgP*93{K8zCLoyQ{O{!bKVvWcUKtM|%_M8%6zO@v>{r zf=#Jmo+x>^TN0FvM-J{H(d|Md7wl1YJ$meww==viwUrCQy*IUY5t=Xq$w2t+*I9eQ zJ=Urgbw6PAM}5ltM9$*G%EOHo&cdlGd}MT`Zo8DM%ID2itQuX8)b4fE12fw_;`ac; z*)bZKc*1*h3iLJ=)#f#u9ExhiF77xLEP>xgsdW{JWoy2Sz+F<#+Q;x`v->ZC6QwS0 z&9`TrAYMqCZLkAQr|H0ul&kdKUkV{-WO1y4KIfg!vl80jT!xY2DTx4@U%k|b--M!O zLQWbZG<@avZ-$9D50$8eT8`hyYOK$nW-T$3!%6dlw?g+^f-nt^Oew|%B9qLod(Pcp zG4WDP2X*3UU>jNG&j7L7gYMHSyu`~{g1PvK@T(K| z{%v9Q{NsgKiLx+by57We0hGuSE*7dbKZ;hvo!^r8lil9UVzx%5TTJgf-wSYgPxDkW zHV0JW;e4!SW8q+vLMKAYv~m{DI-*A@fMq}Bs}`HkZ+&;53GWha8i3AgC?Nj<0**M%#av`=H8 zSIOTS4hZva*%IZ1#irj!51Tsm<>V-cLVq{HVMJaSzrK#F>E-D63-(@+S|)KTp_F38 zZ8m!P?v6hDu$~|OxRa@hGo%O|FhN5?XWo56D+L69esQswA+qWG;z#Xzl27-u;Vcda zR(`*Q3MG{-zsLfKp3G_{OpgpZn-TnH6N;h}<2*M6`{gUgP{MYnR-8Ve`m(626{f9E zllW;P?F_D@hl~_nJeDvWovMTte3O*N4!1le+JGoN+^gwi#<6ZB-K_faDSET&VfzI*^&~5dcEkd zdKEkm)wus;xhBpmm&f4qb%^$`I`u$0Q2k@fsb+o|hLAI-%OZ%A?WWbPybebMFx=A3 zJMVHp_8If^->j@rV9!bpB=vD6(Hz_aquz@q6zCDzqWtm+tzy!tnrsk2HJTVS%8B?&l(Ka&1}twh`^uxHjas=fd@c-0 zcl97!*kv!h^r}vFkU$5(uT331cxe{z+58|Cyc099?mMC;4*XqRguBq*^UEaG+y%O^&hu9Q?!)t@4aTJvEt zGdoA@W;42P+ov-Jk`^ho)NiUYftyGZ7g(JuW-x;;ytw6|@X7V2ZG-9Lkh`r3H>HcH zst*ZXMHmFJry1p=he%)76nA!RFwhBa82ia9qGEFGwWg?7>{#oKVsXmK%r5V$R4*SD z{+q59jCb8IShOxDZJOLdA((JY{1-#D}^uSbQ2s2s6F{sFP~F^#jn081v%6{`fo3t|{&?oauhXmTc$;+~H z@8LrTo8+=QjtmNkKYCYDxTD)n-%GDMU$%pTcv4QR`4VVyyix57`X7IYwA1Nyu{3^o zLpO;={VZoked=YB4aG2P89E^;FMsS#JCBtah{BQH2{b4RB?lp7?2-mapx5JR8_L;K zBUY}^2JS}v(1e)}GSE%(^P!yCU{(Q=?%oKWaKyk8~ ze>eCLWUX3%i&UluAN6Q7?(CLE-}^eDO5YSzmrq^kk0gA57xJP*ZI86sXw?qa|9VopTrJU4bvpzYk0K&w?|l{e7e?b>Caq$d z4(63@G@oLbUia^2#pm@n>(RVkp5UWqvMf9tZy~FeQuUYPOTB8G#L)-0?>wHgx`9aP z_k;?73pL1XjI3%W8db+}5Gq1*_wrWMiG;M1RpY?T4*XCYroXaY+>5w!{4L!J?O*kJ zdkmJti@uv8WX#27FS|&=U9BwigtoSga}ps?5xK;&y9qH6=o-T6EyqHJ9Y%&{;GN6a~FA}Ty z8NwgguaOtAc@rqXL{^dcwFOQ6o&mUVcR40?itd^}%1`z)&LhWeiALVvXztg1>-*ev zlqO1@LgQR`Vf7|zSi&uuZ231@+{0P8i}t|nD6YL_yKYgkwqPxf)laj&irRJj01dj0 z=Nefb*R&)l{=;2>SqVXh{~o)Ba>&UC*GtU*{IrSq*=_a zQ)RqYg;=K4rn2v)lLMp;)%9+P?QIErUb-YHkmzCVfb{xdId{6(iNp}_Fp_2k&u+I> zXVO6Xc5tc-PgFf)!G|)sx6c?bve94s!1692x~2iyx)$d`qcX#d^WNSmGTJ3vGU$2J zdy4bIU?IVZF!ql7^Y@_DRf$c>8oT5gBm7>yD@!lxuL1vGQ+bpdA;`<{*aIaW#+=pk zQxw&m=H!J%IdVP{GR#(G&r@a4^aW0rV%^`a;j01{te@}2Oq!J}B+8(boOM=j>`fj} zA}^$FXWGLdMe}DjD9z-!!cVr2WfOfnm`*6qe*yahgXRTg2oBRUH_R=S_!!s~PIX4U&J&xvL-QTo-84orKO24IdAi2C5eI<7syG2|QxI7j*ZWx`ix|z%g$i$OnP1#x z5300WQGf6vAQhzzc`J)wJOAm9Yccp~oxx<4pFk``I@;ZDy`v}We1%2chX?giGw{T~ zkuWXS!`FhEI@0~aUdB@)q?=>f7~hqMl?;aPf=>s`<>a|?*bkQO3B%E)(rD?+PsiXt zTxICrjpHtYZ9gSaW1^tA44Tyd-0^UDjUP2w@f&+q_i8H>U6UwsaWxv2jwAJRUbm>L zbqjwRIB4~ve7@!QCX098yjWIMMWRs%ZEmJ@k#JsSmRBG@YBYY)e^c)~&0LhaYgL>y z$Yx;_CjB{9VfBPvr@-{r#jL)7LpM=H9LxrSLAx*VU{ZVUu*wIgz7dl8tI{PDJFN`5 z$jnx2!n&o`CxB*i4ELd0dni2(;$~!wC{oW+wNu^$wsg&px1n8g>ZfW(4skR{FX&Y0Jq2=hScmAirbD)W=~PGi-H2; zI-ock!Gh2dW27DI4-M-B;KDp^E(3LKwXq}{s@@5lLf0sZrVd8c%7LjLjvEQ4q(n{knK;`u*x-4=#UwO@=5R@?eK{TFHQ*w7FbatrT`+s;9EQuu-S`c962Sbe&=^$9hHGlWRbhIG}LGY)G))c|P5$&?8Avv#U-!?Ryf8`ope$^Fk$vO>pBOiZ49XM`P1m;;Tua$-_oUg!`g9Ea=Q)Xp?`Yg zug}Qo!&Xev7QTbcfUbTrJz9_l-vKU!$$9bLw&qJ+IN{s@h0 zf0qs_zTJ?jndPYj7axIBKOf7ZzVOjah6J(Z7$l+u<>JxmTa8KcD8J-o%zYZ?x3VuH zjV3pR1(&EJ>Z|gXDuP(iaO$ZjgA}w`UO0}pB)1ArKA3!S@)hedZgGVUxA3MEbq~=* zU0Vtd`-$mHh?gscDEs_dhxc12V=Z$zUew+PyR9+%cu0@2$)7q>R^k4@EUz#!;=`Lg zY{Xr0G-8~uU8P_9AS^y67rr^FKO+>R+95N)ah5J>p;E3b{PgvM>$o+viRS1pF#!f2 zDkoFaxLGLWguT<1&qVx56`3nMq0tdnwu#5kIFaODNvh)>{(LiJu0|btwT#-K(<$1M ztqJ!_4rY`WzGm|3Av2!K;Amwt#QS@_ zcNr+;(nt&xyq7=vfIq7GH^%*vlFVhkmRCE_BkGrh<5^ZjcsKe(%M^taiRST_*B)EY zUzEFH?g#6rLlzw?yUp2n<=6--rnEJZW>c#$l7Mxc-XZbu46b>&k;NZ+aOpGlq#AmK zrD+f6zvgy+^8wRT3Rd1cUpl!999^My;d}2#K{`}N3BCKK(Ja(Ycg-*%jN`ikk_NO# z_)#Y=%~gHXx)&6oX0P+Phz6@F0F;t7Bw4L>lFhCwKSqBJT=~^w^d&Hh``vi3&v}vT z_ta>uz!k4Ip`_r}b8Yw`E@m*+nmM2c>)m#CxOF3u-uJffiB*>K~$ zg)C0-hF|y)*t_W;kUWN(ytIMxbC|-oGP2r=8VM}@)!=)#N`vp6oQ70XxcUHqUKeJ+ln|u!X&Hgb$SnT{9xUe(on+F;V@b z#r|CFQ{~AM|GIGhC}yKFiqy}!pTw}UYo}8FUoP4Y$*2AKHvdbbxdi_I#ni6-3&8!C zXcOtnQgW_~&Aa(i{*O>r0OsBP>gzvV!+({EfBq6*MbmZICprH4l6H>VPgT`>nYi3- zzeh+KsX^_Xy=DJ*@kiNrg{;JoHGSj+c^(0*1B4#3^}o~_l2nd-nJAK{b|B<^WLdI; z&VRKvzr$sJg|@yaqZ@yaT6RV@T_#%I{-03D|8opTZG3ytNaQ&+<`tLAHOGt2r~GUQ zx>J0>4fT(;CS&(mtTEW8%6aL5P4Nu63e!#=Y6I^@ z)|CzrsM~WIQy6QCDxAJg5WE{h$Ok!S0azoAc#5rjP`q=;&+#5xIB>;vkKW!QkGZ<+ z#!Ly#(AN^o-d!&9mfE;<1PY=G@wb6fh*%cP9-duB?uLsR&3KNxX=TB~Q|d+2cl)4}wO<3}A0CwH&yeF@swt9I?_8T!4`~<3-VgH1OHwNY2yXK1&K2RY!o3dFh~I|Ut3|CfOn}#!=m^5 z7fcE$g~Kl1bWc3{=#?HncLw+Wh0PfKvkTB?c>{*3O89={&OIQf6wVzAH4BC zWexuV!mh464FZzuu_X%Vdij)0G`(3b?$( zhK|J4yiCU1bjyke_9%ga+-nG>Hb7~~ z)jse93ZaFrFzvVPL0V@S_mbNNU;#iOt2TgMWNA(n+9R@7!z;@90251-lfSF+$yAT) zukY>bd{fEudrkZ}8Bcn0?f723lM|hK2xB*`+O!s)}klq0~mSQrT zrm$Fm=xNv=JJ3-ebo(wJpiq!fBS9}Ou;2xrLUT(otjT2VZ0(O*!iqLY!H{B-*TCv#Wuk*;$C?2?uO;n##3o+Jk+vD%Rs=phAhlb!OtwwYrwhCPQ z2Je5g2m0h!au^(Njekn92hbWdhK=UfAo%)Zy_foZV8f|~scBLqrHQBDNP9@8%g~>P z$}YZr+X!Oz`A+Ozwdm_pBQmV9^hsJxysHy#75dYo+wZBB?qH8wP|ZO?M10)xyOV`EC2o6`~c}6hD=su+p>=#q)XLsn%+*oog1$(q#JyydHZbhd#X_R z1+9QzHMRz_-xu!f;=|zD`0@OqAWY5O@Ox(NF^~d;?dyE4r1dkT@B_k{XIW`aLh;f` zWhf-IJNG*u@^tn0>#HvhtP@!g=SStztJ369RreW41-5w`M93(`qn}`hfYY%|9gZv4 zsQFVXPc(jtiXc8%uhJVTq;HUPzy0ivHar@OJ)A;4MghuN|`tm*~}2{tJtlTf%L0vVh1N zbi|bpoF>;*hGPZQ0QSfubUOYMxwjcyy$SSZL8eGR1m$D`(rF$9O)deT0JBbk^TnWw zRu(|7=vodVAEp5B$xVP)ih~ZCpx&P76Lt-El6fbP)n_wxOeox`xAiM)(Ye0TJH!ZF zkq%k&Wm;ge@jLrA!1V|!C3Yo!+HUzXNi&q*PpdJ-*O=ZS68+*u@hES(cluj#c0D z{!^RM{c_irQ$fe_|1)%fPVtkJ4!!8AXMxvBCZ)1T&-4$w(1&+>LRTik3Stp_ZBaEj3K%-F4cN?V*JwXQOi8 z9(yW$>wos({}VlpqvZR(AA$KOTF!x}yco3ULct^MYxQXgv$5KBm6CaP{<0y>*^nsU z|D}L=ih%qxt1J_!6x$09BEAb*tRLa?cb&e#3dM=BqUZGdjQ{+JOnb%mlEx}0CEWyx zijY|1f4)KqI5KP>e1c$P*UEvTXFtvi^vi6m>RRcSX+idG<_UC~nSMldG z{<=>Q^^$aM5-{Y43udDQ51h@!bkWp2G57?!@ z@koii|8ij3qc-EJ@5C#GGd7v4E6W_(pa=2GR{f3nG|#{uJ+#llwBi~?q11-R|B=UR zV|_eY8&h=GiG4xJtysy*JZc^5&Xcv|48&V}x_?(yB2~ZtIBkc*P}2@4oHq~6U+_(D z3E3&3E){edC$2JqUoa1;;VQ|FarHgNy<$C@x~O{v4t6zv6=93Q%QH@|2l>Gn%0l^C zDe_CI?Dhkb!hZ`s5xmY8#o%2y`FWX}1wYW+U}lUK3~yjQvA zXt0$);IfR`j~7{?DxYp-2qb*>gJr?L&KutJzh@n>iG-hgQfUaWrhW=|XeQKk?>tJ! z5dW?t5`X-wS*(D~owOg;T`=hM7-^p9{24lFll4 zel0|~kyKm09Hk`ah@Yu$++(@bG7P#UsZAP(8Uhyc2u>QS_Z zq^y8sd*lsfN^^jg^dB+oQ*pka#Mi^)&B4jX$bxg^k_$(o^%iX&1#=k1j#7?7W=#1L zcImPa9ID)wLHkCS3l#xAb#ss|qMiYJE9wYPsl6{G?PtTB7y|or*uP-dWF?o4{jaah ztyu}pUNMNqb5iuYE5oPv4Hft((&rA@*X>`THDvvqzABUyeyE;ur%qWS4Whi75+Dca zua7=6h-()5aUEN?f7~}uf>4$2R?Jf2T5=Z(HD&TDajur+6ZN3k@@-$a4*Ru3S*G`&u zpij+p*@Wc0VHW|^N99v445N8TN)8&|E(zW0(3i~i@s?-m-J!F747abuk=pl4>z)&q zmo$BE^R;A8@2g3gm32XTl7%)jeJl2;>#5($!Xr+WMn?~oIw~S}o0X36fo!ZN zJEF*qej?b_xk^sSv6FnW5RrJw%AWk}dg>~F&vu8+^I zjG^~B@AET`=g%O#K_7hXp&v0 z?>Ehlm$B=r-3T`9|Bjt%THd*X2v40Ld#Co~3@Ew2irzg8IpM>u?R7fn%&GluS4BY6ogSOsY%n`A!Ik#pj-k8dCQ7%LI9B(ZOkZLlbq z|7(+xeRCFOCGw2(2|=lCn3#75sQwMeZ5c(Qjx&`2;bzwE$b&`RjYh6H4G}j#Bier4)J1$+-S|2b~ z_oR$aqBNXlcbfN+vOc{pkIsoFJHPNq`KTdpK!$MU?O+FNEca_#%STRqRewj5`hG<%1KwH%*j@;5 z@;4EStp(tklPYit6%EFf^i2J?f$8Sz%E|33 zlQUQuG@Nz(ta`V8Mvj^5IPPLZqlwc>-sTbFxAVB;ff>lC_tfu$UHlrN4 zjSNXb-4e`H;k07}y~25gdG}9_pr1JkyWW)9E-0Y{zoPmlbTYLPwBd*uJiQ&9-FThK z)8lmOgs=g!pt6v@UugYz3v4GqKlTth4g)SxOme7(6qB;a^vbt34Z~^A zLp7eH1vg%r$M@|;i)^9|hDAjP=buh0ePC(KVi`{k3D#5HDdCIe{Ih^vIa23Vy|P*t zH&63ii5zj!nc|;3^oLt)xP%tbSj6e>Rl~0jbgac0ZYr@bu1ii4uP4fYF`A7w-$bZ^ z>L|E+X2~I@1MeQ00RE3RwQpQ2`}NZ|S(2rGW9%qUBEQ%3c*N{+x)^oGU4k~GEjvdo&-)qy?V2VQMy1{nWy?9vY_C5Aum`kC@zP(U2{FN6m;2*9lJAOb(oUKYP4?LFZT80#gX; z@_T#WIYUGe`Z}D`shr6K>$eF|H#M25mH4Ogmezg-WF&>8o3rMN-A}f7n7SW#?103} zD!7Q!yiWC-q~Xh=xIidwqVUh1!+bR1aO57CE$ak2&vqzTLeZ10YCQGNoO%6-+2X9$ zt0t%bAD!e4+M?%q2S$!9eDxy7rM0h!NOiSixNPF@?1WnAUjMTIghh(yM!BlRf;YUt z)e@8^DOpG7j*%IAQBcRGiAde1&fB@Pp4ZS_KCW(NtJREG4h} zJ{0J7>Ig#Sp<+1Fze*zh&&Mq(ZMaPBAJrZ~vfXNTh)TBmqlYUZ+Y=5V7nh*~NSEDx z&lMX*;CY03X$yx9e8KRyVbj*}1s0PV*HEG9s=LX#=N%)6Vy^KTZPuF`&$tom=smq~ zCJL9(wIRkpyM4HSyY3I)yi5`)@dvF zVB%Er-z&;Mw0uLgG6BnoYK2a3B5Pp24f{eyE25|rt(DpruK=h1-!Kqz6i9w_{SZ@l z9A6MyeHDKbI70&oQKuAn85@l{F~OF7gvJ-i4I&xN2R-l62!FSbaX2aVJS?I;@O@L{ zqp}Z^YCZRs{R_3j*G3Q71g-KoqQ zGJy2QRR}I9Y69g;6|;4cD-Rl47;fvl8pH_vcfJXjaNe&^HSYUg5IIFS7YE(BHwZd)^sQUPwJNN zyx<4c{B0jtA?;uWJJQASI_U`}+&Rr(4W@nWB(Dtr{3Q24j{Ed>g*BUyt#}g?ng?AZ z*i89&q)|e;`koGF5mfUDo%ym(=}8Q0hJRx1$Hk$cp^6-lCzhvS{2Fg38x=1Xu>9KT zROmG$oGqpF`&zY;WwE3TC|`$?+G~<;f0=v~L_0f!V5F;*AzLI&iRnb5)6p?t_yY{W zs` zamwPCA0+!ey=(vAAIJ&{>u56f6F3kTxu?tWxm{AhOvx)g7P{F&slD`W!|E~2G)QW5t*tiU%3WF zX*<;+H99!5)2m(|qV*J!SGfjO?cVRNQ3RvyMfadZ8jKx)7^tp`z4X8=EqjMX~kRJ{?LcMcV1aFtuI$z1f|x5;Vx!`vA9JF7p{4Tju=74;TBZrJWQ z8u~>qMDpZ*$-LD7R1Du=GvO*ST~>e2p;St1bI*v3&0w)#IF;Fa+F%3KmS=G z@B%HDW?-Zb!tXC%cR=wnAlYP_mQU`^Dd$J%m8`WXsbsNi3rT|UNla@rJIjsuh3eFd zlhs~(eXIGM({;RbO$_ure0+RIxn)SRtESyl`&;`;67JFY$*p*E`KNSod|BhWn5ZsFtWeTAV+;>fx&jgu0% zG(US^U6PWZvMP)UzIe!NeWmQu=GS>qOFP&=@s#wy_5%FaKJC!y zz*`lo`c+5`6sHu<(4&y*(y!kfqR{hw<;eo8?A_!>^Pd1zJdb|EKu36L^k)vlQL z4;Av$%6GoF^C!~b`zQ7a;weohpW?j-$RJ!g2u6O4>>2bfXk%VqUN0h|{2rb7b_Krc zAh^me-zX-6KEc}QyGXrOa!z<4=$QB&-J`=hv^3Jjsf(dUxCbSgXXLu0OS%3=%Rt__ zvq9nxwkIlrjNZl&ZJUeUdvJlmm1csbtCj$0o6nG9|K*$I_@5d762zNT2mpA{Zf*mx zc`)?y80x4)7HjU;!ZfGlA@@v<6=}7#eMsrbpQSVX{gaUdPL=W*KGcQPn8QcP9^LSJ zUwvzbUf}Dc#lxR7gdJE1uR1p{JG-*qzwj%%4h_5L=^icYlFR?p6K4E-e35@3_il0m zRA-y@>@zg$MaUY@7!T4M3TeV}=1?6n? z&yDF69O?5|et?oSPTpjB85$G5>MFP6s<&&}aqXScGJ$v=WZ$@M*lHMS(9F~OGtTj{ z)j_@wUnOS%?+03|U&+0Blh}}{Ubhy81E=Nh)XzkTr30}w)q(v2xqp@@pr8*hVG}G| zlGW-R#6?CZGd79lq@oW$`K~mB6?@G(k^BqWC#CtCqh}lG^WdfUMCJrzQ_Q6&2ifj% zYMd-!n^fr^dXV$1lsV@q-94S;HOV(-Q45Uv_>YsWg6;S3$a()W&mt<-#uU`VM5Hm-`<-_x@Xe%)AQhP57U97OK?@8_c8Q|+E%AlHtMf+^mQ-wjTKrZ zII{eS%yk}I>Q|Qdu7-a^BAU(06z|8%4C%UWQ=Alcp!6Z4uwq#{nqcr!fbJ*2|AP}5 z|62CU(}@W&z+**3%;n0AUak@+dd%7+2diZsLpO&=(x6f7n=QcT9y0jy(Ckjj?~+1O zmTZE@`+r_kaiU&e>c)SMH*=!r;A&t+#Bty5?Tl06Pg9}0UZG+#KhNA)-8YTCp=4T7 zP0fO#OJ5L5i1j1eR^>$-(N4C=5Q0#hu9xokhL?K*o6v&o(U-C}S%1Mm@kmib=}VS} zn7TjI5RaFc2Xv*VL1OG32A7r2RC#HsJ|oGkXfpxm@vQEm;lpzwemEZHH}{aErgb#r zp1UN#q6C-82V^y0UewuLZx>NMv(ffVz4V3kvIS3(NB-2d^iBIVVmBP$hIh|>{B@I1 zC`LWh&$ryB$$5=BMuY>y9)#nf@+*PMUtpms_X;HcUA&|C7m0h5vUkC*#9QQE;wh2d z>pk=cpX(-Cm;NO~yF_9{p^rpd>wpwGux-@zoo7GQw*rmBZ4I=a0zzJVh;EVL)7ppGmSiEyM##Xg7iM<%VZ4ndr z!ADV-PA8=C)A?1&w-OGy$M0y(=?L|&U=^D0@{UQjxO||mYYP$yIIEq_^Y**a@1n5~ zWeZrMUHl~QIR!@Du@g%*;We5Yy_@{~x@TFWGeQ%oo^NG`FS2&PY>kZQlAXCza(X9^bJkpp4>f0LcfWpS0p;m1j3dVXutD9*MmMaBv zSv;+qpo*st0QU}p$sV}009I0U{Tu+Xh9Yifo6zJ5djm!^FYWScF&;-py^Wr` zAGYNx7I7eU7SHKH-EPx}n~mI6kj#|lDp3wwB^*TKzBwN)V19gf0dxJDPhP5;HQ(_+ zq8_oq4_{QZkA5sn*RT3~2kTY}>dV~z=3)6X5P!6k=3d$4NdYg~lJnocYELnA!5 zDsI}v#oEavn@G$peP5MlQc98;?&i32>ZaI-yzzeW^E25^seh}t2Sbnf<{RCu5Lx<^=9D7S{Ay}-{9)!1ip)}tU~Z(H?C>UOMmon&p8ylGLTd$bpy(! zR^x~150_~0Z0R({vwR}z18!&(TQfA57Qv04fdj_8&5u$(+7%|+dFp~ zqxf$z*IsFh$M0SfG>@aXdbP(redF^+0WHDlJGnq%@f*qJStxD#N@Bm3d**Nc+IzsO z?!(`DgU;^zqukzaJH^PZOD8_Q(&NKgbRutXZuV(_)Sis|Xl#D}Ud&%Rs=?B<=uT2 znqAEoc}-On3LvU6?xFVezabvihjaN*{YEj8Y07&XbP$J8z~dKkm%Z?vTvn?OZEH3o z^%mZy3=)q#!d|{!aLEwwWOHir+*4Umxuh4t>q2MJ$+5Escxjsi7)5R93^igdoO>@6 zoGK=;Y_y8c5H|c|2G<&7$b+OV6WPipT3S8j7$Ni z%@){IE0S=|@@oFP9)m-gM+1h!WT5`~h8%s1j6AskGXe5LZOq0v<)bD-(Y#v5s;GH9srejh1<+A^bg#(#V@tm8T2An}FA)axdF|9DrAGgcyGIRr9uD;2BH^h6by z#0)lzU!;kA!ZRH;bkN205PJDnz!&1p$G=cv=8=}Y?;nM1c<37yq<8NAr3jKttCqZy%A@{ zw|rxT{Wwi3IJZ*o^k_|=tIZSarM>KuittMJ zbpHXa4chBR1(NcXKy>jYc$SKJQOMaWq0vAKYx$;N)o3E(?y!^+-gCZwWjZe4i<0O@ z`3^9mGVEUVplD;u>bRwK%lJiX`wB|EP#N}P=`^0^+pGn2IHRM9eA30CiHu27F3?Au zfPv4GW7SKOWI4+y?P%$m^3|2l#5RGy4a6MlzB6qrv{;&kFwzL;o2c5oHOke?CBH&+ zucYw%jRiMT;ZnX1Y@o6B*pKj_OPMs;M(iwb?*Z$3n%$Hig4LW(J#8M5!~VYj6BrHKKVAC;UMKfZRX7jucKK67j*h2^)>Br=jiyR zOK695zZX<*q+KvZMtiu-r{z;CTc5>3m{q-Kn%5~cP!YmztbErS>4&!XZD_z*u41XD zC|xH5>wDa5)AH+u_e(#COSjAe;gEs_kXM5rzg=?aihN(Q-NNu5`VgfpFav@$`$wLq zZc+~H;FFJAyC@yC@oL}IsOv4wtM5|0_~hlz=M%VoLE{t0A%#k1d)NZPBlH*v{?Pw+~nf`B`z-ca+5VQuq9qvTx)9qk6=7K$l zv1U;bOt5WY$=@f5qd-1AS1!S@%jrgrbvkyX!x>p8W#+7!?A`2Cnj%~xL?3$T=9x_+ zEZ$_C&*GCkK1VK(sQ<{8eYV|x+jYId`1^Xik*C|XmYHiX&0h_5o9)(e&ns!e9d`If zSbH$cUY*yfswyzK%$iN}#^q~+O5-nxp#7S2j@OGz_7DG=iYi&_j0&!_1ubaNo~!z0dFZ zz1RB>e{iu6d+)RM+WV~iU7t0!c_z3%txM8Qg-hL~zlR@~c(nexqzBg0xNxJ&H(9%l zm^iCr;^aJl{gL3;SoazQngcG2YXfT}4>yPfpEky&U$nlx5F1^)^hh@fH5QenF}wlB zBA5x~tfq_&=Ge%V1nzKF&7Xe2Uup7>}LU+_q|#qQiAFcS*IP z*uPTULz#mpq~P!8S=%W1=TISTrP~cFJB~!Vw(FVk$%z09D#0ZCvWj|KAt?GxA#&*o zhBTsXZ!c;rC3A-|9xc%tjVO?v=*{YlPF#B@ct=a-gI;N6i?$gB5W;p$y}b?cpVrfR zvmO+MnD&_}!Zi~5&=wv~+_0i-Cmu-rBCx6~^@1<-^@ll9p;k;jjx#g1jd1RMIi?Yg zRll%v9r2*TX@7ld9+u|_q}(|`nzCAJ;0_opMCkOypHBj1FLABkvla0FWR&nZRN+A= zJ6wIAwzn%br>_k`QaGC!8^+Ljt)ePkQh|~2!9GNk>|rX;MJGV9r8hyUjvEJ}#W(^6 zyTBMDHV`?lTN4I&2J*?nPuo8IReWJ%nW!R=y8<_(aVjasXb*D6MZ>>%Q&g4T@D5gN zGs+gpX(6J`!7?j$5W9F>7ZSw98udJvAXhw<^=@f zB?P)WOziC;l@gYC7%L*)yFycO>`5HVnY)50)7?jZVeDvRw_;8LGh&_Ojgl(8~|n&HpugWFeRi1sV78q zSITlP=nM3R>_u5IEwa8z#oXUFHxb%upRfX#`~v*>yEyCV?1~U4wuT;{R#Mv&N4pTF z)A=X&C({tG2cR=iuLoe>14oDq9o)pl1>>EmBdF))=pX^ZIPTmN;?^=fuFg@~4M!eQ zi_U9VeUFqIf@t?}VgcvCfVZmWmg!n;?)`T$KLi1xRfG$H(leUx`76znHDgQXriz-j zkSBau!TCL>Wk%{s#iF&66-Adb!riCNX1I;77OpxIJ6S+kiHc9Q%XCD*8lc(tPAeCmXQR{2ob~8dE=^1 zWdkc81RCRId<*r=C5^t7Uzcrl9JBADKn?Vq9*hq3;<3;$P&)n9kDG3ge$_AifW$M| zxcEUY*7BUdiwGvdJ~$e6?EflZm1HRMh-H-rmqmuLk;O%rQAlr2J)isA>5CP5-)TZ7 z%gbE_P*q@7+B^@cEYGAPk2s%Sib%|Y-ms8q;fVku-+KfN(jOn10GFEau`ohn2=@m^ zzHKOz-^*V#?rLKC&z78CL|8d8zPJZ?5aW7-9O5VzKTH)nHLDEQ1u)UPYw;?&$kEYT zOW~DWkre@024PeG(3zH*HE^z9@Sb?APqcfvG-%Pc1|KhG<~z%Y;N_lQYqsXq4zO4L zVzE$nKtdj{P!e(>#FDso@+kyr(ly<-EkD`jXTP?_iM$pJb6SH&pJgBGDuHmT>(eQo z2d+yDZWU8~k~D%_ptAsF+MN){;S#!z07hP+khVWvzB1Pq{kls(`m)|aWMfYD zfYHHCdW6KE97QfUFe|$aeZ6RoLefpXX26kl7?8NnMI|yZ-`7I1uv*7b_pM$lD$e8ZOwx^%L$2SSpkvt{09yBIpK%0dauRZo2}4D6{eGhDiS>pGuBv!@URI zh3ll^cK(iwqlk>s&F)Vgn)b<`1#RIyLG~k5U!gwB-z@45s*HI5hv+0=8zwdZP?hHU zLZa==GQ9gJ>NJU^h$&Q0_Yk zuTdg7dkH0&s)v~_2lzWtJ&1alwdGC}#;ydcY@Kh7DJ#P}z9#-&E+r`HlbsnRO?fZC zvbQ^Z&eqWkSGXCGX6$7ZA;{<2b4x-zY=6JJW{A)7*gK9MT00`hu^{$qwI6UK!u(|! z-OP@q!r5sMtly7^)%xJ>cS!qJ{xEs^$M_xPbF+iioNwJn(Cg&*@~vfSoK_d+5o8yG znHZt9jN8?cxHkhR^&Pwq4(j;gog3kgy8NiiyTWB0WJo@WNovkrWTwE^LN>$yYBtI3 z3qG=ALQ?r{W~|!YJ>gom2Y#pa;nKsLuk$eZ75=2vvDP_#qvvZ*>KoBAj0r`|>gVegj% z8Co1{2Rl^vAhvu5tc1Z1uZisy01*}-iIjkqBbc#(+yBK^NpD;QCQ9sb-_{2k0u4Wj z`sfnFvKQv=$ziO!DfgOzVfbAYu0GRaY;gYfWC@LnOL6{Kf@0a43mT_|;X$l~c2 zH?eR>_3<#??|D6WA<;ubZ6Tqv<%i}iwIi1m3+0@@k`XZ-0Lrb}P!kDwZDAM>`#{ay z4>An(g#S~=++a81cKE}-0jCRYxi6+ep!gm4@}T?M5~VK98r%}2MNT6#GLUT=83(Jo z82tqb_iV|BVqxK$5SQQ1o{&GD0;30D)nQMyKQ9RfsTC)f1&|GY>#2+qWw$(KkZXuv zl1k)uI_ongiwp9o;>y|x=118uUEW|vF`vW3WOHNTB+3A??JPU8jr?v%TKkK%k%f%1JfTTLxkwRiRf z30UQ8xN-P*xD{hJXO~%KEZ{H|n!Q4~gSE@X10hm!6~5J=LX#gz^NH*O3o`PpXZv9; z+*c4!|BFT~C7{m8A{&qnnP1l?lGfyCRRV9o72JkvgDLv)$< zq&$xiu9%FR*x^CPRTw-PlSd^G3*)n)TyyRTad%m#Z!t|6?}79CyLkOC6~FZQ^k?N#K1XEmpS7Sn`OlwG*TO02aS9$27e^0UrbP+%~Gvf^ee zOq>{U`(6L%_0fT+I`1VqtSuY*F0})quXpK zK*lQY4&6+NA7&6ABUmR={tj51!I_&LKntrqvK05Pf6OlZ2sajW#DwYhuFBf@E)(MP zX92||SO&zN3YeEXOgTGpUArDUggqZ_DeSQc_5Outmx9&FMQH59RHtK4JRqcvG)2fg z`ENh@zDi<74fEqB0NRhKcGRNuFG+cQ!L%dkB!w`u4G5%u9N29(dysxk{Wp zID$WlgIoM9%f-N-k$fJ>vBvbQ!`O+?WuJj-yLW+INl24Xi~88i@MZmtREBbe)9Hxn zn62$^D~)Q|`8O7)2s@NuQ=vm+rB8zeSK&EroxlJy3jP#?Wn%!h+s~S7sH<|6$!6CVEk|E>kGJsT#!9MEbI>kVYqnYYeEuImk12j zAH&y)5C~dRXQyf3=babL84r~CHnM5cM0EWf4Lk?Yq0j+ex z%w%A2GNY*gW86$=k@GO5IsTG>ZaIw(kE!p#ef%ZO^cZ3-i*=7XE4S6i*hKjyw;je; zo_>b&nYUY?dEp|U$@A7559Y+T@d}^m(gI|9ie5|s^EhS$^%s%^Ik(kt#h|1sDzlBpTS_H^BV0$1e7J3g&P($F_m?(x5m#)7n<+dENKZxpg|nSngTS`mm+QDf;=}9$3@q#x zz~vnz{c{rk+Xw;IAjR}ETbis2AT~O{VcHb>py?(ga{J5T`|? z=ltPaj4BC672|wMlOo~fPSV}K66U3%vYwSuuOp3ESn|7Kh z4kNOJ0t)ex>-P4>vE`RUXY{h0xeif?nw3iE4HyOC$oQ#En23VoiaXd-cDy@_ zz^6_8;kZO>U7|ZJz#u`WH66@I44C>c2wh4K8J%Yrh(8h)@WsRha`kdj40QoHF7vWB zAAas+-oA7B@WRUI-68b^>a*WyJaF1$<%k41j@7ZyAz;kO26h()2fdqR{pIEss)*7S zvBw7q^mBTWeeLb6E<5`k9<&;B)I#eW?qg<3EI!Q$L5S-m~5d z#*1dfOT^wG0c3>x04arOOEjna%Vnx5p8`6JU|QgT`2axWO3BR}Qn6F@V*h+Vffy$4 z1*x+##iX*H_Q=WSL$&c!4f0Hyt#Ge{4xqbJdG~RR2}`b?Fs4XoHo#^B{{Yi?5J3WS z!5CJ2l=A+FiD)29Jgdio^IF|%3+Dew}C(UP|Sj&lFJaRTDz7}C1F;CJ`bD6;b<&5&$bw?7g7 zw`B#w7We-k>Vj)w35`2pDC2o(>sx|0>gSwZps@Ut;_9J! zctpp_kB|)s1bsREatJg9XgN+bKXYc_m&e6y{hib4L_9AmZGs>bkq=acBjMfevOzhl zywW-&aWI=PdFX>qX~OD8M&i(P!7ZvGspP9^I-hG(y}dV=AI(OgJVru>vYH3(U3jMt z!@)=e1s%x_!QGc-3euw1GD9+{29+k@IFL+aN6P=3MI#C2oJv2d$)I(MYo-w`K5hHszM3GpD1B+c6yeF5QIy+e-A9FHMZVW9a+nFVI? zB>ND%jb|P8aKJK%OtO5cmE=6{diWPo9l|ENaeORs<#=ayID2AIx#UJGvjYmZ!hE8u z>^f~12Yx zN3nQ8{v)SYO3h4@d$@1*H#@f$RRVLUq3?h$bg1IfNlI&sD;{6~UM;#T;Wx(Bc3#)_ z3|?%MqG!GPoS#HtKS5T`K@rxN{ImY$yiT>6E3FnjNl5(>XQU7IJhTNb;(z^_0nj+a#0u!P8t>?KcJMU(0(7dt!-N z@%K1)318kfudMY;CIE!2XrjB!d*tvQw1!bD@~7H7Zaa!QCt++OHaWq7%XXMl0xr8S zlr2swuVsE2BGr{)2QUtsw#k$1`Jbkz)Zm(ichAIT2D}dZ{bt(&sz&f9~Q+8#+(k!G=@iP87nd*aCThr@fMee)9qoT-$(k7Ru zt^^YSa`21jjgBxjHtU z_gDt1q+OZEZJOaxHo~j@G1gs|q3uy4120nT7|u zkZ^613{}h_b#KrGPrkPE=7{kFGGF{0mp2!ksOi$0IDT8wra7UP80h6UOi$}ZU@y$p zw46QQtn!c;#ruULV5oNWnDGcAxa_)9l!0e0l3`pQYjx1bQ;KDB&s5W3dpP9~W?S}G;8n6f(XU7O?>+7s5oEGbOnndF0rJvboB4(B|5TkvrF<144z|;4 z*%f?j%J-zj1^bqznTO?OI=~!n|5BTU!B#JvNIQ~M0 z$%;WK3_hMv#!XBDz3?EMCYvUo&N#}X?8ySJB5aS2VKZ;ZDde!qSIvidmz*j@+w_q0RuV`?kV!e% ziTU)vV!8cGcb#MDHXaOi|L;wl=o2tWwHFqk(PE?qhfNEGi{K`{!k8{Gn455U0`X`psFs6G+qXa&;hzqy|; z9GKu}`7#M)WCWKbWXtRBt82_r_YG4OkpIb$f4esIH$bVmM-?j9Z*eNjIOCzJVzB=~?PS^&#vogfI`PmvLi)EnrUEnF z2h;!Jk#%-p?&#Tf7)Z3o8;nOjLd%ZPX6;HE?HhkAHrO+sI}z$!n*7)D-OqW>%Dgtk zS&WOvW?fRZm|{n4WD;B+3ZwCX6ye5=i$7h>*}*6kmglQIVvE+t@=%V!uQ{c172 zwZ(7fm$zA8FzAlvQ9UkN75NUP#;!73eEGZ5Kej^~e1ha3k6CzU!v?E|2EoHFNqd7D zB$sdot#=9vju~Dg>+FM(Z8%s8pl+Bj;l6F!w8RZqrAREy8Dn@aCdf?#m(BQb-tx$` z0M8M&Fe#-pCIv`v{jRJ7Ki#gbA3o3x z5fU(w*fiPnKJgl*Ah>{tE0u+ZK$$N6J@VbAYV7u5hqk=8Hth)n8gBjcE)mY4HG9r0 zA9u)qbK7&mqdxS<-1$k@wsna3b^Qz0OLQEbXpURGk5S&6HT0dWpt5sEJ<-ibT+df| z3mbU*mf;3q{5K&57++3M0rSQPl*X?^D2Sm_#!83mtM2E4Z7M=?KQ+L5xJxTerMx4~k>4Z|%Yu(-xYY7l|2P zVe)SvTd#p17vw*PmFlG_nGe#E`=HK{E3z_`|E2q-qfGoTRp~Xi{Ex=dLPTmDZ5?54 z3hQhbm0nmxxoI=@Ntbstlj*%#b4GD1xV*mBb}il#&kK6yTX(hZ8VYLf6a5w{tWFY# zfccA0S7Lu9lgw1r+hFF+2!BaYLN2=Ut0kFiNt{L2y=uLPv-8qmGs53f8!ZwJ^6MFx z93B@qU2$}-5II5`yHb$E3WDEh7OZUb;ir%5p&qol;%D{B`VITyz5o2p6>=vQ42R`b zgm67vY_tg2jXQ_TwVv$53a{apkF}>%=bq{Xc0> z4w)dm&E&Hd)!6d5n*TPkzNcyp5&bVM=c-E*&!fyT{_Wepzji1Y`X8bX*cHNi1i}Ar z`?M#t{S=V@_Va2;s$Alb)c<(`UC7i|?%8w6*D;Nc&&LukUqt+$nbh#BHcgZk25t-Rs`^rQuju`aZht#{Y-V(TOgWiE zYt;71%Nq_5i)+2dOKqxhiT?H!u$0J@@FcHZm=`l3x@W0>4`&H7dB7-4Ql zTc7U;dxqAg-*UK6waNA~Ot&XO$M76cT+^Q3a?hI{oKA4G+mCC&0Fo5` z7a*hswtq&@sdQWS2fww#56ANCSAtt22GmWp|1fsa7@lJ?mpy)S&#A1SZZCb!I?UGV zg{_@eKVt@x5Ivx{+AxS(FzL|zLLv1@A&M>%Z_%V`Sv_J?8h_8Bv4mDeyL(*!`QiB{ z$C&*g_UqPqWUzEiSp}wfV%ZuK^B-xp^BS1Pb$bv68i3x{Sx6y^1d(G=Q#VHY#82}f zPTWY_ln>2)O4r{QQWAwwnA?X;&Nuy?toI?nNFzg!t8g>b4$$jTEfUT zFrO8kAtr?zPC1lLds6sF0rH+L$3km&%&*iFJy-R}u;QU0EPA>ID`4ur6=*kN-V62m z76P{?q3`~71^+k)A%j+!m32#|}Z$ zr7O9@)wI5i*bqP=eht)V6O;-|LYOQfaG{>4o`n^3h7Rak%i2W1IE+4-ss^y=kI9&;3)(C+ ztgVk9CmBp_U{+?GYhN70nvOX+f;imQTrqLL6U;a*MH;+S?FuM$ZT><7lXfVh)dO?X z!1+=3f>|5$en*cvOrL`CQ;fHMn@kGH)zmwb80_JRHjzHB2DvYP%&C)qt?;nFn9o79 zhqKU5iJ!39eUMB(|DYvbc2|*czrE}`^?3S9!djKW<^JHeTDZ=`r*t0?Q|<>&qCDR@ zez|ipeNo{tC_`me8DBC1Xq5Y6k>lD|}{a``dr{DDk!p z+xHcf3@ifTk&=P(FXvluQPCJdXRb`o83A+}=zXRh;?%#@*$w^nV_6#e|F|RYU%q9SbT)PWF@<=X1f##)u9tcl&rjaP4k|2k<#q*{NG6_NwH?Qp zs)MfbKe)SlpebR+4dI(x+a9UiwnSgd z{(V(REBhQEC*+^O|94wNIz*sJ0}*=C)rk!jZ>Ij}weV0!xc*6GF_f$;NL|D2SIlQQ z{wcIVx9|-yThn^^Po>*_2CveP4nm-L(KTTGzII6C-hj7q|4s(E?x(^fmRlqS6GfXZ zx7vMUwsKy1((kvnhK<6HQxGfxbK|n82S?gb+dY}6Q#N!wM(Ygyph(^t^`oFY_w>BU zte+k9AV1C`vJCz|4D1Bb-~6O&OVIjaUZ4t-)gcIz+d9&>T7#mf&*3ur^m5bpiZL}* zL&hn#E*4i@iU0d3pv0g=WLzp!)0$*}D-YW9lznEI@PBek#w;wIQ(JKgDbnO@sExDlN0#kWl7zZkj)ucsn910th~w0wtly3gwpBY_$KqW zRfFP0?;vrLp(Iz*Uq?dre)U`xMdyd8_vcPvcuU&K5`(-d{G(L`%-0LphJLiMYj|FgLMK!Vkk9n0jK2RIySiL1W-@=k)Ku!O!Y@04jsIjei0 zeM7J{mWQ!QQK2W$xmU;`|LV1AArt;`f@c%-!poN+Mkjp)u?1XMWB#>VNNkl`5m=o; z=aAvWTfK^tIwc`%+AqCiJ2(c)=!uc$wi!hsHv(hc6v;ip^ujBP)k0EB>#RUIfpFAq z%B9hZDOBH2&S__i-RFOgP?V6_muZEo25SP(Z#Q`rl*n%+Mm?9E|6?Ki<&?3~8v7AJ zJ^Jy|-1|Oke%3c~kcEZ+9PJLGM!x?$UM&9@2)MvOYP2frbB~cBA%_Vu@Ur|^0Q27o zg}9hInbJ=V;G$G4=NV19bbJkGSiNF@q)rFhz_ci7*_(KGj2z!5KxOat!a-&W0cxMk z3A4RS?V5h;iWYc!3<5HN>cwq>+|LptjD$%apIHOQ)#>Er@YEOq?oBj)r!LWWCP2O5=IUMK1wVzJ!@RQh zW{(w+J3v)w*}g*HI&j~A|J&J&< z!jgdFak%gr{3M%WQzV?mJ%2`Z(z}FbQB41hrPi8w!X=rT+Mff{V!~xKmjF_?(0y&( zyQiA68?J+Q;_zi7^M}tPpxzQo@C&Mi6)TeJcHGW`e!zX^#!jfA$+;iqQ9<(6>UE{` z!->?1P!mB&=7@+?7F!E@!=H*i#+8CPz8*&_bOs9o7}p%E?dlK3#Qh?<9q}%92Pw)4 z^Vn;9Rt7h)RS9Q;Si5svqvH{7rA9c0ATJGpy-w5RsdiPDTd=a7_Om$* z0_K*BcyBAUpCUJdc(ASWE{O3}2#YT4_+UQ=(4wD$W*4P*8%Ax2G>m5xnUsa#GE3Ot zn!w);xG?s!^3_P)*&z96!N>@kgR^v21B7&)>16fD^vDs=c(2YS>06*x)4=T5p>EjO(@FCuIe_g~!0*SYYb)-BDSGrNsDpn9h?<$AwIfa#m7|I8L*DkRtJr#F zqy_$oTQF`nl)m@LkG#Xq7KWtU24&$?3)5ca%70`Y#`L*SX5K5*xzm|7DBa%AnF5+b7C*_r?S_Hi9N^fhu?|=Yo`eS^kIN zAoC_Z7aUmQi3r}l3@1*wi7&)O<~}7f(lT%op5e~9yNnKoUYK<0Z>@# zwbqkts(;o)hC%= zf}b__RFk1su&CMS%3fYjV~xBwq4dAZNx9P# z3EjftXLx!P-B)CodT;+ii$;plKl!uXXDz|KQ_2|s`;M(O<#&}PV#>|s)9JT5tkep_^^AopR()DMf2Owc(lVXVlCNxi?47h8kn?819l}t~gXyGi_ zsZ%ow6UGi{Y>S!LI@Vd%1}&oh2=LiMz5sk=#x6DUOkK`QXk7U(ggjpWumcbO1W$l zYIOb3eY!pyOWzk~duLPh)JJ`|xU|5T_$t;aMzWyT`(Zu!D`;ADoSML&gN2>#xh9oK zf={!HEMu%4e^O(cKeLJ!U3&JRt3L4ZGpUvP&-$aNe!l<&G0Z-{02uxKAdAV)Yqlqf zH@`QCb5l$p1S(-hBGBGw9zgQj} zulHjW@)2(Axwn@VY!ygm6?t=~FE4D*Dpv+kE&gyreb~)owy&@qNYlqJQR+iG=R-Tw z#Y@p`kJSr6e*5kk71|x04_&^M?n*;i*-vv?JW8fVq3JC->LeooZau%$Who&U_z` z#Nk9*2^Md@5AA9woAf``5&shLx;PH!18AOb`k5v-bcm0`HP(P=bj!BGhS8l&vli5F+0K~;M z5f!cCm+Lh zNYv)7Y{3diHz*X2cWKppT(Q|;$JRQtoABp&Sm*vf zqm7@Bsj0XmZpFoS?JGNH2mclOgxh8J1I|<00Nz;aa1~Mtfm_~XxAhdJF3f$07BBZN zWuaEN+Qj1AA*)2j8HGnH2X^^174r+MK9l4K8cGYZ;z%%FMc>aK9!KW*oJRh(Ami53 zu>o+BuRE98UV|!tGFLFs3^z z7pQCJL98wK&#D0=wO=LUDBS+u!D78pPL?#SB*44B9bBRb-0=%6m@29;0_L$Ip zlsM{V%|1MQAryLRK|}ek6xa91n`kAqtY2W^pV8F(K%@9N*?sNMsb4-aS3c4qlTh>_ zp2zDUIhJ%gcOSM)70bQZ(vt%n$|rXAt<9Ddd5D^f&$`# z5?XWkUHhM2l6{=oSa2#R83Zn?^p1Jy^cMC4*mM*=wsoV8?& z>MLvpGzW)0NI&_Z9Pj9^tmIc6ohn~y(e9qK+wwojDk0lBT|;qi>9#gXSPPg`A0%iH z631R3WT^IG6YX$*jJF=4idwG_Mb_9#%oiXs?owop>KB`uMbt^un^=GN>L}zs?C4UD z1WRCu_O)0iI4-6xM;tD3`rPVR$XNhxV3?6YiDNbO-_ti9FftMR_-ATAa6yDUf zU$=@=LNOOx<8J#*gXf%DGUdi54s{4q_rg~KgqeTR`vZ-;Sl5aB&ZxU$KH4bxH+z4R zLp}&3{f3LT;4ZjPM(QM_JP#Ci_J62v%I%3g{m{D&YrL(Lj8l%jr3Nm5737_O8)~}t zq(9QGi5mKe7QWicU$Bzs=D2fh@EiZjoRjZ)3rsG5nDt4a@6TdxiXjTI=30?M>4s{9 z3mI5aElU+*b6!>ygQ;;p(TC>oK@LpZb!;=DURw(#wMXg0!gm(vre zWusurm@&;cZHdeeP1iB44Up(c z6Q91KXQ|0ViJpYVDJ?B5nB!q*dACOA9$i4YJ2(pbsN!?>f<@PfMYZ;A`A!l1$p9}a ztP#~ggFV$3_jmp2mc!@$=|bm23on*r!<7zi$^ty0y&J|Ct)}@t1aa18XjmfRXsgWN zAPX8|eVj_!X}@z|L}%bELA(?3TqmDvSM7205V_%rTKB{tf?ZlCIZp%c8oA2KsQrv| zzNdIq;@D?)E!qjDFxThpD%a}`(Sb7e$+CLdr5q?Yk6&}S&bAmvly^>S0JZ?`gyNKB zTDQmgr=ZuvFpJ)(AIAg5Ee;$`z6Ii#g&efCnSFwf%jYHGnX)S zoBR=ev5oipt`UAIZsq|RV-L=A8_-clnD@nVlz#12L&PWbX!tDLH7y%gfD9^gZCvgJ zj_+uY_9<=LOIFwzWEJJJ-shNm8aWf)!q|X#jlF+lM}a*)Mj)N>H*nF&Xd~7fsH|pN zW%02%7j|OGob+Q8K~5DHjOY}SF8zK6cYh~h$x?(uC6!KzFZh1KGH5!ZR5c4ONla zB{y=&&?ILM)wI?l5&3*^ABack=O#!L7>Xt&d51X9v;Ac)UMvOeF>@!jyh5k20NkAY zRsMfFf08#Ni*`pzs-pv&Ais{K$D*j%Uko1&8#sqIu&q=u3g7n0Pgk*J@4p=Y_!$zoRm|&-b zE~ zjSgGpGRTY#toiAA_MkdbiCXXL{w#vM;BWpxhPjSs7@70k%CuXl+eO-dc zeT8ug5RIx#XA{Kk_a2A5U4{&s#vPZv{sYUNKvFoItO&>)5m3$&(BaV~n+62@ewPI~ zo`kdC4{{p%0<`Pa>gA(j{ed?N{Sq#xo7mB+)3Z-$vN-^E73cWMwUw<;hgDTn=oGc! z9K#m+&4lA#$zW`d(t#jdhgSe zUew#b5Igo!VhR}BY#dBwnU^zWF3p#Q2 zO19C(MQM4n1$x!`*OUIcYi_9uu|Xp6Piz(h=ZrTHtRKagqQYx#Gf`^Ob&4v43rn5TSQ3AHF>@7V&+H%+p29~_3{SJvsGJ+&9UsVuHNH3lbB#Eqs_pmw)Acv%k}Vvi3z9wWU;N_0Ni zgA$Pme)6SYe zHY!sOA3QN^sXAYcT~b0c8>!YMdrFZK5s}}xd-n)moPYJN9($*ASHQ{}D=e`{y{=o7 zvkjP6aBk?oFLt7~F;}RaZ7u!_t~pEji?bIxrApUtwO~K(uCqWRo6Yh-6um^z**>QY z7HPLUp7T2+FDl3-I)be|4K~7A}(S%FQKR=S>>?+_k4#oYF_bL+(vk{(ql!z?=5opQVQA+heWZy z8Z8B4CkT~M)&|pKq|5h(5V}pr%=UX^HQ!q?MCM2n&a!uR4>RMMci-V78sm7mrhvO! zM4>ng&d#NNmNXJd4Jb9ep3aUCH9tui9Ig1dstc(qJmQ3&V+qUYfZEU9o?~ZzAe6mD9xuW~)D$E?ZB#Q2o7}E=PVLsjYxn8R z#Jm~+NY){8kQN%eqRv^BcHN8DK&GWs{K;wt)LuyKUzA0zZMplAc=Nrzr?{jJlg`` zoApNSGR}^gc2ZolwT*hnS8<1ADRs~VSLgbp0b;9foXIsXMHE zaX7&e-Nr4-*8S4ph4EajQLo`?Q$Xvy8sQZ%uShv~qP}7!hYdUK3s8_aQ|SlJPbh|B zlzF%1IniNelavmRgq!y+8{UyxV157e(O@q}2&}O8wef5NI};PGLCGU(FWBzJQV_`K z#z_Pdr0|Nj?3sl0NZLD92Ch;tl|;Fu;$&>!;Q}v1#A(ET?c56E_<1`_d_xn9Y|J7k zuN>9lCLtX7EuMGz{&N0~Sb(S_A&>e&;CFyZ#o1{f`or#ty1zv*E+WvfiKM%gma-wn z?=$TgmPS>oJ>KujeLck}e`9RsgI`c*@bGw=*FY8A5sF%Kp-4Bp+5bIIZ}LF)bL|Jt zLhw6suYI^p{d{)3t1?enmJS81zQeOY?Y4b9e8oxCZTVfjArnF*d{na8`x_v0$Sg;B zB|NjKu(Noxk8Yl94PWA9wf?|5OmUsnwC4oiJ5_{zwVrjfFUI!+gBOn>40z9{~3IA!HPfNo6-)mcBpHHimIOY%l&s09lPV7M!CAcrU#!)oy{zgzV=; zvIwMGxzLsSakDjCT#F;}7xeW?Q7H4aKNv(Ibjgz5Zg~2{OY;zKa@OJl!kY;TEBCM; zJ1IvgV#D=e#G!}TC<#~+6Y<;YlGmk8G&kTiHvPzU$>{6dmkIp%8-U<1D8)9!)f?-( zv##A95~ZW1K;Gl7m}6I6e$E-sdh+SbB#F%LMs*zh!w|Ro3trfP$lw~>U`GYz7`%@D zLGmt4#9OipzQ?<(nD4D!qQHig+gDWML zR=4*)^KNk_2lCJ0?xojW*R@zjxDhLY*~nIx9CNpB5oWyv!f;5LrLJ)0FSg;NQD0!p!0$=L6A3ScCv3-Fyez9f?J-Nb zrQbn=uj*vkMDVPPv7&#$@hOL)$LI7d88F^V_nuR8-Y|f4GvRe=4pfdbY(dR3oe9D0 zhfO-Sys4qG5cc^Ns~7^GH0~q?g@yh^7(Ideh1Z+qozDmS)ir0d0Y1~Uv@&cW8lUYbg2&CZ$*zn^@-O*qVttxu7Ah0hZAfNdT%tAoTuJ+xU3LKON^zprBc^+ ze1g4CCy&9_@&7$=@l&&C!=)C!cO0w#@|ovfKS<580^xry58LbQ{5+{gU{$%BG^XMJgwkak7OW8HA8H?xB+?Dk_Y-3b|GijZ3am8Djq)QlW+p z+;85NG1k~xb8JVnNw-2<>~>2bJp2+7CnFNW_qXf`rp&C71*p5jV9WSsR&SwfHaDcs zI^R1e9GBCSGJWipsC3vPw$#p&ra_vreF4c+o+WwN)VB;uJT@mh%H!rAEYNVNL)@rG zFFreLjjjA1pwHJJ#Ivy{i2&v6$?nFLUu;tS>pInVQFAC+)gPbeHd5|OoE2p7cnV7=Va<}Tu~2oL&xdy6 zy}Sw)LXSsuP$4b$(-~$p-%M^YTNU4Tc-GB-MD$telohy~zlUz_bU->BH6$5Zs6?0f zSh#G_1|{}q49_3cWwUvL*=4CuFVewHo{i4XT?_Ctl>fo?kkRr0r=DzYqc>XTyw)P)H}l=4aKYtB z@U9G99_3zZ^Y)7zb(6Tg6UGr&6?t-6!_!|m6eHzQUgFMm^f ze>jtUvH&~HhhveRpJ3aCeY>Z`>FXHiYH}&^6AV*o@=Mzc`(LoKqB`8QF5X7rBjhj8 zN6yJV*fy7>LGHSevCj>pPZ9rwj@_D-TNPtm2cq8GPY(KkVtQ^<<&|X2oQ+BEpG&%I z%yg9IG+!oqPo+w^o+5r#*AW@NXva=Sy|xfkfN5bWOS{Xm7GkId1@iE#l z5>FC60K+L6#`K+|r^ylV3ln8M!)j){_EI#$rRJ_Wmo6`9){C9Y`-r1hmNuU*Ts`Oq z1G!lG-yPv6r4#JMi}@j_>!qR`9(;X%sp(<*M@aHBttJfS3ILYilI4D$ZqbQ^wftZT0yOr$u8;m}WnWK5;{k412z=AGV!kzDMh17OielV+8GYIRE@;E4oF~IaY1KW+bOajjcMuFPr5ew7 z%Da0dA{jVlNdl*to4Y@_kKBhfDk6#Dis1F*VxQ6%Azn2l7yBq0z6y+(yvlKL7YZevtG?%)_)mkZ!s<<`xKmu#fgpmUaZ z(@YI*h^5GXGKFmn1V&6nota06-OzUQo5~?`e>O=+)_nRYcw< zyd#u2$ldFty;~*XRb|=716{;Ym4C6`!*8rsw2G_IQ}&~Nq0QGN%w(B1=+}owP1s)lCn?9;-WQm$ z>6P%5)V+R4AD~5kPjwBc$of##`DM3vQ1B}~%_U|~Az55X>Z#C|MKkT`!|f7X?;(-d z+{f%O7iP(QP>WpzPWGB<*)B@ zRH~r9^?usXdGf0BZI>kxodn+dQt*JM{seuk%Pk>wj{7HJZ*gqjgSZ*y6_A9h#}S*g zD|jvxK17#EhJoVW2#j*ADoI0^roDT>_=<9?Jc)l9nI{%rz=Y?ExzTV3LoR^c-srtm zrnMe)xg=g83N*0X7_9yUN(dxrXe({ln+U&0b!<;E7|3_ zS?<$~i>sG)T;hroH$@k+)1X~wYU28qiIT2i2AC-$)<;TN*8(#+ky}i?5phVNx;n@jknj4b)MNetxUgY4)VadF<48s z14&QLdLwNseeBm;e!2V8-eFOQKCt|UwvY61_*A))qc1^0A=YZa1M)M)?&`Q-QDcxF zvq>TPYgjvOr#nWzY%Sc0^M^saa#8%hqD+q~FT;Ny@jaK%QC$G`$`yGPaXe6&})vFD=OH!aKv$}kGt^il zBkfnR6nscz{piTe-N$#wzow)Mc)+JouWp8VR$ z6W?lh#>Qh#THA&7zR(|;Kqou1>a^i3l>~d~Ep)bUnd9Uu0R03PYMxNQ>Uiv@YFdFg z{E6II*At*F1s@bSWXDux+YC5Dp6orW{9`Z@#$Zr)>K|fJX zLEcg|+iH^0)Y#x7HH~=FO$j;&j1Ld$bafo0zv%Y7ukU%j3<~vLQgu>fr4B$EeJ7aR zvM|D>y@PN%tID%jyB|4Z@TmkKulck`P!R=9IlJ4}e2fSr?vCJp+E#W?;`TAHQpAmBQxHF5vM)Rz1Uh3r1Iu!!k_X34tpI0SYjPVI+RF+Y;_267Z^dWles7Q+c_hc7#f@0K98Yksv`3(aRxvq9uB-AxaF<6O2xD z(FqeJ45J%{8FS7z_bvbTzW2S~^L?Jp?6W;*oxRFld+l}BZzAp(=rEn+J_&=tm~?My z-h;uY$z4hq9S!;8Tt8nu`Gem1rl~6o#=!o^F9j?$of8K8Qmw10X5^W^LGr3{)bT^V z8~^E(Ww3HHK+qsl++ihf(Ph?pM0bVGnTqpiPIM<5X1gn@rGla>z}g|x&#{ZOT+Lll z)_jgvLx=LJ>6N1}6ky*Tiv#+XOjhytttzHCA_Pg8lF&;7;0 zXsqankNoOEI2uqIXLi`suTUf90oA=Z4)f;~V= zpRN(Es*`bgjt$t!kfyi7@)5=b(;_Q_L4~K;OUhSrfS2T1VGy$a-D;?QEyUDm$@O6A zlVA&2?;3*u(;dUUjTG?U@TkmGR26;W>3f%&901Mr>Drz|4si7kDp_61xD$jG7Z$%j z(2LA_Ho*6v;fcmsjV-1@uECg4-*a+ruzAB-T=1+EU20RIfX@ied%<{=*;WSxKEHW$ z>jvWksFbl;c7O0U9|1<%s}ECAg?u-2Scc$PJ{T(8;L3l7hp@^^6(#W}ybnZT;UcvezAUCHGcCritYE6I6YNklq=^5WHPSJIh8kF!k34b@RgHdP+hK zO@MHwtRcTfqA#0g%jb#9XF7AOH4E;-e!l^q1^u-(R-Ap+%uqIStl_v@y!3|UXvk4; zhpY1=q=7+Hfe$@!5{8gbch<|8Y^ZJ@9s_D&0cO&>ae$rt2gO|gddb74+0^a4lI!O? z5U;QF{oOM{m?`MQpUh13tfK?~1uvMK{`pTF;hFXqZ==aVZu{dwJGI$BJ)sL72L4{- zx4(x$lz}CGj88&e_Tg|n(w;LcU3S4cN8>hK2d#$6PeJ6hQ=U!<`ll0!ar;-^*(ega zRwBVg7^#=sMW^L}E*S_Mf^Qd?x&w)&UBe(zCrC-OBnA(dLwB1(+;+Cf{Qi9BL}gs1 z-@VnK7dGdz!GVJEGmXZ8f02U@wD(0J$W2ugWtB!)ab{_J12&@De&Gf&Q~k#@{~)`C zmmDP^mRiKquqR7w=tGP~CKCz6eevo&D>fhQU{1!PkQY-w#t^3pK!v#`t;%Lc#0)4vvW08mX(X z`d$#v@_N*AmNMSFw&%!R`}jH+kBx@eXs_GMdNpA@$4Ml`E{$L&@yNP!R+toruGS~H zZd)=xga!+rm z`~#X$nmXN}D&#i?RgUCvG-9E*tgZKl0mMF}yargmf@zW+%Gsl;Cra?H-}C0I6pL6t zsZb%|0|s@vFuj|h9BoZ&K8;OH$lu@K!dr6O;}xUmnqoPTMI)B(6@9sf4&I|3JQ6=C zB$HeoKsrl%fi$GW6*-$yK*?B?{xt!gaYUPgQW>n|T7m42QNlUUO5e3zvjyUe+7Z?QuQnWqmyc+~Cjz z2qnXqPXIF)AVXM*g`lj?JcoVg4$-gmCJquQgnAsdo{spnUirfih7f~=#}c;z#VcH- z+7pB=c)bEFew3=X_VTE$@Tj_iZ7@Pwy^PZ^QdlItgpI!0J7}E8Kgz;hpRL_%M=~QW zbM3*%9?||Yo>Dwtsyp#+_g$d>kcqGoKc!OyG1 zlp|R$L(^U)*TLhU3Hb6i_;*$4a262=YONt>uIfPN_a}7uQQV|=WAI%~9NM0|V!n(4 z&HJdw7htJ%7jzYBBw}x~@*6X&sixn@US$0X+P90Cwb6u|F0PNZs ztDjLXxPrndeHUm+Z4IDC_p!zWGg96%22lVeR6rGSl%(Ej=#MK|=ynh*iD48DUd2g# z18WsXpRHhw(v-iF!?#4;?!*j^hj2Xp_+3nfl(?z_sU%CDnk~z04%49XFmOWdMV+D; znx&FwC51hq4y7a{G5vSjfF-}>??M z+%5AbJvgqQ1; zodD#m@WkDPLqCf?Af0uSDnj!~%=6ox+$WzTg(qj)1N5g002!P5LAq4o|Bgw>Axa&U zKphwVXS}dXxKm7JSNnu?+i|Y=f4`7e>an=c`z5l|9Z_u*73HNe`1S||N3=@H=iC2<|H7>K?Osa4}Z&s z4BboqDvqD;p0wRKcKbFI?~Ic>+}dO78Z2ouVLN~Of5h%E1Q>FKQZ;|@ZU+4_7Kzt~d^i6mz#xYlK0T5m6b`o-k?$vZ^WJrA7cks+X+m`@j&v~O zPlQ{mo!|NDhW|j8W*yfLDC-4-kMQK#*-h${$wG+i2hkh!8?bx+y z$Aw|)Pbgh{7pk8ZWUiz88_NZ%#(`n}n|rqu+Bhk*pOkiM_?geNxE*5Q#08-!-=nxJ&ep8Q$l-5J^KF>l(@sXHVpDV9YzI@)tFv_-H>U|Bo4wEy<2L!22$4zNq-E3XzMcIHe8T zHAIyQ|5}pY(!XUs=zbJM!fY{|vgh z;=p*Q_aA}}QG}_i^6hf1=$Z;xo)(|`m55)~ji}&JQR_>;vhZ%Du(Sfg>gvVs zB5oRnPoycLUe*mX-u7jY`8%zX=OV+{j>@{<>exCptE_LkA+;4y z*<`au(Zly&YvNx^avro@X5dx*2Jta)IMS;ElT@R+6EEy&Ls*Y^8r*mO90~6tE=CKc?0}P!u^3^(8+zzaWzR>B zJ%Xn5GxYBF8B*^kr0t~zN$rb5NuQzHOaB=8_=T6`K})u`oK+xB2Bgge22Q~^yqfik zS@|)&(+0_Y(+DuXS9B|jRm;dJ$~$^3Ui4BX{(%{iW37KGg1@-kD{=2tZ-87q# zv@efC^ZwJVgchJcZJfk?VC+9ncxggd;iGWgaRJT;J4cz`%Nb@6y7W{eJ@2c$*plYO zN_42LP^-*xr|;-yesVJSvvkjS+_O|BM-l{dtW+O7h*F2nbwNu50{by=@?JMa4xsJ- zqflrr4xm<*)4c&QAUvRZ?mrft@`t|E@|)Z%;XXk-2`SMs5vnE$OhBg%@de73hJ?RWT?IVeMV zC!6UGlun)~#b2WXd~}XHtUy}bU)_6VFy#^>Qs47UDj!ioaoB#(RLeJMGfwh@><(&B zs8e7IF3Y$z_^bOaWEU`mdQ7s$z{zaFk5CT(>H?+5d1UsnZs#$GL{N@N5n5?F8Sw0~ z*|Txe#|hs&b?D}!mhHaD=An9y&#c7gh8%kPUkY}Psb4OrGb)(qn{ntHr@t=Hq_FqMOb8v8n4PW zMhjc)xkb3XOqd`>Vb)F%+9UCWd;R;L+gOu10|GH{YAQ*gzuEwR=Srm#kkY4?kRmH0 zR%|IeS^mxXh!mxW{WJ2gL^(<>EIhamuK8D5s3is1 z)qB_9p6RGJ)*M#cTOi`iJCJ&q?_V3xA(?gU;xIx&%4J~_?Po}*xFMop0fFVx9>-^>q+fOxy1d6l+WT|dXH!T( zjsJ1WB||8OOipEq$?Gsp+fJ-6B~)>g&_W1d&cLcyN z2XxDv(kyeeI5!xPQdyAmYx=MxvP*Pd-`fIr92|kSU6BiSX1WO@22qnFrdD+7qZYej3-PVaIQBoNF6-oK5#-- zITFULPXB|P1FZ9ZVs59b3VB%kQ7o%Db8D!76_~C0CmQ3?hX&7nc^_89t)8-*Cbm9GE=zF*PpwS>86_szEf2_Kj=3&D74++_QOiv za{9%$1`q9nYyY49aA&|Uh|GhYeGDRfBgPVX_ZoI_uTy}V@{D`+PUO4vBrcHz<;+!- z6YtxLjP7bs#na>SIN&ASJUUgT+?=FiclfTGC`Xom6$1fvvn&W~8wP)WnGafm7OH@c zQ=WxhhDUJ!4Mgmx94NXW7dqSr;(|eB2rJ)7!3HWKqKryF7RJY+ewcNh(AX*eSd3oF z36(hLks_uv6Df8yx~YGdbWE0uJ6a%Jh6jAYLqPw!>ixo(#*&;W;Z?5_3f}(cxD2f% zyC7W9qQijXG)gjf+oX2U`t};cD;RwHx1XK{Di91BQjrD8`3Gl#;B81+acfTdh+piD z+U58q=$Hp~4Ts0-A<-*ZGs%1^UztdQDR&kObAa(_z=>}Dl3+0Tpw2qV!E$G28H0VQUEZ?IPlm&zAjz(EqYeQL?-(A?^ z=#X~UkC_2(on%$sifN~Swfz7u-E-D)gpjPQa7MvnOS<`REY~&xs%lshQimQKbiASp z%^^*MyH9&gIKoe>%b!;FlnLJ6`$Dn{0@c=mhJmfC$wDW0e;tuiEw`!46GPFd7^1NO zgmAnB@kHVphO%Mc#Auz8pGcU={&*#c}tMKu9#RZ{ONa1$izue z?6=RT8P7585>oazbm0jUQymYft-)wJA}o79oVxaqwt4h1#8Sj)5!(vB5qiTfd!}7r zhA$x!86ji?I>k{-US~5e_z;lZN$D4Y@t4nm#_6A|4=RurD-0P0eXS0rt@kLSKTJ}U zo;%}MZG3T!Xmd&Oq1K*tu9x_U&Y)Lw_wy-P9jOQ`L1`WCI{i@E(!7r51Vipon$~@B z3JDiN7a!CW3(;~>`rg?+$djV})um^F)ZCL(?8;1pT9zQH520(T6_~7w17qFa=Dk~k zw~$*g5mClr1F7-QLr9}wpl~4XfeVd;f$eD>h%q7xvhDU6gPep|y6|W_95Nl8ZUZzO zg2y+jEu0O0P!d+sw$N8(p=?c`uCG5y1qo+)HPjA#h=^YF-9`D)J(<*BKRx#i#p5NJ zn{Ee>m&e?Ww5?6_qt(xGwqOeudGqKp^-emGE$U=94-*6zM|N@J;FGzK!cpl&xyDHW zrz$CaF*npz8u0G@RWtUmAvG`P6NVJ~T&U9(&8_YkagLpbBNhnx#h+?%%o0ID^%<>Q zALPHbb=^_vA~GyrYR8?P|6v#9(rrepZ-L!WK*{VmX=dmF`~1oVL{;GHY2y7hQ*cEI z+2s>-paku8*7NYZ!u~iU2Yc1bO+(p$ibflyLo-+9SIkqF$J%S!S?ND)e? zFe!^;Km&6?kWFJ(TY(y@5XI;Rfq}HSKA0g*kbvmMtZ_&+*3h7(X?v8*Dr?$i6XR{at zk9p*d_9)oLkUlDQk|sZdAs$LhlkEb%W?}#Ci)0^fp9^(0uQ?mp;W3o|3`}&Oulho zi8i#yiwm3I-ehe>*E=S?&5Wtj&Rm8bEYc16i7_#2bte_3wmudMOc+759Y-gBQEh7^ zC*L5c6dl;^?~dH018NX>`c0ei@iLC36NC#PZ|JpSk~CLQrjI{75d*Yui{{ZoVDmx^+#Y*hy>PE~(meC=nWk_Qt^i*4B~N zc^Jqv1ylPDY{4Kmf_2yks0Yg&hkf$A0gL)Srh9qXeT;9@KvG`HV%lK9HNK>qfjQP% zW6}hectBEdYaBZV*9Teonf`74lI{tn8%i9AQ^tnwArrnmhm>QFu~ORH;VOB0f(UblUwr?3zCdV^Una@{UR{0MhberBD7 zt33jO2{98C*%nQfN^+?t<46`n?LuhjziumS! z0iqoV5E5VNzpZ&+@$v2IvY*t3IyW$oNReG<4}zMsw&E9$X>uOkjxUA?hk)-{##vz8nUE5jF* zlteW>GD@)E^QH-Ug2?k{ayS$`GI2-5g=z0$RqW7|s&N!;cl6H4wk6Zi-8|$JkB`cE+E2Wn z+_O>2S;tvPBV8W5`Q9)w(@vK{LdgXR!tb-DAIx}t#H4gY6& zux%V}Ci@A*_iCaZdOWMeAv+am`#j^SyxrbJqUmh*1Md8?T*1e zj~cx5Y5dzqNN$Vxx!Ju7+A@L!y4tVjpn22}@n7K4qM=G&McCi9%BnMC@SEU-eW&nm z0g2boXn3(jizqq0XPX|iIS}^gZsFkfoviba?aDfXhzveUpNB%4i9&qPqZoL0?)FgD zrl?*MGXr-(i`#-j7nlb)dC#CeM{Nyfu3=vc|Q1qPA4cb9C6LsKMjX4y$9sNL*<~hdK%K8$0%aB z;;H@#Cfs0U%Kp+OBTE#)g8x%P=BCYD`|{(6q3`nP?sC0a0@>%|C!$FzvOG47#M0{Ble2=Uvm-wk4lgA^*PT3u;j${-5NVBc z((9m0zs(OT@V(cZJ78ZH_eUB4Zd;Q>en-mBb6kySs&2#Zqmdq?7N*(|f1DTGfdsS@ zV&o{Bqo>L%Yv)8;*W_b+JgMFMy5;lovvgENGqOcJIVWj|FENIFU6LnR9FMU=SGykJ z5VtX?=Q!g9PHUThfh6N_fBS`M)a(Yj4CE%*hMiXB`}yQ@=vY;S%6-97HUfGk7aBj& zSMdUZ2ZD{$IOA^gxBgP-T_>bnrjO&US>;CnLyTf-kUvi4`7S;|Bv&Hbz}yEI^Owkj z;BlQOW|BHYaymA)`J{6b1Nd}xq8!&fhM}(f74!t8QwnijfUSK8_Bp5dGI}EEl{QZT z8Q13wu3A?t>IgWM8q|o|nUW0ih?btUJL}qwVD&1+bQ#zp|5gC4`%8qUpUA;wJ0wK_ zZeBkB$c6LyAv)XVP1f^W!g7_Gq=tA~0JGaDd{^TK5i*_ffAnKGY#3GB3B8q}meXId zDeXqP?@Vf&S2azHfv5qT%JeQj36H`X^FU`a_Mv!Rhau}%;*AEypvTXUAm~&2apjlz z`~rF$8qpOqu#S4N{w?a=|H3rGlflW|DcLJ^Yn_Ot3!zD zn4iK-kU$iG+ZwFF#agfC^Lm7@_Vwm+YLJmj12bhnFH(l-leXZUVoZ`h0L(NV#oO z`lzpy3ub!O=LeSkJl=sG-O12re#>>}dch*?!C5opk8P)@gYCt-Z_bSo=kJjC4ahU6 zKdL1&goet2lE%at3#dF81h~`>#ax!q;`^v?S~K7B=K;UlBqWT~wLFu2mPuu&R5wUK zPB!RECfwIhHGK7>54pQ{#4`J2kkL+|vfLbSA@gl5x z55s%I%Ax*69OhK|D#b%m9@C+RU@#Epy#9!`)#pC^Da%Xdvx+_rU=`Awo2o|6No$#E zh$f4Fu;e{W!W2;Q`kZFrdGbpRX|D(S)v~60^@(V6-W}OjLN^UxzBpeyc?ePM`KkSA zh9?oI2wUP!JN%D%2UZ}nY2KzdTz=F6XG>xGchY&pNx|caZ%s(3QELr$VFJ)&4tV}d zO}goTO-Vz_HP+GN?a=ryyN~C0eT%mF;}^GHo#=TWt;`}%@v8V@fyl+!}JOIl)qgVz^BW^kxS4x!5sLuCldSG>k6hr;L7 zA{C3!6QN0u+jfZAY^YL$PN)ATMX%8fEBtV|<;;aoQP-tgMjmJSYP|y=WtP+!#zmlC zm(gWa4g*kIv;By`8+k6*Dg@fYG?X7LUFHlk+^^>9;t#UbL zm6H1YFnr3!m(N9vnGrOjzWkyG_x)QEcw$nwesrP-bD$>V96MVyzuCb<5q=478dj`( z%?`wj=Z(4U*p8MZs$7}?n(Pn(pfwkzOrvR-`o9&|rJ zzhOR(YiEtMNM5QmPR*PR9U7{?)?5q-Cj`+x!l63#Df1Wmtq>`dB{gc6VxeM8UiZQn zOh_8)kcq-EqGNf+_oW&{QWM*3k$>%Y;@D$le|z<*$d=iPp?EYJ|FtTwi}(8PCT;)e zlrAf$p^E9ZPR<|aX6h-=erDb6WNlUay~X>|BJj*A=jcEylMCoW%4_3v=jU0C>)CoQ zC$D49QI>QED5)1$ECp%x!Ds^FVIsJA%~5oAN$_BE;cKQrcn1-Z`AwRWzz7k&cgm7#;LHG-_yYfXsAHf^$9 zRS=ps%aHEOWzWi^&3yU~J;opVm`9tr4FDz3&7^={${8#_87Kx@BH6RTT;wNy{54PZV&Ze>2=xhjzUT#5e|#$T;R z)D{wM@{P-1?TW-GXOo<-nx_mQ&UJosF0|C$UoTv*pC%NW61hm%Zw%dF$~{1fWPLtJ z_;&Lj**r;}UF)uxi`BS=Y3C0cLU%Uq>V=$NV4n0?_FgIl=klO|4#MEG-T1&;o?@$9 z>s&L4?NYE#t*l^^B*&R+ngMCO--jLN3laknSn;2(j^O@Z_!osq!C}0IH&sq zf*C}s_DYy-FH_ky+unWSG(W2wLiRQxbUfEAyJBgjWwNDYt*_4?-d{*pE3ZAYW8rc8 z-TT-NJt~b{dHJ=WWa1su8>9yTTOFjZ(t5}PGiBPDnzmB0SKdT-V`oR4*R_>jp8Ce0 z1Xf3(4)LFv(8k{e-UNf?wE3s22-tMqLQRx3?{2O;W25dGk)K)6HzPlyZIh7T#ZT71 z(gRcewWJr+YfWVh*IayySF)^NB$wMkAh{+i>7@9hcAmZ+U}A`p3SDYP$>O+Igx92}Bb*Yyr^Tcy1dM0IT`Ks< z@hzHM-r?h56f*|Q?jK~WO%nN^st+Rtx^2&e=(Sb6QYuO6nul#Sk_bm;?AF>} zPkNUqu0)#Z3XCzFAeH~fhODFBPi)ML0p=pKI|jj&jG6~=U3PSZ{wibH5qz#b?`V(w z42;pzPZ>gt!ll-4=!(9pMZvATL;Pd{kS3lDm6$4f`41>Oe_E|Cl^P;Tn8|Z?ODxPn zW21jqYJTjAPSczoXfxmT|S^bGo)-i=YHk9-F!!r+)h{H1RPdLG+dVpCZf*3cJZLAM%%VnNnzRY?uGmPq6r!Z?HO!3+qdn< z&yV2)<}(04xd;hNK^kIR^rHgn>B??#Q@W(oT8_VgPwr+kT?jlz+3Hn|U_M)N2iQKH zjCxM({`HeKXg8{}q_8{v`=mRY`WWhSUqFUS&nj{zan$eSJxtd7kNhO5T+lD!t4VGH z=QY`8w{xXw*ZkktMqC>{`R!mqVxe@074o8+-(bq=9Ab!?pLm#8n{q}VT7r0D*Spa3 zLz;JjApG6IS^6`|m%d6o5>pXUZ!^&Ktn(nK!K)O|mra{ia zcht9+gz{aU^tty4Yky@Cewp~h6D)f7bs#ukru>KJaoANp6@^WyRr(tDmax!P@X3Dl z(NKry7qQxI47;iCeRId`D+o_}e#-sX)G z;AU{*VEPqqRGrlrEEhNkj^G`?2EIi9;28aynR!$w7>q(&8eggH#fm>$gE!H^5T5+6 zvECjjL#yGBS48u-k0Kwpg}$rtdT$AATTM3Y+PE1$17*Q)tLAU#+UW=@@0gBA7m7@d zKbQOx|FISyoRay$bYA0j5NsCDg3NIIc_}O2*zuxCKaT^bC$XSwy|{rN68H&}vQJ=N z!V6l}No>yAP|9NFgk*c0qOUK@nRO;^E3Uphbo@zzcGugw!4iA%Jn#v%J zYL;FmHuP9`5p}<=b|v5J>zD*RIYN%Q_`{Jq1m>fCxdE7JkR3Ud+%w{R-R)p%!y|Rj zSQr=M*79Cjg;upE&nHC>!@+|y|B$qCEi$UPpyFdJM-8ox8_0LR<*;73%uN+6iyI6M zU5;`*O^`I?uaCQ7&cGLS`b)1y3f~gF5%WPzO+$fl!^1Xv4Z1=1t}FLHZ`Wk5L13;| z$t(BSC>H$>Z>Q_N&C3(PNJS{#RG;#IZ-c&JBpA58^)olLR z3uwu#v}aN^S5VJ@p~Pu1Y!w9m<)_xS9qQ`%4CnZ1risXX6d<@yl3tb=v+=oO;q+>z z-^JPkjB2BZ-6c%Ur5T1(Syo%O>5KWP^u_mBS~ygBlE|6J4$k9z1_rZWb7oCs1n3oe zazd{na_+4;rDOth<}xh_$LuYBkEyjfm}JpuWy=%XWXyJu8PzTwqp_pDcQ{lp%zGVL zyLT_=S#{WVt)F7b&BRu{wyl;aK4@Ujf`?+xOYw-!R(egdJuA2C6bNTLzNII2Z)=1m z(^UPXx??Ec&-jZ7oaC;5jh+LDsN+Rt*v%4-U;5x#>PWrX3@phmeH4}qoBFll2J1L$ z8p`5-^q#v5W6z^d~ z!~4nZ!b~T4Cw{lVzFCSz6j@O0W%jhFJjr^U>+w>X0V{AvvHX+NmSgu)>zB^~&dsIk zUk6s4^Kf)&+P>CJipw^y+$S85e-!YYe}!-QV(s&yH_+`q^F_x-0_u4pwfHAm=hIBh zC2X$2?FJ}W1D>>3mOQ^t;5s8K@%brxTKg!0Y1y&<#+okn0kk@fKa5JX!U7OmD~{Yz zsMSRNDh_6w(WR=sYpJaH;K@e{OjtpL3iDU`fUnMdAs?oDf*NV8HSt*^FVBMUvJ>Cs z(dGGz64!6z+>_WsX4M$>ia)X?rM5jw(YACs zz)6@11)OCOVZP5Z4M#ad+~=R3|4}LM$HpcvZm;sFew`C}n_FG^t31VJQ?q;QaY&hV zQZN-hjQh}tO3ml}<>%A|>QrguW8GrAjIq$k4+0bFM5R#w$sV7j*tF9()jK%2_aCG% zfniIoYj)@SiJke`P3F71OnXegm`uG?ct%|%6T)=J)tdWBQ<$Ias&MuPMYDC+TU$MP z)GI3q0ZKd+DwL8pc{j>}nRFB8A6a1DN~ESbgG-;kB|`p1wVz155%t2aTkV`!Mrknn z$wVvpDCl$4LBQ$^R~KTY+CT^=ad8V7RjihcA;$DPy;E_mJi~e8jC6!$Y_Q9_deGr_ z>|6D#i&~D|o7Dy95l(qhUMae?bHhTJ+Lt4UUG3#FAC)zp6n$!oaQS6!ny~*1c%&X% z+hp>iMW=sK9pm;r`)M1LoHp#y(!d+%8uM1%xRFDPOV#2`>o0XReZ%b9!6>HIn1@C#1(_wehl+)oJm(XYHkH3?zx=c++e5o8Yz2be$$V z4S%CU4)P>Bf5GZZI%@g+GJY+l+!L&dLb1nbE(EC*=r)T+VpI>ySX-UG*L@LjI*(Jd z7(HP2FU;SxU2Umc>D*gB8PR<^9W0S5z&w}A3Sc7VIV|kWr@7Zdq#$Brd;u^=X6mXKW|* z$VY*KE4H{nba}h{Yrp)d3rI#mrE}_sFFhRdWTtI1Cp2msRE!7hzYdI3D1!Cn9O?1j z!6&4jBQAV3A*&a=-7LB-fy6FczKx4A^Hu};FSaQK@~Bc}(vOl-~j zYVg{R;xhi5eFB?FA0pa9_}JACqo+cF5f2S`pE!m4$I5-H8=2pRS2?QvbL5G0TlaOAFi}g%i4CjI;)pkG$11u4;$*-KLx0k#Y*oMCwSfs6Olq*)VWV#&^zR-Lgi{ zyqTm|p3CBg=lNNztLOQNkc2vYo$mGq&&QsS?p2aqb;tl}g+w5SRK@HU-H`iS?R)9y zXD|sVp7kRWFLQk(x-|8hFP^Ux+jETl9{1waoccZs5|y4GW6v>L0Jf(^I$Od{tzoS{ z1`5RWIC}Iynp70wCV29dEV^FRj+oT8UaWI*qf|2BKDiUq31r&klqCd@I+w?ZuUI@6 z3H$tPAUWt&zpZfS300)f#{Sd764p!y1^A8E5{5>HYg0GWu}W0s5_&S>d(xf_py*jl znRT~Dn|&CoE9U#^{jKdA`g>YMv)k;wYED9X_GV94a(#VnKlw7$)99WdZ6_4@okCI! zx5sXw(!W$AI(f@Kfk$qgeWX(V5WZwDnd$Vz>|Tn(12y^QI2QUsH3!ygKk%rjNJp~j zG;@(li1*xs1^Mt{SnL^TCh3yOT4EOm?n?eZ;FT0if!FNxb0=)tIa2CMR>r40-lU47 zBi6P98;iZOcxYWi%_}hL_vRhx1y5+J0V& zqu7%Wi_J@p-lJegq+%vR+Yj`Io<05FKwv`amFKBTBi4z&=A1i=dCGoyu-&0qBWkFxCRbq`TaJeGSIvvuUm+x3aZgG?8s6x%2`?3e!l_ zLBH_)DbBtcvp=B;T}de!bsK|wRkYV!RlZe@>{GD6@9nWVZ2#i$V|0-3&HW*{)vOnE zldqa|fpx!3rWT{HSt;d1mH2dn#^Yf-YytC3x%>-{dp5^f3&-5#j3Vrl8GGc$iA^?M zRbgjOBi?;{zIxygAb%*?{0!%G@)EgLLg6y9D3f^A>Q~X?5FF}MH9NFP%5119H^dDl z6&R!ybY~RUSM49p<9N%!i0+ti0-UhYe_qsZA_q~?cX$#fVa*JKKR4`Yn>o8SLwzRD zYDlK4ZPQ6wNIx5rG#zal5q|19tb(CcR0PZ zGu!T%M+<0Rt$u&vkq3L28tO1Q?OBEj_((r%@w)TzQlR6n>#L}_yZEd7P}wT&LFWB| zOL0G-K8Hor*iq$8NP0P5J<*4+kVaijc@@*{O5X-s$-m1lO zJF4C5-7Y+#)hhM}V7^;t+rQ7~DN}lSx8)&WCik!*4;djsn&>TIw9)_VO;zIf!rdki zbODsuyA1i#r5bCBqs9>XN{y->6V12R5SCPu#v+4I)upgO^6NBh)S6qNV&V7qLj@3* zmw0KkoC1o(yiQ}+|uX1$($EUYWP)Ri#%oPzPkKk+3M`Jqlk4V?`EwOu}q)2<} zc9hRkgxS`{s-{Ns+SXdI3?=c|?(rBsYx*))+<;VoTjULUu`*VnnK}55X_4Aau^_Ns zX?-8z;n>l-=4nk{e{UUmaPG*@xR6Bcrq7S_8+2m%Yu;!5fd6i<*i?JM1Dz^Uc?4 z=D5{I9epG6{l?i{Q0X#F+Y?bjj`AOf*2t7O-hU%o%khzpXa0S0^KY@QFy?>#KY+5C z;$Pi6F!_JqbP`7UudXV^uYV6-g#CX2YX3ykgdyeLg9o!!$TI9@#sD&smOpa7{{I(} zw$qu#?^>v>G1C%X@z8}+H!&qf^QDj^x@vrb% zHK>&r78l0RfwItKxq9ki;jUNscOUsF_d9g+1J9pyZ;-L48~=;uAs6iH@y&^URkJXx z(_}?V?CH_D(yIbKn*4iTk9>_)=yME*RAPKEWc2PLAAypzM}`5bLP})x?-2Y?!`NbS zy>ld9r%ffAXLx@HV;Ge+*iF2jBK#)qd=oV5EdkD8SC%6}B+E!s%3j{`rKh@MLDIPxTX;0Gpwv|Ara;0T+VN zHb?Ci3!WYqeWG#kHDb#@i`wEfw*FSg7mWO=egA}$(|?6!F%j^ckGfAte0{mcQuDp? z1B1%CMr}yDEoaO@Q7r!~pBmAIT$S0G4V}PAJc3;R4=D@ukm0Jx&>}#EIiRMU^%0-l z%R}mNj7jpFga06JD@(zY2L;1G*gr~BTQp!-EG&tSQb-(25*!OoQ!?~976QIy^H=<& zj5ZdxG>930fHI6oi(Bf@t9^tPEi$iF zv4EwDM%q4erLk8t@DGYUQ8ia&gvp&Nful4#bICw?v>a)0Wp91xkI8T0hr}lT3|IcA z!b75C%RYLkr18?d#CJe~1WW^zJpz;qVa*Ku1N6Ew zGFZVuLXZzCCkaj*WGxFqc#Vh50SY@$3W}p{4ijA;^ZhE=p_vt3ym{{pN+8&|JNTKW z+ImS7a_K9fDRGMs-(V;l$q~j{7QeW!cpgtK8ckl5?e~1o$fkNQjU7>d3v471`)=@f z+uEUANfO;FkM}3+O-VsyFftj%DxSuL1@ev@Qz5Ym(j)hx9~e|R=$?zp!8rB$YmJ;B zcuW8zlVkvF5_E}N-*s#FbtE{uk5{s`B;1F@6d^Q+y1ZTVx7aLjioA5ZU0yN^Dvi;7 zjF|7&J}mh-Z2paAYH7g$_iL_j8zu5kRfQ~vJ1USK-8`EYGLwHqqCN1YXL{KyTsQ|A!fn&dTh?ocE2?l4y zlm00CUlE4#pqdKOebe{eH_hl5H5Qn>-|}6|dfnsvl){d^_Zpk8+VL-?;6Ia0k5sD2(DWb!fJy(jdf6w?d=wha+$UF& z@bAG1TQT5@_c+iIPa4GZSrYTayKl=XRF9NcrjyO4IpaQ5W?oy;6LdCtUthx+nLw) zr*72!R#$O3r2fSo5Af@K3V%8AU4)NW@TWp)uq5^0xl3o-WFR_281QeydKiuB*8{>JAfVPVOh0cF=wUk!r&Oak`}@gX#)K4bJj?kxFr zJW=!01ZtY(K6%#euiq5$4^*b5$Z?yG(|TJieYUP%%s%sxYpUjipGw8^Cq~T7UF`8< ze{&nEma&zhyyMy;#XXmGy_lTeZtr6cOtz5EcloZnwDJP|l1gf(f5+$V8?X=a{4Jgq zXX!`cS=YT(tYn0#iF5ua(q8+=H!oi{YT5nW{*2E&WZzpcSr9}duwMQBeTUeP4ap16 z(X!EZ@QoxM%A9Mz%6?a${q<(0x()5$NNDR)n=_1B4x6{%92`n*`EU5?%-#jG6I+l) z?*e8gJr;r;{}MN8+Joqx(t`Kr?O!Q^%R6@yoAh>O0In13Qq zbN>%{dW2+1VfZ_d!Jooun}6!P1+5DCo{!YT<88Sb@Ld*dB5#Y2($htQyP5y)sjj;o zuwa_ujkbeaA1epDFw{$qRJIt92J*95KJ;?q>{WmI|H7~f%;X-+6bi|{LI%H^`$~bS z4;`=xyAf^vPzW=cYA@UGf4>PMQz~5-md4g@zqG%LvANc;+G>=&<+MY1y+gfveZe#K zX2a&pEdKvt?ajlX{Qf`wu~XJ0TZ|=Cl4V4Qv1KVsSyG81`>sOvAtGgqWZz|p4A~+K zkv)6HKG`z%eVZ|J|8BiM>-YWnUDxlApKJawb6s=p`#y7)*E#3)cs>K}8U;RYiHu!$ zAEo{uPYUvx$`VZbAo8a*8TQ&}W0TVnyv6%M-_f0#L)AvY*cyqmgRGrLYz2acqF`>tQFdl;mU zPjuS?f$?(ZA>sQPuWO4SNb@3LnabO+vV~A4#A5%={4RUa%!+k_VM#;C4iIXAIK^5H%v-D!^YkJ zU{3c>nA3#$AIAt z?TLOR+rY|=7|A7It5oFMMHg@?Ne9aR5Uns_LJX-}jf6dEKa}ix182XnC`zBOs58Pj z*L;xU-&8N~FVSuJMq#!wwa;ref)$4Yy)dhLrj6Wdekat^1VU#1k2Fm)DUsm_ssDh} z=wcQUUhw_^r;~}lRe06+nL&o~cfXLv{l|yx>WA;Xo?xjmQt49~Wd-8}^+DMx<2d3? z0tw{In)ksX{&4JNfDL$4hG8?1`;tsvA1rU&yhf8)k2i)8&WmbKP2l8eCJL z3uWNnidPxMmY|Y-gI^CcMp3);H`;;GV;K=F;!pnsW3gD^;9Y{s%V721uFUQ4rz@Do zZtRYwn#MwwcMmfirPk+WIbu6EwibMic z0>a4ygR2K_{?M;KC=hSA*oxF=)qTE2iWH8YT1=v&+QuY#d*r7&%}t#!t2Fk1m{mKG z%EA?SL&P2aaVL&Dsrxz1;|KKkM22d#a|iIJl@i6dL41)hsFR|Y{djhq*Rap|%^dt5 zxUn?Bbm6?3@z){yZtizl&ZgY{ue60S_!{nc4KDu3aDb{1R{uxcL8Z*n`^yC^&lYb> zm_d*+bx*_xvF*j zbR>dMcx`;+qywo9A&`P6p=2v z1}xPflyf)Br}-Fa%5kj>Be#e4am8!SvI@jA%(9$doD&_Xs2uXYCL2&ZNT*(8fYqb< zc>AN}gI5t(KkpYX43*6uO2j6Mryt+W#T?~u6QDH{9$OLhipsSxjx~hvmb5(>UCa}o z?!~a3If;<2?{gEM^MDL+GcJY*CgZa+8G_UiMEJg2SAJ+v{V)%!h;%8)g%=nu-M~P95zG7MPKU#T?}}Y+TZwyxCcf{K6s}Kd?!^%bitts;IB4c3f~7I z(G?I_<)CS5eY5Rw^iy=Z%n7!WbLM+FevC5qjCg|9s$@~?ENW}e(l;m!@*jiSKlL;= zctV~)dU{SB(Ji^a?eZn-Wo8&0eRt8Tp{O5rY};ma`l{OFXPOR@DLLnf?I$;OR?ZRC z-Iz_B28ZDIT$1E2D~Jrk!vb>w5=d;v7ZYm~+fPDPab7P{Um#o1d`YZI=wQ`3lLftL z7FF+Dx#rS7`|^lfG4;GlJ>A>4`9uABuE~D?WWdxyA$|5=fz{^`gbJVt;>f~I#ByL^ z8QJE~n?*AIv?9P5sx5F`__kWoPiQrzH;AZ4s6=F>zq?SUi?WKq_?yk9nJ(-F3fB9+ zP?Fq(Fz~a`Q~j@*HGp~%l60F^T#8P)J^T^><5tQu)|qYc!*m<^w}dnK9Cr#b3jBHw z9&y-`b8!8yX%2rLQWWk)^@e;(^c!yKi1HWqxh^Du4*nqVfMTCS&+@-6YDT>TNn(Z` zwx=tD9I82&XdK9)j-NoKQh#x%mS5;Bz+L>YRU-hC;!+1(`wcEUO#w_Q_`hb4-EQB> z3Ut*7$t_$$z*;EfBB#OOD-4e~8DK)DnaO0LM(?G;7@ijq5H6wjD6$@}5G+b z!lv?bC($|Ji#gN;RDy}(Cq%2ppEoMt(7%jSusX{alpM+|cNwNW-pOanc#bK$5re7L zv^+42-4fxpJqTiL?pOIA+e2$GE*fR0`>(FjS+>9*ipOa&FB2s*GPB>nW&YLl{soTq zBYoP|Aa{lZhlNez+3kl`VXR7#LS&Iqa>RkgM{Z@MY;Q>4|0PpUQGjnhV0tw9l0>zP zyhqZ=0}9VWShq4ayl@v7->yV`S?2jX+Wy4cHkp2I=Q#3h1PP;6s5k%IOPjzFd2s16 z&!hm?59SnPj_J(l6^qpQzm>{6Lyy{8M>_>VcpZc&KS^7}W~?;&)kqcwiPuNDz2 zTA3-eZ)d6#nn#0ikVD4-@pI!&v-A&THdfBS(3irq0r$aX?V7D#p*>{ud1!h>W?Tz+ zJc5UtDB*nj4_pO-_SdsDq0H-G%8#ksJ86mY#M~*k$atxn8o*W?CP2`ppy&sDwrA4j z=Lppg4glNQHkEQgw?soN3ZE6ge_%z_dQKA@2j}Tb0kuP#rzB`hftZEv#3q=j?iSnj zu%y!1Rp6C(&A)-r;?Gkt3_iKu0kR9D-cfy5lP;2P+aD^LMS2eJfU;X?w;MrbmB5VF0v%>2zH!nJCifIE8(X4Af9{w4^n!4ot1i;+D$aIuC4(d~oq$21vm zPx2;6?TygQ5dP4XGi^t~tzViRzNemGUb7+r&&Jr(=?Z+0iDfscMnSlAt6Ts%jKdo3 zBel8cfd{K3A31nFopY0W;rzy}OG9Yw!IlTfdvF^7c`Mp1;dNjo5$L!=U|UH-4}dA( zHFdvIDk)0eVG20H`w5TQr$-|4*HQSD&rd}^6U+HS+08v@+c!AX1l^r=b`g>`$YFp+ z9Y~5nK5z~O#im|nO6;NGaUPp5LFD#!!P8-2;;K9Z+=9C(01Tb7>d)j#N%l_Wsm_Pv=T_n#kO#nt$=;x;<(RvfZd`nb1ypCRJx z{dDLnh39H5kq ze!rK1L#a{sb(LlJb;{{C9IA40K(PE=N`~@eydpl6j7ti*RU|V3k$OU zHhsf*dk=QA;`U9n?tu9U*;arA-Ysdrxn=g)FJC>r-F_#!YgDka5!PRU9wGYis!&2h8^n3A_j~ z=IB@17%Oo}s~3D&5BHb$&(&4GNYfvx3_-5D340CIBUOCKM28Fu<2wT0JQ5E>ev>GV zLf*^`trYoH_=JN;rdl~7ftG_hT!+?MA{yxg{2a@*0qz>sD%h{0*G;dnYO74!FPL*5 zGbQsPb!oUC169Wu+F**OBz_+TTdn?&Jq*&DuK}E#^LYjI<1mVmq2x)C1;9sc|IFOk zGCV3mZ3fX*ZT0k6+`OKCiBFAD+dS$a+O*5ZWi-<>U2!prM3Y8JMYtkaEx)k7lr41Pt?zKHxjPNWSQ9Sq za>-#DA?FSFt8iE2%1FH8bR->9K24TPLaVVPeQN<&!7lsLMFvf2}sUjB2P&0ic4J#=z}#5>qFlQdEMzvcP0W#dHjX zhr+*DgB`uoa;9_h}3l4MjG`rFrP9X5qf8qa;2b z%rdh7Cs0WJ%`0VD|3Uj}~2u z7MH>L$ty#7F^c=gq!c*~%*IGq(Aw5rrdTDiwV9ur*jv#7Uwi0z6Ukoxf^>+_D%vd4dZT-^15f!#4J8GBA>Ru% ziVcuJt2$%i9a7ICZrsLPg%J>%t zUtn$JZ}+p8N+RQvIZe#0gL=1%E%`1#m6$ejxiI<-!P@*QWArd7FBnH@a4)Yw#uxYE zLD%Q>O?J5tHD#q# z#D^1!z85!RAgdA8axmj{EAG}h$Ria zec=MaIvRQy2fw-HV3_Qed}U^S4*@oo^aHhYIvVRy{`nsTktE$CBquSUFKMOq8KV58 zRqkOrP<=@=d=mrM$~arDpoeFMKi_JCa0lgnUjZtl&bo)=^$%a=1zV(@ilYuwA7Kni zN?yf|v>kAetuRIb7Pd&BB!a6y85**6JUUHcTO^ZWr81!Fxj?QC^A<|*L`CT_E>+c3 zsN@nieQG%?xQjrs6yqo44eUf3J8mPZPxWpl$f>qTrWUJ~>+7pMz(?TYlkICus0Osk z<+mf8$~NfpM3)Pl;Xfp+u4ibUK3V}DEcFnITyU9O4S)86H}K|xuYTV^&3}AX`1HwHJDb!3|Nq8Mdce3HO~u^iVJ1lVSS(ctUw_} zrH=ZlY?opkWmuGB9A+EZZWkyv7EM1$XIHMOu~g6)_9(YBy%_}7hI+sC z8w1{xr@0yhHOP$&fRa3yS$ULNTZuLH5S7pAWYB3cvySUO#8}BjZ8c(EdfVg5e4mn% zLjzsS9$lu9l$50Qz$SNViI^=kh>=^vB)K;Q){q@W>-|bd*C$r{xdj-jJ+xaesmj|^ ztnR(^eBVc${o*Dr2Y47lDjxa}Xkk$zzxYcEj}=*T*li!O$@F5je(>xC=i_AJrpziJ zSAb^VW}LMcp$$50e+@ZW2DU;;ZV8NyrQjrh%-zZ>EsEDGHauc$afF;J0?@HDQ%(~Y zq%gyz(=PU`NRZbfJ6HD4qHV%Vw?+5c7n;YnWVZOxbq!na+Gw5)7M&U5R|fuUIRA(SY>+0eErU*F?XFGcd&W~xuVliFA+{n0CuDCP@_U-!(d?B{WFGJ^Vm>Kjw4R^S5PYT}Q z_knn3<VTq`um#VIWoK1bOh$#Zx~Z`)y$3f7q#y}(d0C&@0; zarIi%_m~KrF62!3$yPbZW>Wr5YUEPwc$l zc?M@VDEEQ!H*3DylGor(86$&(H=YFUN2HhutaTV(W(l={%1Ed5H|YCfHu%Cz*kO3P zj-Kg=Z;2m-Y1u{kJx}kN__-;h_;Y12KcIgOA@ION*UDSlN za#nS@7cMaX@$-LPM*Hc&tRj?HgU@8b!SaTfauUs6o5Bg~t`hvX}*!!LIjxKF1kcN()h@!;Gms>1EKmO2N8#!Cot^Car(whS4mV1*_yfa3DU}{X510eo zX@})xhcNz7yJRexU$6R*NnMXs)rJ)Hj{Ni0i4Wx7!tfX@kct=F5~xHV5O&{Pp|LVy`^!@_~$p+RL)JfK=Wx zwuQ?_ez|go?5(w%oOaBCy++3+CSV3&d_<*16{eEe%o$F*7;@zUjIEeS`kI33bRYK8 zyU%R+#xnt#P6FZ4*KknlX~={`Kfisu4T0zA<+h4|nY~;#vb~kgqo9Z~f0s#k8})wW z(M(RqZvEWs#TyRiJ7bx+#*VJ!PARC-BKc9zMRsErfZIPVtICkCvgOa9dU5ZD%3V>p z-;`#;*NtZ<1M1#wAw(F|KCxajN&P8c1k4T9WsL*LGx^Pra=jL>*jF^I!*caw<%y=& zFza4{%aP74-l=xzY)pJAkcd~?U<|6IfA`THBc&1_UGZ@~z|?l| z*39d({r4uHk3#wA)X;{a;o-IzuO7jBk0&oET2%{}ch@ttr>kA`k;EJht$^wkSldyK z%N#x40~T#tSpk6k9M;!$&99s$UfP=5dnDp{rDbP_gxNQnHxJJ<93;)~yQt}9K`Vd# z%#byG02DKSn@cB+vyRFXgfJ4WyPXdnVSIZoZ04-|`n|C0Zma&OAd~un^M(CwVTC8o zvxH}bqroaGLGl{1jz>%nyU0FqqHgcTE+b#2(hlygj^R7#hH!$qyI9DskFi34hxdIC zN~!_ViL=EK$0#o7v;Db%UM24jX1mNwmYH{nvOmrs6NahgGTm57pnzEX?8R-olSqg- zu$EW$kg5DF#qvc)AGtR>_Tz{BNT@5j4laLCh=98wR=$NSw%&c-Rf`mDcYZA)W3ATG z?s@#&rY-c_^yBu*Je5k_)g7@5+bGrBf#l4YeKyglbWbT_0FpM4P{W?{* z$-q{Zrh3G8H*9n(Bf*GNnj|00wTG1$xOs`-mV3+Dx7$6^Zp&Uxm#4YeKQQJQe*Edo zT*Nc~2mR7slLBgFS(=s8n@?afnNiDCEZ@o{q1H;-??~;s1U_jTG*{cD(_#YDmklgr z<)N&qcccs&-#*Y*n7R63Etekb!_$$UhcJ$$72R)23qDKEeMv+LzuJ9+i9_8W~2 zwnB?a&1}C&3Zm?STfg?*7|so)aQahChYx$}$;UhzKFsWhC36`b^Px;>d=Le196!Fi z`+A%VaepG4e1!Gu%-{q;=#%{%f}7O5w;xM=B8OwiHxiA#oISlf$xvE8(iW!8+Stsl z<1KFe{n1MumxiCNAF|0exPz*<*=vpq^DbouI$H_M#DyHjLw`My4K_5T{VrK_+&&G+ zc3fbR6hwo&(t;YV#;x56L=#T^x1|(IeheTc?tcDzn2%H2AU&spL5rU^ac{RF>bT#- z;+eVtLlf!kd4yeJ$fJ4YZ5FlEt55=)=H)GF@u&1Efh}z%Vfg385tDUf@tRacYOR%(o^dPMAM+ZsCSXOQ!Dgcpv!)zW?`?0SeBN>5JWLu-ZR?(Q@73@9DpO*Gz zXg%exd6^@CCsxh&fj0t(UuY8{=sZkbac6vL#^Y!^WESQbcH=xmNe5#xX+?dk+Zl_> z&^sO(<%?k;@xi={`O${Lgfeq~hNF>|>aEQ^AhQgS=JpaT{d=6YQSH*JjFo&9`=ReV4Eu;7W%s?i+;4F_s*M5Ugf}se z!Ubafut?+0-JOAjCpk^;NHV9I^fUtH?_#v7Y^3;N@}pdWmRf2uZ5~I@dpEpm#*C#n z!R7#Qt%Yg3K&KL`?9HbYJQNu;_lm6safr-(Hr>;#MAXwL0Q-I?cL#@2rA_Rp zp;d1XyEu2&poABZfcr6E{RbKJU>g$LMs zXIxqa6hfCeJJ~nR;#I#1Us+CWm@=kzNw=<2RGi`HqRiAZ2H3T%HM<_zb4NeKl<}xe ztJJUS>lK_HR0qLlj%#(farj@XQG$H=3=5UJj1$L=kHJM7s$V{=lxq&njaSR{5rB(k zin7x^HM&QAc*{Yw72Sc7#fjflV>K6#4q`~I420kpXCP&;U7DdUu!Q~InS&A03gHTc z>DbK&vA)DXlo$Bq zIw7!lc0NRG4gm4SmTk;gGV7#Kx}V2;ZFdjn)#WUkCEu~@MyEXg(o1O~l6FaSxYL_Ri|mfyvgu7BOBnx9b6?1LD&wy7}1=Y#)K7bv8+qEQL$$e-Cy-TUQ)f)(I z&Zpa&8itivzfzVk=b4yj8BZsu#fNApdKT2(e4$f0;?ARByRjiMvaV}m@D=6Kc@bBT zU4TDstj~yB!0TyK9e+`fN!UP$`4EafY;E|(!x$!BoVz@*t>=)1UG`l&x3J*3^SqY3 zdr^$R!HUCZQ2C8skOi0jc*{_m!;pAjaFyuyp{E~x zwyxnR&u#Hr!wdmLmF9c%l8p6HNxZzWe$zS^UVTVGnfBg{k`6$GF*HlUVCBUz=RTcD zS9Gcvu!JowMh*e3(vJS6x{q@i4F=XYEmAdzr9W#WGdtgBc<9?9Yofk_TAnewp_@x~ z3}mk>j?qSF@5Uz`ltF~1bOWEk9?!md)_m>olrmKU6TEAAM20{TNl>{xZ@} zlRp7}ys5Zdt+F2|d#~b+8S+l)k;(QE_m7eR5>t{7b8I2p zw8Z!8iWo&k;q^OcSNGv-W7~!d@$fe3O%>VT!a(d2H4zqZxmSQZ%TxFFS_zx0C^05! zjelmXD3YVv0>j*|6MFfwPW!?3tq=Z|Dc6_Mj+Nc4oD1%W*+&|4wd0NWGWQts&H_3po+pZ&>N)T54{E=wF7^vOH+?Ge z`H=xkUVQonEW8O%aIWhX2AXR;w_XC8?xz-_%;prn@Ft~B`a@jOq~a+EPD^`N^4=Vm zaXGjJR9R1{uaJx6Mao@x3wduuV;H(E$TX{tRZ>io^isN_#Xf%eQSH6q?t+FUSUYz8 zH`QAYWp#%>78Ti~8M6#(o8JN|(zBZ39g|;AUytKG_pUzeJx}1%yDrjs&eTf+;whK$ z3Jy2!&06@szn-Gx_&ak8E40Vh6%&|TMB^K^?x`14y+gbc)KzkWZRi`AbQ|;KS)?u> z&u*mr6IY4qX0OX)N$0&>wPN2(o}rUEy3!kzw#QpSVbL~Z+fJG|)uhof%D~nk!*_gG zcE6DIBkcU~Dp161W`>ci(iaIf>Zy9#+mtJEuTD=vB#18i^Z12ua?b^w?nBFt%)Qo8 zm$eTQ>lU(~&K`PzA|u>V9vssa+n+tx(rMXH`rN*tNCQa ziSb|DZoR>;*G?X38-oX~(phc1HJ*P0N5)Rn^>^U?#GE z^I%`E7N2MTE?MdPqdj`j#gVUdL(t6ndr#z~DR+;and8I# zAH(2D@B-?Ys(=={r-!c0l2oW^t5(c-)v-)WOy_s;=f#iD9B%rCO?`3ip#3CRpPNmx zb5>nEqV!*!O#n~3cl2mN-hjtUt?_HwTuSq8;WIjA*}zyQ#V32Ca1A6Sdt;{5A$KXe zCO3e!iOw$U4f~J?F*f_jVZvj(tv~kCeiCUz@+<7H;p%!Ibe@8yCNoh4%cACI$=nn9 zv$0u++ElylkQ0`Sjc{N}&-l7oH{uZcl)Qf^Ra|$x)nlug`5W|>%i%tw*R%$iedn`; zCo<5~UU3zlx0ed6_h>d~BaiR}sonF5Njjb+k^fKkUlSlo{z4S(jK% zp6b}XNa(%5BmL4ABWxuswcdl@c-#Gblt4>P)ZyZI59>JBw6|K3Psl0rUVM14-*B)wT_zFYDE=f}9sNj8|~tL+brNBD&Nbq=mHi1hKc z9?jjT6|;>`Ihj^GJH}%84`+3+kykaSKJ1{0;=Lh=FM0J0gJC!NntyTd-Lw)H-vHU$ z+guzY=OJF7(Pb9()na9-T=Yeq>8tmnuUvSM$68nvj&Zba@V}&&(uU@NEyLjS?U(F5 z9|?=8%d~32+r)%8&e6-hn0`f7MADTht@SZ`Kl~)FbRMI;SxVgAa`|`})?|4!o^2#-_%Q|3duP|c$E@4w~$h<*=$B?C< z$TF|}`w_j*Od?V5+DHj&76UXm#WCJ~E@oQ*@sXM+8nN&6nMP@QbatXBpEu<;rz9j^!at5sqD4P6Ld-QkHcf95nR~}y$ zQ;bX83VR@2cYebbZR)9WGv(U5_j%!w>5wM|)x|=mn&c^4WG*ijQDePIDTsGEH+^TqafVa{N<*g+k?VMk% zqo42UHBR5Zp&2N|0hLq=GnHYK7ti@b}^!A*uUCva>*l0d_Ovw&IyajQ= zi^|LDQd@68>>vGhkv&hR%R4FK#<=@U2SxlAqHzA1fAD@@uw_0C_BQ5Rj*Z+v4jOe) zb^6Mw9}E-D#~bqx`^C*Gs244qS`=+e4HD|FYnw63LzF^whU^`ulIM><#T^ zuPDiW2)VjM9imvW%gl9NcH&1n4z9C*8z^Pa#3klW`?@LUUG-r=e-ewM_qA~y{B&~x zILI4n>G4e2b%Suft;3M;-jc7=BX)4w9J-yS3*?(0SJURcBaH^l4CJAgYaZqFtki-gVj|_gh>pZu(Jr}NQBCLi}( zl`A<&3fS6dKQTqDc{d|_XQ<_MNC|V1jty+dw>wU0xmnwo@`WE1)e@)VV+p%^i%>dQ zrtEh+O_6Im@AfNXqIs>Ud>;RKvX;DYp@L|AyJ=3kqqsqIG10B=-Yw+UC~8FGsyY%I z6&Vrx?9Jxz%&98G@bsJW>In{Ms;|SUa7A zOfdQSl*3jV7RB`l>Xn<8TuPj9NWY0x7nu9~*(u|^xZX@cp*_%^=q{DA= z2}t3DCWm;n1OCw*}d=-;x7!eVN89hVZG)abLPb*o0ypZ}YKd$wwsoA;P zyM6&fuQhMiL7=*RJV7)hx&CI<#~&r*e8cnw?N^^(kiN#{SOL{H3p|vLb&U1YrYUMu zS$=4Co-UUC(gp$l;@G*N>0G9;6#dMLbK_hjv)5Rol+6}hi_uXj^b)h_15-p6kbL~! zmpo+TwEu+}ue7h@d}R%R)zLW<@0Z@aAnKpiT|iG&7b+e7dLgf&s4Jcqa-+~V{3}+6QFcQrlll)kqHC#56YL?bJYT+Gygn0y)oY(TB)Phw zsdqax-Vjkjb-5v4Fo#>7a3N&!GUDf+#KY_Hbe_?*V;oh?=hPfH)_fv@HAeveE%wGn|;jMdW`S4A-(8C}s(Zt0-Oox(YlR&&kii|3~=9wsiOR_Syy zx)$7@ZEm+;&kVWzOu$mmdEwZIhCBN{_skHbjDYFyZ7~04gwEgY*|c7Mgs>LVSlkuB zQ0=?C{b-W#qjZk}&n&nwmoGQVdyLyaUS?h}S(TW6_e$F~{>US?Vjax>^+-2zR|Y4;+_oOZtuI;j8P7yWy{ABfT<%lmt1B0F8L3t*r1-z(Mff{-;=eMl_43gA zHk1)F1aM4T0gyZLH{~IaTL;Hc5mO&~ghUTqkA)oskiR{KH3)H0m9-uTTC92DQr!MU zD{s$1AQl%-_+<_p$JNnH4K4?A@J$=}zv1VOKu%@wqm#c;x&Qz0=l}0abx>6-zp?R8 zUBYr*={E?+f4d6*gN2q2^TWN7yz%vKhQyG$f{!b09^-ELa_3aPs7$wilI%|Fg0udZ zY|*aS@u0O71Wt(M|AR8oTpT8o=)5jDhY;sfx=xXm)&--`U7xX@P~i_%Ch$lw#O!rxW*FDy7GI+jDw8o{|$-$Cn-(VmHQlIqZjqn0;5yuQ4iFR zw#WV&)0tf&JI+(>+MS1_=PM0|SaE)p+W*Tz|1UgR+2_PJ_{Xs%g@adr~{~NRiUey66m4WpCHj#u-o%jPMPc@F0Ut?FLP31?4)H*~eH}DNDa&<{xAkHDK zo>u{K_F_&ff>9^9uIAbRXfag;Bz%G&L8-OCYYYiLBSi8(^d-VMwr3c9rgXeTKiw^y z%q+2ccw(YEF@S`@h@g2Q=)nc-|HCp08T10gWa8v{FWj(~nREL6`Y-a?{)Bv{sCY|P zR3`Mt5BQ{}C9eMgpQ{5~!u!$oL_r){@&9-?(_D-P#S7wF-4rdSDGIZ%$&U@bToT`? z3$wl9s(>^@DITReLQ2}jedfFYjUqHD8<<{3h35cSoaujDj!%5o(2Tk_0lh4^@=QEL zL$E9%!a1y8Nafv5{!9V&uiwm%`%G_Od+QI4JV;J`%YH zve21b>cF9C2Qcy2V;{l&0*A0AX(BmjB^N^v}WTHeil{nSjb*+Ml z)#s)7<&4b+^UUb^%0lQub6lOV~gGj(SdTgN#7TDHN6YwG%H0|*owGBsz3oR~O- z*!fW#yo^+i9>4~XqE1r$^^gRQuy?>G(mb*wspLH5w4!%;HgT=(GzaYG32ZE#Omgh> zsOpS_vFnE}R=!-u1>Tlcf+kjB1>vl!U(`#>h0)?%`Ao8pq9f4(#GeB>c+I)v-#WWY z+f&7lj|af~o|uknMnDn(|3f&}kOoND7}5k4XfM5qw*tC{K#_Q`bt|7!gVb5aisf$d zFWn7zJ@!OJiga3chI`%^_Em^0s`yOuv@ZpQn3!s{TVy5@W?>xJF9^EYf^t~@AePf4 zkC*+&^oi*CU6VfX6KpxgHVXjR=1=aR6zCEF+G9DPqA@@P4iQRP{1DD^;!1n>*(y*f zHHy#F;K+j0hh90sm#I-F__FmjTryj>sKg7j+ZB22HkDaS*iB0+GK{&^9uQc?k#qkL zE0)N&v+;?vwM25D#P;wgUAl=to~6?s05`OcPjnBj`AJD82>4X-nB8*?Amjz_fSh!ZZ1l-;KjyM%g!N zm|*cO)Z=SdNZa%;g#{^&U^B4Z|I@*Ynn-ra6VhW%x=zY}nv4m@hpPXsng|HfTXT|v z?2md@pw2N_tkU5N&%a<9W&1Y<@s|ZH)Z$98vFPAvfu@mT2_?Y?1z~z(QJ{gQ-dSbf4!LQ zlu=l`v1%g}a1Qlub3Qa@w|VSWa`5w-4`b@}nP{|z(k#^^=YM?#EP?4x1_d7{o;4EV zayQ>uihTcu+u4-Jpa3^Cmh|D=gZkRNbJ?J9#eYD-;QutErjO73NVSTf_c9h3%CGkh z%5$ovKlf>e|{YRJKKe$`CGU$@|%l5c(x~4z&Xzj^< z(jgwypz#ZwCq(i0J3XkE+@coo1do72X%fF6lK%dC?uX*upL!4uOs-Cz^=jy=jelf& z(0Dk@l9+^W;ycBN9MmHlf`)0RxF5iCP{NJ^6Qb89d$t<*O zB!EV}w9M@W&#m?&r}0Qv#kiB-9o;|U$M@e&1#CGKXO-wI;w8PK>dkr0oWo?zl5BfH z4EfM=i+uUo?ES2NV#rSqzjE7Bc!syg{D+z0A4wQw&^H0di%uhxJSpVtIq8rQg<~Z* z+F8%N@e%JrvO#PfVGjG75lQptUp909>?dTWo@38Sh=?r^aCH$BA;5y-zyMX zZQsE3>6f z6iUuTX5;N*0Zy9HOcLli9};@}r?-6lfK~)E=9-kxLoz**S0i`w#5$TJhuXL&x2F{^ zNqV(&hbG4h?Yvn;op|5+a1X!oCH>`nI~qVlb9{@BWX-A|f$^1yRTlu=@D*6CBQ>)0 z8zYByLO_XxZ`Wc3A{kiftHL zIjnL((+^w9IF~y)GBiHkWGYNahqQ(<9YrXwx{a9J2;#(H1ymEJgGh=XpPV{1j25Hw z4w%2cyTJ)g6JS>Y3za#QwZ!%M{2P*l?LBH%^0RWH$S!vA9$Sg{8Cy5!;4RdU75Zam z5|n|e#vFdYz4xEcavvUX9)!9%!J17~+Qm#Gb~m7Z6}+2`?%@t5NqB90L7YLvN+#Lm zX4^;}eQ0;Ae$p2CJ=5$PFiQ&(7pvQ}bUdc5qUNEo;RaSb1krGdJnOb z1>8*TN85qeas@knMIuOsNcHb~e@VJjPcqQRf=8x1gV9=#f%sunm12Iz*tvF6N#2bh zsMd9=Vz2O-_aYLO_SG_no1bsh2l%U~e6R5pyYMiDcCs zNY5@dy6guDk(HM%m1%5{^bNI-8tN+K*68%>9@Pi_T;6b|8fghI0uyN93zL^a9n zG`~MD(UQZOn@nPcOtwg)=Z?6Of~8DNz(0`Yp4R10hJBXl+ZWn)8XZ^mR2$?Jwlov2 z_vK{3e;l)4ct_XOkBCtNra-?}TYLP9zzXqLw25qI}TAa_PQ?NBoJj^Wq%9Lb|+6}{~bB=0RoW?LNVKfo6c zXr8#y@}Azsf@S}6N@Kd?d*Z(!1 zFV8$tN_n#S$BA|UT#=jv9{_tlG)!}!F^Fy?zWUM(T->w0wez}jVN7G*_S4I^dpSb? z`0XZRAB&K{`|$%?{Cp{TT@8Gq8Z-m=BLHbfpaM(ApP(I$J(k%G50;<>Z!u)w;pn?) z+<+r&<>MJx{*SLRI|Wj%UCN_Y24UY2b02KCp;Q})2l#f-l(-f@N5sPZ{ix6^3!0{$ z$gE6eH-a4Olf;&bq$g^Ef>1GR z%qNsK2OcC%6M^z`FF{M-Kb&?Z7{FhBfFh4gW0BSp{^==WvT*gE;PMZL@~~{N8-=RSOoHFGI_7In5prcVyMohbz{=dIdWnQd>htWbS|iaW zBfatHf56KFaJQ2_Zb$@*#_|csQGX4f{zN$fMASO~h>bi%IN4cE3Y*`Fld;Nh_@Xui zJdE%BdFZ5pIcR>=Z5s&sAKe#b(phZl<+hvfT%`VGm9@VjB7%C+pLRy@^P3*{jXy-PCcqB@!yrA3 ziV9pnfE?IiALH9$dI*>(fDm%X3vjYj z7y&Zt+CY=tQ~$mVFurV~Rgdmk&GHh6O%D0)SFo{HwI(?lz;3-d5H=P?h65MPf3MMg zt}}Vv!K3||BX2H52K$mCF>X#UPB>bRhD2*(!Vi_NZ?2pEzqrNU^ zGT6Sh@U~3<9bTVZg@DTnng#Kv4V|OQoRy=RAZN_MFo;8%(awO{cVbU3Qd``&Y5}FM zzImf8mrzH6vfJ=zw50>kz#j?-g>Gh;bpgA0`ij*W6i9y$Hr*wbsS)S)X%@urOhYVX ztVD;y7A?*iieEn4D(%OUcBev|Y$9W)1I02oq}Y9`>jOcr*KFo*!QfG7D6>)&KSwC3 zFM+9!ceMdDsXafouM1|vs?l!5stp8kyaax@wzpSjqoWCg%JX6SE&U{_$2C@sK-%gf zgaNP-``Ut%7@k0F&H-9rOguRN#s02}pW~)K@wmN3F+g3&s=TxL8Q;FPn74kQeFBS$ zOtmQ_4#UTp7u;!Q&f;6X+&^ulQLzmB{tA9m%BQ3secP9M^-C6R0ifGD{7w$UEF6v= zp8iZMVm}>cZy`ZV!FO)*?guwIe*X$1T3!%-R^BH(u|&z@0XsvoNVx^jN*24iq+}sC z%c0zT;!2x!cK$AaFpC93RsjlaigKyVqJT!4QQq?Q#R;9c09|KfC7EVxGGRLG7|>W+ zGffCUUcvY@57R*?+#yG8fJy2x;C}lE5Y~puMVNz`k)^EJiHV9r zQG|$*eWw(%4id6wU&ofEZ10pT+1IiRW#5L#z71IiLyBQ&7`s`{ecspiy07d0@xHJ7 z`@{E#&mS;n&Uu~J>vcWPInU?wv6g>GYNI|%Yk0&%^|BuF?mM}HlghcYu*ttxfi^`~ z9hs2?=zu6cbp|9vEeO0r{Uwhd84J)TP~V+Jz8fN%YM?9J(zLo*bLiA=xvmL+-WKF0 zBX#+y9!@6Yv7T}qKF+(5@1MM)Us4n}6MN29B-?yaI>=)3ha>2icKj5X1|8=XEbauH z8CHe(SiDsyyTAMfv<(?6&gk#|g~zeo<`CE=zJUB5-!H8@PE+tf&diw`k`LX_Lg}X5_oGm-wL*1Kxi#6=*|YWR!cR z3x~kpA#|w;)a^3OhbIgy{MGW;0o-rs-U(|~7%Mnstqi0h+(}3+0&*c@nv^gFM9cDz z3y4i15~@GOoePFjU1k%UeXfjuS`3t-7S{paA|QqkV!}_&I(%9e6-nt?Wt^-?-CSAv zwKDslW_3AUfPfUQGD33c>IbL@59Fj5VQ!v=8PqeEJ%GAw0UMfdf70w@3RH6TMB*TR z?~W~fm;LA7{%EqtSZ#i~5`2!6RQVWonXSj$;sRN{jDQp+I@+r_N_(*+Qno4^m_wOy za0@2n5v@yXg4u~fh{;mwK)_|_>AuJ&C^W0Nn2Dhp;t|erANBcf{r&_GqGzpHW#GX+MD))y`+sW7P(L#kNp9< zb&i5kCz9mO`O#tZ{}`(i)j$gL0d%FNv_tLlyrZxbi(V?`Suyaa7@2}sb`htc|8sJ$ z7yo5MK(9|`t?x0ik6_U5n#bJsxAV6 zA<{#P`viOx>jhO`Ztp!fiLi_dtr%@Ovmzp2D1s1KR7L?%t2+;$wu?U=(1UQG3vxBt z58~PHE?=v5Bu-NoI0F7Rx}M3CGG{Y@f3}pKVy^M%& zZ&4HX{bI!?xbsO$k#SLkyu+3T>tj}59z*)R_$pNi6p`Qq9{_qVmkn2xe@^GktW z0Otv~cUU^gP3+9A146csO;XaelJZV7=y3h6)DQ)^R_r#1jH7pru~Y98L3*w;S!AVL zbhsTkQjtrUzI2A(?W%xFr|bO)$4pHrcRR3TwY!FTG*u#%%|Ft|R%OoFDw%74i8Up& z224Ob0lrhB$0-SMeAoz6S_Ks2hrdk0=Sg_=h&AVosFD1fz(I-?`Ox|RGIIgeR*0OT z-cFN_{6`vGhvi94QX$@6%);&6Rb>84j#2kW+NmhMU*UL+^XRE1R@F9a0Sj-a!iTuz zoDtQovCu?42ySKEmsW^y<-$kz}S1 zKBiQfZFON1DbSm!7{Io%5Kh5fOMQe(1&cA4q9~2WJmmNoqxGf=621u77_GfjL}mXx zX_mUyp6U3F>;n8gXp1kSx04C}qZU3LTD3}1p*^|!6_KH*eVNCIQ+4?aEnVYuXkM?@ z^$s?Fr}(uT?Rd_3zW*7*ZvvWmY(Vv~=`ZSL`At>zV<`n9{*YA=1S*^L@~o2wnm{Y` z_8K9zP!pKGe)w?@iOs)1?w8(FdN5lW$+HQpef=`9RWJDvpxzZhDatMMupG={F<0_S z^H`<1wZJwU-c9370|@Xp-9Oh3f44n_^(j6dLgXpq_-;@`zVppmXOU1tZdZ44Ec!=| zAo~HcVMb@61rJ9^(6Jr<1Ch_ENX2}(QLsWl{+kjs&!z0m!9MA%<=*x`X zFc?erngmp1D3t6pv8{qB;jqB$y!Q7LdtI`l%{f9KZHQIwq+Muq8(7o?5!$M4@I7(Y zhPOR;S=0_>O-g#CNcAEl3i|g2zTH@a+Sa)pzHqe!N1LAx_K+$N8hRUMlOHL_-b%po zjm1`Meqbb%cUcesUV$7_b=4~8&uU+;Z`|Ns?<)^5YKUAvFgJ60)zaLk@cc*bSe~?_ zLUB!CGfh)EU~l27D)u+2HLs4|-4tlMPO?K#pYC691RCxH&PamZ4bs17H}37LAo~ZH zK7WP|rmd2pf?cah>f|}GTyW%E_-iwjfvA z!N=@(>dUJ@_J(|^wHX=oxjubM;nv$*EjYrAo%didW-5ibEV3CCnKT5;HYU%0S`WSPUmbT*KefwP;;Q5N`KEZ=uiy{c zl`Nz>&1*P8pT|l!w&-OqLrSeGaB-6D7M4R^`j*qTeo$>J20l0th4FrATZN{A5V_%qXJq_N0sJySlg69Z+SRWe z)9&>ZusKL&e?AAS`qRz@hc@N_#aH)&2@xJ!E@fl%j`sEJRKC_6Y6?4|vHHsAm6m-? zMK686&a|ys^sA7|NXc!Ri*WiJWTx85R^i$>&d|EWoNhDtcXTUd8t<@mmT7D|C<&Qy za#q=jxvdBy-ifc@=>TbCma1?ind;|gbmDT8PVa|?>Ekx6RKuSJg~*(DPw|jKoBKx@URx>dAJib4xmv0 zSXSdWx+n4XjEcsY6fxRXy4NVW)?JfUJN9&Nq)A_WNsi=phsx_7E_Puc3T?xwD$R91 zH|X#Dr5D%w*X}JsU&x~Jx*dyjC22*#HvN!@YRV(xfK?L3T+gC5m+R=uJl$3P=0`@0JC7;_rM^q-(0S`q2{ zyzs?!eoDU$1-X=e1uVq}tn_~aZb>ri(>}JE5@Gr5$il zH;H$u620JdYp(dk_y<{^_}@fPvV8Bpml$aF&HRqs2(tkZ%PFg#xZH0NQPxs!!SIo} z_4gF7k8kpgZuHTb1Q!}1*Nk$eV;w26d>i17-f;!+(pkgDGG3iY=wy9&{LP=%#x-yV zN9_#cJI66L%mWtM43Fu8h=@&kg2BbsC;8P)n;*9@U{4O6wjY z&CLXUXtWkV%O$Pb!qHP+hvtvnz8CLx-q}y8>@86?&ki>i6?w?L3Hf~@v7|tdDCaWr z`#ZS0CK&Q1*vY-FsQ)wNAN}MRLvWX&IZ*1ed(7h22d_>;jJV0JWg=`ScF%#U+BWmm zo5Hu{8BedMOE&Sp{QSVuYl_mJwpT7c2Om0Z7krp5D5@-(4m<@zsX$s=&4SPtwe&eH zo9e9nv3cXhjVorC;nTS!pV`U^W88_~cHmk=46gJ|`zv%4wP4oUfm&hMhai6-z>+ax zvj_0lnb7LW>ZLWAX(|4YGW1jj27K?DUV|7I=g%s$59Llq^w~Zb4zIJ7ko^sx3mqjl z8xn0pw;r>ISZSso>y8>{2cP%T`S=a@NIc^cnOR*1f1m#*dAcKsX8f%=KYjA({!5;SE)V<{fK^BF4V=4rHk}2wlC(fA z-5s*;zwW#<-Jr~XH`HLMYSYRSn;zKhp*m3J8tB-_&=7`obk7d(*3yZ-?%Jsdyi;?| zyYjyG)cug88JG4{eu>WV<8a|vyYyqZ)F#?(L%%7fAMOi?wr6vLy9=wmtb;jc~M<yQ2UrHF5Yxkx1?+`UZY(+(V8|9dpBT@u0JE;T9m!c|yM z`*-NkA=#COJ+jFgXDg0$bsBf`l!z^(_wsbfWEH>|$confIaP>SXOT{6 zogKjG%A?$JC@Rb@G~dmS>h^;dXmAV$9|l8`^3jg}kXdVlU2*W%H*5#`;sm+UIz|7C zx;2DcKai_yzVME71iM}gNhUGXjiEJ=9F*AV>6TfiWdZGJUZ(TwDxDGZgw}9cS zlJ`Wfo3Gf8M3Ue6sAqPmdM4G)i+6=<`D$3~>*^KgGWL_A=s+yg=F`OwS+Zl=!4p@u zdGMqb8FuCs0l=dLg@4O#CwoFDy7~3X;JlkNjTh>!Yx&xqv44u{l2PY44P?tE%SE{o zRsGd4wI!U92mv}rt;ZE#>(F=HmA6)Zl#86#{M~q;{;@?otbNQWaX@C0n&}ftiAt2Y zbLvAX!>80W-jaUhgIP9+%>scRoXzm<@o zjxUn?DI5KDbT%(tYtbR3ufZ(={{2t-g^V0{6+X8Z^(T&3G!}M>Cbvr4sT$01nmIc3 zGpcBRPci0G_Zb=F&}aPbkgvp;4i zT?s#9tD*vx>xz}?cx5f~`W+r<{m{#^c<_O>^+LX2O)+y@+%l3+`yV5!O(f6RkFAw{ z7y31llIW>C3+l0KwJb9*pLXD5S#(0Vo`UR#iP26cR9~@NAP+Bqe2f&VDY8 zDAn7TZ%~r1iS>67>l&BGrg}t1$(%7n^0|w4&OQ}4%b7jR-Qy*KQeSN%7Lw0hxQA?# zO(v%z@X{Y*jE7cPWe@01-1__-Vh)&WCcVS4tkosqW-9$}NPsj-@uIj-`hyyFRVm%7 z`*mLfpn+hsliAzFL-k~u+D9~#uu@=Z4%EqvW71<&<90bc->Dwx?u#*QtC|n#{ zgh^wmNQf@IG;GL+YH|8;THBlFSIb8fq;sE(b6=8gb(E#`uvr(V#h|#O>6FSxO)H5J zdKvGx^tSJllG*{}=-k~W+YlVA@_Lw3Gik9--mC0RP_un>;b6BCusOj_tP0P28@zWl zarLQOW3?OWvi))R0p(93GyaHcub6PA{5SJU%XaSI@yEZgMd<@CKthIZ8wr*d)+{v_$d%0Gop`DQ}G#58Q-@7mz zz1@O|?aKxPl@THg)Ksb?Y{cCI7MoM9Y6A~;0~TM}#|J)e5oy?N25Ptha4WO28D~aV z*2)+N4sv(~V_0nwj)i=@Pu*%OcaI&EU3S~z5bmV_gewVX_xt5nom1WN2l*5}NtKi! zvQCwm^oJ$!yV}R_P5!NNi3>m18HG5E3vC=N`imD19T)+OmChWB9|)2wiM7~(|S=`D0xu|4YUi?*Ws#O1_GtP~B8=g1U9)j@ed$uu( z(4`%Sx{h0ED9IHQ>y)@x&jX8m&q2*ra&AL8h`$D|B}#I!pB(lJEo#Dw`+!L^ZCiJv z1!;IJfWIYB2J^fqusp^zerIQKMVwu6L>(1Ptv$ZHD&ga7Ae7O!V$BP07{%*WOFAf^`uvHK;_;^Kj=U*y4ptVp zGM4ddW!xq#vHu=l;&a)k)<=0x;w(}*DTbw!&Br5~4n46Au!Qs9(VB=49@gliYbBE= z_xwc)Plb5SI-RAac@H{*h9gq7xMYJ)Q9<~u-yLW}{9@lZ<}fdxrAG+#k0>_@3cr@o zxEJ8swXpP3?#xlkD!1L&O*{S%M)FKBn{HeBoG#68V&45*`?pVZsL;IMRu|TrUoQls zqsS1gaH)IGov+%nwtf}a=v^%uck{l|hwo*lr6~h@hGWZ^1Oz+*FkG8|8$_3XqLM+; znv3#Z>o+vs|I9KQy)>#$$`=V++3Zhc)i+ zTdAMaunNvURGDA}9xEf`8~xYkgY6RQK&tcI=GthCEcdN}P#XlVSQjPqwa59@`l!Xi%;_{D%z!DcjMy7lQ%Rs$R12vM<=ZfQd{1+Sr|uLe5@fcEfC|-W(U0q{D7h5N38$NU=usA1k zzBJ|uf2OYx*#XRdjg-9mnAw^uOVOq03t+&qjb_SqUX9%iGM9p?RO2>JeO*=K@mqOM zIhKe@w})a05IUp!xWa3VcUwdD@Ri~ z-Z;$u4`E)3DDC9jiCq}MkK15-FOkmKoxY>7hFu^MFwIB{)d(RK?IbuCoJt=wv7DrU z7Yg-sKYe!k7LWhv(rKqo-1b1u>^ycYEEJM6&!1Ye!*^V8RJ;MIQtCUnQ%PBLxZ>gVSNx)09zp|C&h9!bfOfV`}y z3${5AmOudv|L*CBH#J(|M0NWnV@VcS8V340zTvXt@kW+@)0hRq)w|Rd+nQm82ja!y z%bz&oJ%+gbZf>Nut$8h>^Dl;)Y`i6ff18qD=V*kz6LODFQO3tsN$$7L z`K%<#4r(#f#O!8R3FhhkY2dmwhOwlF`hYbwA1XF_sUYu5%)ZXv;Te`w6zCbaF-5&1 zMyL1sHI9;gD_P&maU1kk-5+!6a}sEr?%U5YQg*X!^nGz2K9m3D+2N-vC(&- zmf1j4oJk?{%$~5gqfvGA^d9b=)LLhVfGbsqW7&o$yT=)Nm8OxSONo?i#u`mQC9Y%> zT$c70Ct&K^aswY5gHG~518OYTy>IjaT!L&LK` z!LdKZ7cyFewpjzVBfR-b`3W8+L-001!Vi|ytre2T1F)HHuw?OXHpY~_#RCKp_C!VXyA`f!Km0;JQU^*+_UHM)NX8Xcfdo z&fOe#c`gw#N3hS>6g;%U7H9(Y_ekJdBc-1JEKmE2Rw7r7x&YgdVYiz@76ziaf9oX#c<$< z(-LC;76%wqv^j*6qIVxdH)sxw#i6$^Y#Nl(K$#+4^4nc-KX8h9-wciGg-R*8JJ7RK zBVZ=jvDFq5XGaP2xl{~IO8b>vD$~)jMe9;|(2s1hyxsgybH?H2njDX>6ou`p0)i5u zHq7nQjW-t@vvA#i9sGC4GHbFI=e^tU*SiK~B*{73UYBcpy&OXI;JjrNXZ{1PZ_IPM z_9j_pvtN&Z%ujDAYge9@V?1dfMAob23ZSiX+}q`bLNxkVHU0*b$9BFC;>{Bk3nf1w zGk6APNZ&FmXEf-)(8qv2$8ZFJ?66-_%)JvVr|INpv|~!nndID-GNZ?!i_tSy+g_#` z37EL$o@wMu6!Inl?J;*~KT!gg?zv~WQ2?A^Eh(7k0;wa2)|ehjxuMk|(d_mD zS*_j^uFfBCn5=Uu#1HT(hCcb{2`el|rhANB0B>Y-b%T9h_6~W7b?$inQ|C*Uvo$Q@ zBv_%H;;e|RK9%=ZNiqkf82fFfPUj9D)UnKKo*viGS;4(Pidojst7~pmX6;^}E zmAX4k_bB?w@bp6bgd2j`SQDtHHdKGtp=Z1hDwkwGtCc%O@azFvd5=wBEUg@7uo373 zR|9*F{AMn+*`SpaI^?+L=>8<>N?7U^$lrjvcbe5d1UqQ`B_~6dtb5Q&3|w80HlaQg zmo-!k{omrS8{_*L!_TKl;@=Q*$)V+|*YIdUp&^_QLD^j4HbvkpDWUQ39CANhS3<>B z>tfWc^fz|y^`UYZ_y*%!5*i3N;J*3Qg*-F0B#UXCxg#@-G+#`T(Ik?c^aZM^B!4~m zroxfzHNkuJ!Ku0LEXXb!u(33~>b+N8PP1W-v@Ud&8VQPVaa8jwP{7?*u?+*iJ+blOp? ztr+NcFygW;c)^k#i z6zaQt`2N_0<%beg0n@@|Wu-e?N3EPpd|OrOuNKpiZd;B%mE`)QTs(r&?XVdT3rRJF z*F)g^*lk)3;MWlFJD43*#=Ic(P+Bjnuv5S&FW2_skgmM+gMWMC;Sb!+^(U#`{~uwZ z8-f2jOcWXYf1d#Qf1oP<=b--;)%x!wRsLs8|1+lG2>fSC{ns?0qWb@4zy1$gQCE`k Z0VpF^nicY1Jn7#H)zvi8s8NGO|1YEpbw>aI literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/hanging.png.import b/themes_src/space_pixel/alien_animation/hanging.png.import new file mode 100644 index 0000000..f165c44 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/hanging.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cits6fnmep15l" +path="res://.godot/imported/hanging.png-7dfda3ec8542983e994b5d4381735623.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/hanging.png" +dest_files=["res://.godot/imported/hanging.png-7dfda3ec8542983e994b5d4381735623.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/idle.png b/themes_src/space_pixel/alien_animation/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..b117916d4b130f2676194c36d993e723659187ab GIT binary patch literal 38795 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 KsO+3e)c*l9FrZBU literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/landing.png.import b/themes_src/space_pixel/alien_animation/landing.png.import new file mode 100644 index 0000000..2231cd7 --- /dev/null +++ b/themes_src/space_pixel/alien_animation/landing.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyliudhc26gpe" +path="res://.godot/imported/landing.png-d2abf5c630b4e044189d396a7c2dfd35.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/landing.png" +dest_files=["res://.godot/imported/landing.png-d2abf5c630b4e044189d396a7c2dfd35.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/sitting.png b/themes_src/space_pixel/alien_animation/sitting.png new file mode 100644 index 0000000000000000000000000000000000000000..777c472ad1f4a4c80c6617871ed4a702d9df3c31 GIT binary patch literal 91909 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 literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien3.png.import b/themes_src/space_pixel/alien3.png.import new file mode 100644 index 0000000..af5e155 --- /dev/null +++ b/themes_src/space_pixel/alien3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ku57ocnar7rc" +path="res://.godot/imported/alien3.png-d843e0127bc1cc8e3bb908ecf4670a65.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien3.png" +dest_files=["res://.godot/imported/alien3.png-d843e0127bc1cc8e3bb908ecf4670a65.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/action.png b/themes_src/space_pixel/alien_animation/action.png new file mode 100644 index 0000000000000000000000000000000000000000..657fa0a4670eb1eab38d4b8f6fa68a3fe2063461 GIT binary patch literal 19253 zcmafb2UHX5*7g8WlqS-pDIN>b6#;3XiVaagibxX`P^xqSNhk_ZcQ0%GuH_<5X5O;*v-i7aKMy{;e$9~cz~KV`0B~NqsDBdx z_R&8w0BkJuAF{{y{YC$=-{YdC7XYyH?)+r{-X#kGz~$LX`Z}im$+%i*p$qXAwvrGq z0`)m=UH>H+q5oONgzp7M#i1D4E3ofj5(6wE9HtW%uzgl#>3>6XpX|TdCZT8awf=g+ zyL~cOzQo*fn9QNnk43yk4p`+I3NoJ%TmX(AgPoTOP6s#h4TQU@GP2hBcn7yu{3QFnU#UfG9RsfMct-wyqdVahfOxwGABnBCM0RGs1t}%F7B|m_P-d`EmADuEA7P z(1p%h|2-6aV%$88r~ct^L1)c|8DP_9YWL);*7sXhRuY_ntBO z@ch>f=<~z1%+w^Po@HmlPuDD3@Hj#Kcc1VzK%4LJZJC_!3fcTo2;Y$3+yBqSpX3IX z{#s)i+4nEw{Oem|ap0nyN8lbC`Nn|22n^%jS=Vu?p8aoI(2e|^2~cr)ap`XfFeU?w*F!@vFWuO+0#e=e9!IaM_6r9;w)FaC%=n!w?u z?JM@b)_{1j)Q3mPO&`N7J-g{q}JEKCPxmPl|}e#Lv8AgRwXgr_Qjev?*GIV zbsXM2U(y}I{SWH@(-`z%c)`seG#tba=D0R(dWqgLk-he;rJ*TH#!4UlA@a_HX2DEV zuSo~(y1yii#R?=DOEmYuSNU6rz)j1IoEU=Ah*Pkvh2Ue|tu+3G*|&4jXJ=&I_-MxA z$;V#sd~R44`byYi8{3Qk@7=AfIOm=dl+On6rPu9AEN46m(s&bQEnYQSekBLwiox)` zNAAO$b4&R5a244ljbY3IBH8=Wr}UYv)k_1kO>#BUI9M5}p{Eb);&2wv$ekcRuC5S8 z<(};4;e5yVpLyW7MX=7kW?UKX&J=u2vu5n#2 zPfME5#Id-t|L*{43V?@^mR9=bqDyd6F_uiWkseBr&L{HOfC z-%lxpzTLwLDG&PQqVnetmPfbrJ~`?#w0Li8sd;6r&#A-7GFMHUOG-kdPNxRZz4cS$ z@VSm6O0xOD7OxOu&tSfq?w~diyEN#}ZCh}4WAXvVD>3S#!?@uD>Z_!|?YZ&Gn6jY@ z-vXLsi0-#jpW5J|=zjHC%g1{S#sxSXZZXv5n|r6w8-_A3%VY8QIx4}NkR|yz9+yMu z@qk?nD7Y2it@qZ?#jr9+?dprI{K^Wi*vf; z`pr5NhNX~qkL^w|Af9j-aE?E*|D}_LFN&chbNM9v;+bCSI6=`PYATQxDA97su56bw zwX6Tn!L$oVanrx8(e8cq2Os8g1=Q=?mUi^U%^Z1S^zy`Eor9n|zSb7$Sn@V?sGpM~ z<2zf=b@xLF+)KZFPB8p$dU5BjKHji#s&n0FW9X(Xi4f4`|3hOxJIsaGHcRV9&g$-SEM}Oj5*a&;wnozTNCr};O5(Fo=1#td|GSWUwLwm zn4o8dtfXGP5AzXoKfYbVhzYfed#IH};mSWeu}FuVA8Ua4+V<(V2Yp*;?b z^3Yld#_P;_D;+uaY$F-t<#K+RK3{#@k*UkeAZ6|IYg99HU-aI`>RbwL@GV6SdaEU1 zV0otcVuB6{?GY6L>y|spe@|%h6WTzst}m%()TyS>YYz;4xbXALlBVZS#HqfLPl7MA z1B8<@6-_wrQ4B1B%;ZD5&cJl}U;;g< z-I83xBqNI{1 z@3q@eQOjFgX9u{@amrP5O4mqE^|6Eyo_kCQ5V3Hn>qeiY+$B+=A~^J5}{s+niwE z*;$Vma$uu(T&RWfna86hazZwZ=8dINesTEgSvMLfdq99*8_LyThlQ9QAN%<9!q~j< zWZv`d!*P|T^T%j&dDq2G=3FLwr60Um%8k>)6KLc))s4c)AYx%l_?gJV zPfU4LDjF=}PY&=M#Gg4fHyEfgL5yxOkbGRP1$}jq8f2>9F0A&{+K4}4iIk|5iYoHb z@T?KXRp&!mx&M!I)d$E&fdx^+kma)J*&(QC56>|jA6MO5O^;Y^>G@AGsHd7GX{^*f zriI`|4qNhpKM6FLdb2er8uoW&o>f$&1ldku46Mnj{yRc$4({tg!1#d=B`zU}#7C}}>aTUnTPg1SNX)h~w?znB2V3VO znl(@5<5f(L?wCcAaS}t#2qPf)?r8o{BUmL%K8Pq?&5eCpm{@WfKHFh1 zHEf?B@vQT$BO(t|osVXz%0Mlul0;~IN`(5fM>d0=OJ}-JRwNagCTBX7xEYc1`|$C; z1fHf5$SY4{JzXox27lJ=11_j6dmL0rCCnRCJt1bkzHt3;Slsk=`=3JxOAVl;rfQL} zoMq5vVAjhw#^~(R_`yJ2FKExRJ*r?7o`Y}?S6Vs9=9I*<#G2o0yZtg!qsiO0*gK<6 zwtAUHQ{xFZsocp=HEeQWnLR7gY0g3OKT=qBaV@D6b%kV1;cPErq3)-7-v*meQmFzX zCiC0@oA}GzE3htRs&xObI*a-W8HHj%2r-|I9WykTGLA~gJgVQg>X#CV_xN~k?2|}s zVcWCou4^xA?|wk@C#_|0VTMKZ`_3N)PkNEsi!R1HGUy*$LDXNU=CDIKWzmk!;@#+9 zlrAD$#s9h!@3?Oc@=E0{lXVx|8%MPGFi?E;Q5xs_GQjR!Wejbk3qIk#RjmsSICTAr zKv2`!N$%TL-{Nea%rcbVYiPW1V}>C=D{%ja1Um>igDHJ*Z)!0Nynlx`Pgc3modMx$ zqVuge+{Mj-tsTy$`2}_Ts{GLt1%|<=&xV(?7Ad=?spE=8+H#_L@WzoX5GB3!QCq<( z39V}0i!9oX8xqWbHwEPBwu%V3IJc_FN9dObd89wpHlS_3Az@AIcOf71Z9P{Up*J2e znJ$)dAHqmBu-Z(kAh-`Iat|qT4S3d2v*0J`S77k1_(3=9tJT-R>KpdkAe$d80sejTS8_ES|dXg{l{0u_W+ z2K@+z5d_Wp7u`G95&~WfD5w?hmiW-ZIA1{1BKWs_>LfxFoRhs&gGb`DWocONn#8sU-{GP_Lc^&IN))abjm- zHE1jbejiiA!dmD>lE%tBg^96o^N1V;yh|hRgwW`?ns|reZOKP6ph@8{kWAXw~>9W3WI|R z+D5BT&>l6I(3KAf`Ih%DN+p9W?n6DW(R%8gQFfUOp|O{tFFWO^L(&spL>|a3C3p3;b3v`S&=} z5$~%YDm4?ekNT>dlL^t;MZhDSaT3((957H7zD>rLb?WvJtSKGgr`{U(t`G&zt)|{G zL_3~>nCS-$^Q`mT+255Y7~O&rOh_E?h093F7kh2fd=kVDMbk!HYJ(gH2}6_84^D|F zzy6leU~w_?KtFqaFMI(4@5d4oC6A0P5+NDc{3SMUKib`wgYnal>%k(7hq5|5#i-op z@}jxJlQ`i_B{pDJX*I2OW$Hb86HzF*PanKC5BZwLOwF*>Wf3CHI)kgi2m&^MdJ+a^ z5mt$)11M1TuI*DG<{S9%;IcgwVy6ODjMSU+tD_^^&f@H$`H|nMwiNUAqKVIh!wnZG z!*Va<6+gM$=|8Dk3Kr|(M=N!FrOI~@m3o+5Fi(O8@@(KE9V@Vx(r2KxXCl@_9QUZbWFZSA~Rxsq+0v>1kRS%KY&!iJb>o;M_d_l*>!TsoU zYOV*2Dp9Xc=r)g^$98YT>)35{bkQaQoWYTP`0+XH2BrL=Ry_{4O~s;)0`lAjBI2cr zo7@p4B)z_$pH)^k?NR>hcn&Gw#f*u^F)Wo0HAjRZM4lQxa+fM-OF;>~ZMbt<5?My& zipb;>FFNgsMmn=Glo-ON<@Kkk_1<@~Yh6wl9eGKpzH1Vr4c$yL__(6QV?l#hoDL+?&h z@MvP;Qv0H~7qkSX<7JHu&aT!0V_8?htlrOuEYTF zBN;S3zfD0h3U2~8F!UH{Czef+(nUzfLC+C;&(ACB2--+5{5Clr1g+t7sWinlhycZ# zYL3|^qu>lcnwEW=TPC~rKp(Z%;7Oh9{E>buc}nR6K4i({w~uj3t-?}GzSo8w52K@q z+$^)#nV7)p*ppHwT9CUpWSx+-f^9=t-L1^dxishgiP#a4CvN~k`H>9zrOs$BoN?^} zANgu(O=od4t$Ck|KSOLRNiRJQPM^0A*aV+z2Gs;5&*X43oDI_!X%L_kgL6S!5Up0>ap*5A6FoRAP4dFrjl}7_8px)YS zu0d?U9TU4Axj+neex2&1VwSRiFE&l!ZdC|9aank>>~_Zbpg@S)!%tK#!>JA>QE9VW zN~6b;WN)Gk>h%KtMoSuJ73|2JMKq42IfQq{!mb8`g((6ePKh)$?t_8DONp|v`0Te- z-HN(i$!QZ^-6@B_CdI=jD4qlS^XF(`lAGP|bDC@)q1OD(C(i79 z-%B!1Vg4(d7I>tk+xYmt(EW@vo!B&{JD^`UDBKxLrJuV!wlq}dc1|)j9c5dsM4^?p zaMO2&$hqYDt{CUAz&)tOKegZN(z^Yk^|~(CtWr#Qst+`0^P8rgJ}qB(@bicDjjyE} zID4CZdP9)%7Dt@+;83Z_!W|;T6t|Mn?)PVE`eDyRfDGiEY3_9ib~IIr3~imC4M8=L z$c;m?zHwk^*cr2=1JXmImCUb zB}Bgg`FY3Y*(R3TAHkCmji|%WkO`sg-n$1r-703l_pV`?=U&qudCegwQO?^VJ#^0n zQ<3zJ)4>FCG!`^5C_D0p^7D_F#-%MP!RGYfg zhV3|f6bbsV3!jv;;cb#yu((@L$lb+`;?-eW#YveCVaXbeDIaYxw)45U%xVA5y6V=< z=eBa85Q#FPLG$zb_k}n8a@tGH)wgc&Y-cmuj2SlEy_b2iq6}@?E`r*|us**;uy1P_PqB?^8%*rq2tM&6PsITrD(7zJ2p3 zuYNb=J20P0n;lv~o}l_r@dBi?e1#&UEB-_RayFCdXAY`Zy3^?IKcF)jmcPAE%g3%8 zk9sJN>xS9V`#wedegj6(lxH_F5OevDWe-BN9y$*?S}DzCnWfZvl(3*>(4)4Z2g*Kv z1X}`qDM#@iQyQfq1#cLt5;k!X_4efD(Y1K{8hFkIakQ?^`bA%$zd|eRU@?S6P+^`j zxm9ifzM1JQZ;dxGW3_8~y1z$Y(C1yVA1~X(cv?I&mCArcuh2aGfvt*KH|}5^_hf*wF>jcq4j?>lGG>T@Wuno0!&dMH6)BY3$Ge~M*Tld8$of(DS5 zxU>`0@4&)q+UPnchH>vzW25K&9+Y6*>Z3j$5A%V(Zt#BcGNem!;0%r^&!oK+^22=$ z^@V7t*Oh;c*Qr-BH{Md7Vmn|F8!BrcVq*`!kAHKcwp9yijCCMvJDpma*7T1b@*{@# zfDM;(F%0|3$r&1rA$lO!fGCc&+|r@~iD5*d<5h4tIdu z-ksy953~gLgCnu#8PW;!cxb_ZGHX6H zjXw}*|FT#aEJB6+66KRa^4!iu4fs$#y21?=m(au)nZz6}?h<>pgUX$XRCC#NL*2vv zqTI{oU+HJ`g1qmD8YP}UuRS4&i$pkS>uo)jKRflKOKncTw^JQbR!HP*WJ}u9fN?9CK|>?lZ&O}k%Yi!`j-)_{eAXJNniSKMkbsW zh1M_jD*zW`5E>UJhSQm9Iwn)}Ye5kA!OII`tY3$z!zVe#V?<*g3Zafmg5NlrrOy^b z5RZ+^YaKl8C(foB_9`DrRP$^*r!X z5tyhm8{7d1rKo0m`G0PT{%TQebfu{`KlPC=&4G80+05U5Bubh3>BF*lS?pSO-y0R( zDtwjZm>9>Wqd&;H?^djR3!ZwO?6jxW3bmy8axF4n0QE`z%CsvTMgkYLsGFjG7|$&* zjgEn0jf23D3BAQYFMAqT2rL_P%2mi(`+R}JVJ!jT`~y)U-@Iyv)QmUfC@;vL;fK$A zPAYOkZ--sy)G!14G8j~Rut2-gl^nP$W}(R40Q4pimkf1pxKgZrWWogEag zBMTM2l*UwsGO~O^`}v0&iSDii>bpbheIi*Zbs}r4w|oYCyKm|R-PR5kdM{+5MK|;t zw?+lT2YTbWIG1FuOnKBsAPbRlI@`-UPeSopQXF3&(G zu*>wFmbtjyh%+fnrF!TsTk!QPMb-WY) zFE)1jAR^(SrI#ebrVlk1aoZlgntd z!a1p|oIHO%Qu!akG){mE9f2j7}j!Zs#w z+46@_gkk92&n*uR1~zJecL!`Z7Yl{!u|6nO{oK7J7C~x}k|L zf}a&nBtO(Oyz-cNj*v*Q;va+k!5-aLQ|EwW9n%ZU;N9&f{9!9nM<;p?mhQJrYVi>| zJJFR{K1i_9&J-6+nfvPhykHL^wZqtt32;ACWQ&)Mj=a8o{^kYWnlDpV^rucoAK1Q= z&>!6*U)m2;vHkDLA&?PHz)5K~JW`a0PP?wHuP-@ao<_ER6N;x()Zt3Xo2#Ix-*C;D0|{^)Qjgd;kA3XK=?Y zwn(>C-VBQ{0jPhdf%B+(wMU~&!$x%o&#;uFc~r}}CtJZ*uq=bf&lz1M4Qy(x|GWA$ z4W=>qHXtbPDeW0bUJ|9KgfK7=7PaD>r?=R-tOA~;ES9Ydq7&~Z-YH$W(0P0h(|_v* z;yQcc8_jCFa@@8kaz>bRbj4YHxSPtVwKteo6DZiux+h&F4)~|lrk%0xIpU^9b!v68 zO}p|%0wvQN`thiY>u}EGpUC9Ba^C#eW65yJYhj(qz2A|kh zeey2VWJ!G4tX7=a=gYN+`GN!h#Z}FlS&v5TyWXl`K6iiG7Z9Mj9D7z-D>mvyq0k;A z_5@IWky2M%P)dAty+Wt*v0!%S8;d~&u5X!;pKgFP9pL#^K=UR$4yN$m%(oByHn`c zF(DBHgdyk{goD%6b~>mnGy_l78N zM48orCqY;rK`BnuG@bXBF|_PjRf@6ydTOk7k6=D2&*-lj)8-#wQ6Q_^qa9pgo!MZv z*Ghzetd{8PyQ&gg329Oj<%+IMWubd0HadVe!u#JDL}$AoaC>AudU7q}^X*g=Cw+P+ zzWv<=u-;p!_2wa4*el7$-W6{ww>b6&w-v|ulIIlb>iS;0;s#!J9r@O=XB7WSWcRlH zDiho8zqZU@5)2lg2>5=ZLx#BcO^15OzjZ?WnHad>Mb#?2F*^W*>s=459ru z0C3saTo^(H{`#KuqgV2AlLwE;97_p&=Uc>I41j3;Fvo^D8c#Z}Ot7(cNk990VBiZg z-~o84!`I)HFCy_sF}0XEteX?K^B8a`n?dwEVqJq`sAOP~!r}zEfyOa1-16@?^>jM7 zJG4FnfaH`C2#5b zS-2g12*7bgGXm0BuLYAA9 zs3M5DogFdPaL)GrB*I)*Z3Sa675fu9^0PU-8+m6)p=?NO;doVI*dlDW;EEWyE2dM{ z{!g>~3?~GZr&jg`47rO8+(54DNq%{NWbzFbaYFI#8VP4;o!KN>ukupFNC5LI_;oXb z#$nO=-f6F!uithBYhldp{7SFoGw2I!B-dCeE8JSd7J1cH7ET#ezs_~pRwr1d)ak9? z)>Pf~v0GujbT|_m6AnJ~I;q6`@~imhmImt{3Ox+pra)9ZV=L-VLVcUE%#D^;d$_E!*`w@jzJ)DY}_%-FN6okVKF zckv$$%c_i+N8|G&-75>E+!@NCSW3B||HK{0Ny&~PHKt;3;<}kSWi-0sJMDe0ALDM= zlrz!Yr*N4Xr!*oZ!36s;3Vj_Iyv*ed&PuLvTp8ik+&Jq~5QYDVn|MrV?>O9?$E|gj z_1LbJ2hY&)-S8><{VnoinSD7(v|nd8*@dU_?wyoijF&OFt|Y=4eF`^`FZuX*`2)y8&3SZ@J!Tfm`B3_=96P4&3@X!3 zM0jfe2&OjzwXD2xLpVag?d_2pDNTVe^QB_U*D%S)4O3K6G5o6s(nFKb`yPMgYz{2H z{G#IDR}@sMmJXMc#9OT-TZjLKeW&n)*n*LFT)A9hy-$u6IwN0=AKu5Mm_{O@?>9Rp^TnQ0e27?Jy5jZ$mB-0ua$Yau5j>2zr7 zbIlc##`*E7O0%gp+`ZAB<;UCJZ?X%s!yK4i?B|`(2y4eRw%?1xcz{&rjIyt-D?K0bfv`Tjiu>FpKXhg3kE%{=*V}RQBzYvpMLVUE z8>3m>crzQRXjRcCS_R(Hhh5UA)w^84>24c!kBZf)D5rdEsC@LxF^6u2dF=6yFUS|_ zA-kwvPVX(4!E}lpm1QHmDEm?tv7K70bxcyCbi#(t8AUIR+e(zc8v|*ly$VJ(W=(C? zWe=47qsWT`Ou}LZ63*uNK7JNSNsqj9QZn&b%h6my-9rOxP2_NmpWkREthf$!N@yfF zwSQE*Bl`msLX!RyO$>;JW>rL?iTVw7fBQFHUvr?+DX8v-jy@&s8o2U^L=`@y%Y4?> zd)!66p8h(#>+VfwfN5Qeja!u2NSO9Mmg>XWx&1_{yUrClCiT;Z%g*N=SGpUGlEGA8 zVyEtK_Xi~H&@y7A`xd!oWWfDAXSGLL7y%B&Qv)@#+BSOX-0WD5l+#0^lJuvTs=ZTW zcav$So9|ENByEY;hTN^oK!E@qIQvIsCz#-t=QUIjtK(R)`i80jX$v)knzgXZs1=2x zph7vGT@AD8NqLvUtv2-4AeSjNYaO}qK|DXnnW_5ir|0{2{gw$JLYdgYlswA6@Ox1n zTG^O_1H~fPS-bleq_!iLtKq*`YQ9oGu-iEP2kMyUu~~|At^ckRjk$&njGG_-;o7z> zVsqh~2PxY`v?b!yz`{~7gUr6&bbkY=@1TcRR9Ef8$G;{htGw#2ew|W_S8nMJl|O_i z)K-Z*p{yIO810uh9|B7WL?pU2L2ooI~f_>@(b_48B7N&lMRvpF7L zC3rDW&r~rw2AEY(0k1J{nLbMAoJSOycgnM{dc;TG!e$j~ z<*$)SDhHEX9()dtL7hUw6Zyw|Fgoul3SeuWTOPPCRV>_BAVEF<9oh%D?5+jn`C&yr ztLskyKut5E>0z7$UkZ5ho?r zq`SV0s6FtEBfx~&-aKIX01>>G+B#J5Kn-pq>PDC0b&;cK>bsaO^j;dtlI1#bDoyG@ z!-$QWLeKrjaRg6$<=*>Nh6*>0A6B1fV%T8xgpDQy2W3IpWj^ZZs16AKF}VX?!qpSV zFy8>GMY#zq*X&B~!w5yiWw$x`T}nc-M?%wbhPYCy9!3`>>Tz92E)jn?vMTlf$roZJ z`WyK5zX~D2R`jyZ^WnN z?5pRD%hhMNDgVbi-8bpFI`tW;-rAW@y{Q{7@z}dBCq2g}V;$qz<=cmbJr|{BC+}-^ z*lARyT|m{eH|H%@#k&#(8~+@3=Xc7Z!YAqnSlgiHZTn+PP_fVldSno zOG7ES3d81P-#iOz*k$=*%=pvVg7VF(#nmS89@`&)?bM&^*&$avKK6uF%jAi?3@qkoa*{v?vq&1JH-b<;cjbo#_iP~z4xJ&(+P?mYMV90H%3(v+m`ChvYZhG zpVjJSDtJ3X2(}AxoI9tnHf8_=Xd8-Y52W6RcYgW#z+`Sxa((mYn5Vg?3|oKDufn{# z@kYI*!}G)MtLv0{$@|N|YMISyNB;3JPGeOl{Fo%XzffFlkY-4NS?ben>(@z1Vh<&t z*ae_MorxlATDb`K?)MQSbPb=o8RjbC$YeWlJby#rC_N8g=7^*vnX9#}0I7!JX| zTIUYJb~d*TiaJs6L*Xc~$$|-0M^;um%nK;Z*-9ToJNO1B*DsgBOF20Yi57Mw5pGLh zR7pF9Mg5mzq8^|&1~jjt-ZS8J6;(?aYOOll--y(4@ehU_vxvi{+MLr$Hf+5CN_)+a zG7^a|tny)QfDoo?I@}Zxpx($WuI43D?i_kb$R#YRNZw|7o*yS@l&rboW2+(4?me+ zXR;j5QXm0pFcqD>4Hrznmoa@l>zD5eHGfkeXG2VMQJ3(ADYQCEKua>9I8Zj5_}Mkf z_lU1(n)1q~?`_&YmaIQC8UFTse>qfin*Z}6hp5ZYae}KsO?XTY{79VAM6sx zu$x8rUVoaew!+F# zwszLY1_n`87NXI-@1|!>scafsEuzb_UlEmChMRSTT7&Z$ObU{b3 zA9sE!5Gb6|18y$?aqXa(7iIA}o19IqEv8p;t$C#Seu~(E>nBp3@QdJG%@rfxgDD!; zH157IWED;KhV>}aTSX6XL9EhmU$qAscgPPM*G-jxCAY~Bq0wwb&u<#*F`Zz zdkM%8kv{@)L$44}JWILe9A|f4-GLU3eRc(=c14N}T@1;u56R5{;>i=hWe8heQ%R7EQw2+oV0oE>LXH4HySWE#?t6CgMf*nzPesmM+5yW}9Mwm)(BCrPO z>eDiq8H2VW!bjnt=u?Jt&7H-`NRtl(PWen*y<&xAh3wM5Z~Yj=GlRRVC`MASdM8+CesM)o+Lpx{5OCW8-$Z2o8K9 zxptdf)#Y|)1CjU=E}?ZO`tm>d=^i&w(#POEJKACUB=qi~R2l|-+|aQTDwbhMMzV~E za~W(X)zWHx<85y(-LXoj_z?)53`Aj1UOkpJgENp^^TaGS5rSn-%^nVn3OLtz=@!kA zXItXv2*$NDkt%eUa+K+PFAiQ9^t#r}rNxi~NIB(FkIbMe)pq>;yppBfl(o=N(;4l; zK~Q479?Dd4_!m65-Gi>PbgsQ!bEWm@%BLpEa1tliSl5GDxCf3qe6=~1u*mgHp6qGU zp|KK6T$z?!0|#mYdqlrP=$$aYCg-_7YZ1v7YbmS#7I-grWm)<9H3`9#AE`L_70=;; zb+Vw@T$h-E1RhsGvsvjvzl`R83tji%pRg#0(bSdZm%>@-UC zchc|n+s|fNn+^4`S7xoF5xVE{#azvM?FfMz(G|QW`xrXu~ z;3<4D<1%`OPe}dnHS=3OL7Zl^r01l?S+5+V#OORjYI{@0z&mx^?32(aE#qo6EdK3d ziN)vb)EqNe+ROQcxRD2QZ)343g_7=F+Yo_dxUm6v4%5fpwY~b+03uv*QbY%O8KyDt%V=$Ct#~=>I(q3i!44mXLA^PX zs@BdbuMDr?YeEg*h@O0^;tIo8xChx0KVyF+>h;2>85fH-9GZTBj~bo@RL7o&30@l$ zpkfaxjg*Mn+G^Q5j}5JpTzLY%Ezjn*74@apOFIr|PhMgtI}bU&YxFHUA10kKyWN|y zfHFSj*O?4424OiV2XL4{T5yUyNeq^E7zu{^TXxiz^E5!wCK$5 zwJ*(GvyMAST)i~J`OZgv zp@;9^$vQ1skH%@JB=OFLASB9CArkIE0TIwfr z6ZawU-$c=&=>W{Vto2Syb5=ELJ+MVrjp_Og{Z5|hWI@2fjCJLuEc|QxD$GmSo9140 zV8iCw9bH956byOYHWmtIgb)X)D2=P*Gn(~Ua(7&{TZO$v=96qBk|&%b+zOw3q&7V; zF)podf48YcKCj%$7375GZ6j<{|7_h)eXLqQBnWynPf|)ts8FK=^7;Y!`Jfli_E}8F zX1ubU4^yYu4%UXg-Bx4uXcVnKIYhp2W9&*atoG|u#;ux(L!+B_AUp-AFRLg_+p#pE z+LK{QE9y(Bwe3ouaIiF`D|gOnN|csRira)KA8*adFXPAFybjdNC>P{2rP2~MMUj|A zy6A`QfVVy}jGYtgyP9?@w|wQz z{EDEmslz+#^GF59)yTn~pI?V@1=Od`_;cdl`ZVuaN-VE{g9Hb3S2YtuIzPL%|8pHz z`biWE^K;)u$DqmoG|Nh2sXqbLZmzKqk0ry_%8#w%MCXZ@pt=6?vy*TCc8i%rdByR+ z#zX7~Zzv?}g;Iwog0|y>&I^6NR1tNvQLbK{qM^qK%hy`+4SMlX zTy_DP3P}mYzO8}Yz1z91Jl;WC{%OM6=e9#XOrt6~@8sDudUliFi{aIMIeOQsTUV`$ z@mx=0xYN2CW)u4HFR!?sMrTV+(A&;}z#52%a7`(LzdfUw9`buyvz=*errM(G<{M!e zL-t;5KVHJYxKZp#afl)M+Q`R<&9&#T<6aeyZZz4Jiw`HsdQFOU~Cv}{&R569em_0 zS|5?W(!Z+k3Tx>r>cauKhks;Jppu7K7wNUXK-_Tp_+jjHO{kX}35HH5j z-^w%4X=PkHCbo8vjb-}SjvCN|c>}d8Z{(oh#5&p`&XbW)p|VvwYY8& ztuNNt@vH?>HZ3?{8uWP)UMh~6wV<-}+HB7&{0v(@Rz_VNqf~B!A+F_j7hR#X7dG(z zz?^mq$43`xwCv)}bU?bp#|WaD#INMl>2C412;|~*i0v-etIz8eh+qs*7y}K4Pu9 zc_>OF^~{L5UT=UOM^jxl@YO_6D2EH@28wg6NgWNYy1ugsL|o@HpuXTdVsxGCAh{Mc z**FfAg$G7)`XgaWt5}Y>Ok-K|x4}W94|P9U*SPqzx!4691$O=i5#YHKTm9ToYT7suK*}KxoTvh!U5m z$I951J4Xn328Oglo&7i1{~1zEx115E9tQ}nOXcwlkZ`7fA8Nqy#3xGlsuq@&QG0og z*|bfvZJAwtrE+O(}J>&ojf;6j9)89Q;pE|np@77iY90kLSV z^i=kfc9*1XN#Qc)p?;*Ahc$AxJY^7<#U5dbI!}P4a_1+4ypAn5Fz@)gFXbJ1jgMhi z_eGdF43C@x%o-SaI#5Do5KMA?*bHz})TJ`F!SK%F>=RS`$MVT1linja22-pu2d7MQ z#o3Atf-qdMoHFzt`Oc<(bCV@8f%isOGS4JF_0gJzB2O{S_KrbzRV$qTs8&8rn&k`} zPPW|bJ&qt5I#mT!vl$`M9R41L9VUoLB~Kp@AnlZ-I|oMWi{e+CicAkVpH~hvqXBD+&_@RXU zL4ObYe!23pj)D5OyN%z@Rc9cji-{c2z+gIB{Dw(&oUNv#`A{O4o!%?Y?EUIt6#Y|u zIZd=wyK6&GN5SQ!5B*N>D%B09F7s4od(eVM{Uy%EaVGQpyKzhJj(e?RGMuci8x=S7 zVUAmy&dzH$cq(t}FBf(s4pdT#!&fKF?U)?@^x)%;0$~vwC>IX^ZmSP-m;+=;*R@p3 z)DEHOZ;qn^T2SN|f8#Ax1~OVZ3+lR{?AKZHn2h2{;N~trFH3#(v+*)g$(H$KCr;aS zB4rMhw%eo2&WbM>(KCT_TWz|fRa4iimE5bvC)>w1M%=hTS|>j3l{xom0%m zWcEBEyn85a)f3@Db$g%Ocz5@SzxfzUY3?Fn&~KuM(SiM{DN17vtG3n}Te;nW?pf-H z_*B}qoes5kn^;{ym$$SJCb{;`^M$TUBDAXOm9AxtiOR6-G7t^`z^Wj23`ZtZ^^K0` zc$uIc3!ZK;&U3lQR6Yvdz}oJ*@6t|FwNlt=-K^W8DXKmokmj1*RjfZ{6#eLI2HbMX zwJ;=7)S9wY_=mq8bo!L%mO-cc2%T7Vt}$E#Lka74H%t{NB2M!JI`Y=dBhC+Hh1K0{ zPiJAIeTb}i6fgJ9g#p)baM!ZStn^N*j?JwYbb;R6E4_6GG{5Fd?t6$|9xR4}_V7Ps zMiTQ8H3aQ*=;UmzPp`9CIB{Xwi0jBJY=`Kp&5eR^d!Y7ioo_jV52K*n)PNW}vO!Q4 z?zr3Q*3R6CBsVRMM}#oU3P zWMWY=bH0bm6zq8m!QGo4w=yc+NFnoc-m08@;~~N7X5!y#=s7gh-jbj$db8Np<|=c} z{~KQt^Nag+&>+3Z!~mSih;lO%sQ!ADEoIlYGgt5NB615CpMr^1(`JYN=U_AOA`Ah* zwGBxz-)|l*De#k6-}~<_Y?20ChBz&juYR;GsTgw5N?wTMD*9Iylfxsax?A#Yt2%F)+J!dG3L4grmuYkBh4p;=2 b{QmP_{m5niGe2b4fTTTL{an^LB{Ts5a^;~Q literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/action.png.import b/themes_src/space_pixel/alien_animation/action.png.import new file mode 100644 index 0000000..948ea2d --- /dev/null +++ b/themes_src/space_pixel/alien_animation/action.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ck7qygavosxu8" +path="res://.godot/imported/action.png-383781188e5e5bb370418eccc230938b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/action.png" +dest_files=["res://.godot/imported/action.png-383781188e5e5bb370418eccc230938b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/climbing_action.png b/themes_src/space_pixel/alien_animation/climbing_action.png new file mode 100644 index 0000000000000000000000000000000000000000..41a3425f86c7d31138358ef8dc9140431797e3ec GIT binary patch literal 18604 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 Cz%7>m literal 0 HcmV?d00001 diff --git a/themes_src/space_pixel/alien_animation/climbing_action_start.png.import b/themes_src/space_pixel/alien_animation/climbing_action_start.png.import new file mode 100644 index 0000000..4e8ba2f --- /dev/null +++ b/themes_src/space_pixel/alien_animation/climbing_action_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b60d7wqn5w8cc" +path="res://.godot/imported/climbing_action_start.png-2068d863091a5850656cf80675b447db.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes_src/space_pixel/alien_animation/climbing_action_start.png" +dest_files=["res://.godot/imported/climbing_action_start.png-2068d863091a5850656cf80675b447db.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes_src/space_pixel/alien_animation/climbing_action_stop.png b/themes_src/space_pixel/alien_animation/climbing_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..da6d719f12e53470d202b178e44ba31249b11199 GIT binary patch literal 24552 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 Z0VpF^nicY1Jn7#H)zvi8s8NGO|1YEpbw>aI literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/hanging.png.import b/themes/space-pixel/source/alien_animation/hanging.png.import new file mode 100644 index 0000000..f77bef3 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/hanging.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq6cpfidlssqn" +path="res://.godot/imported/hanging.png-91e9a50fa8aed8cec258ead3af3287a8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/hanging.png" +dest_files=["res://.godot/imported/hanging.png-91e9a50fa8aed8cec258ead3af3287a8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/idle.png b/themes/space-pixel/source/alien_animation/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..b117916d4b130f2676194c36d993e723659187ab GIT binary patch literal 38795 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 KsO+3e)c*l9FrZBU literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/landing.png.import b/themes/space-pixel/source/alien_animation/landing.png.import new file mode 100644 index 0000000..5f21f46 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/landing.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0f7c5pgmu3jv" +path="res://.godot/imported/landing.png-7a7e3dfc8e22791f14b262e3a235ca02.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/landing.png" +dest_files=["res://.godot/imported/landing.png-7a7e3dfc8e22791f14b262e3a235ca02.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/sitting.png b/themes/space-pixel/source/alien_animation/sitting.png new file mode 100644 index 0000000000000000000000000000000000000000..777c472ad1f4a4c80c6617871ed4a702d9df3c31 GIT binary patch literal 91909 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien3.png.import b/themes/space-pixel/source/alien3.png.import new file mode 100644 index 0000000..b3b4dc8 --- /dev/null +++ b/themes/space-pixel/source/alien3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc3amnqlqpmax" +path="res://.godot/imported/alien3.png-f183ae7559864347bd1f2e2d578cc37d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien3.png" +dest_files=["res://.godot/imported/alien3.png-f183ae7559864347bd1f2e2d578cc37d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/action.png b/themes/space-pixel/source/alien_animation/action.png new file mode 100644 index 0000000000000000000000000000000000000000..657fa0a4670eb1eab38d4b8f6fa68a3fe2063461 GIT binary patch literal 19253 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 b{QmP_{m5niGe2b4fTTTL{an^LB{Ts5a^;~Q literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/action.png.import b/themes/space-pixel/source/alien_animation/action.png.import new file mode 100644 index 0000000..64ce224 --- /dev/null +++ b/themes/space-pixel/source/alien_animation/action.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ry4vsuf7ac1w" +path="res://.godot/imported/action.png-4d93b8891fe3a257b37588d3c0166c34.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/action.png" +dest_files=["res://.godot/imported/action.png-4d93b8891fe3a257b37588d3c0166c34.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/climbing_action.png b/themes/space-pixel/source/alien_animation/climbing_action.png new file mode 100644 index 0000000000000000000000000000000000000000..41a3425f86c7d31138358ef8dc9140431797e3ec GIT binary patch literal 18604 zcmcJ%c{o(<{|7$yk~IohMyM#eWH-v1LbinLSt48Zbx7Hnq^#LRM9995vP^|+A^S4+ zZ7ef`Vdng%#q&I$@ALew>-W#kb#*zN&VBCp{od~P{eHbpQFpY}X{paqgFqnKn;I&5 zAP_n6k_2>ulK4yL0y!V?*GV@GV-FDM6w}W?B%rj{tRRqv`AwDU2EMO1GMvf<_ zpo}E#?fe^j_R!G1RC8D}*7E8(Hlm0>f6(c(H^ILzK_CtV>Ep}OA!L6pxk>)MS?(fa zCCYl+ke4G)Eld%`Qg9uZ$cDP~L8O+m*wMYTxFt%wPWZ>0-$?Id1vYk=o!-+at98^B z9!J5FGEzpt92>z_=l(qB5k{y#9$rCa$@6K*&O7mxTW9xh;4?D`IVU^%lDp5p1Vb$C z(iKlwb01FZER7r0>eO-kzl|>q{!n)2d`-`zw&Y}W;@uRR0 zs00+s97WF3y-q75`_cU$^B;>}8ihT)7ke_q#F3!7xf(B8@!N(OK zWe;UV{e)pz811c{GwUoD|E~gxirJWZU`JB-bx>$nbv?AuylFVOV+VHAKint#jlTFb zz71Y}XQ}FIp0K{%o^_^M8?<(zf9vviEtkNgTY96rN)rtI=W`iUW-poLe^?KTK+8%7 zjr*CcEHw?bIv(r)cnr~erfpw_Ky}yU<>Yw0SIAkKS=;ZB^H1fpxxoUG>Aq$INF{CZ z|5$DX8TV8A-fwA5Q&YG0Sm7=F6g<`kPni2Je(LxUAI7zm#!~VeiyLE$r~Qw?^<(9$os*~>d9oRjRP6cA5S3_zdeDUWO<>4;;A?>P8fO<@`Gs|5`_YbiFZ1aWepdx+Hn| zdK#Qgtac)7w<@)HVo*7FVZf1T8`?hJ(An+cSyA>F)??Tb^l(YW4x81^el=!Vta5s5 zq_8>e%2CQE_Ug?HpEmFtvQKmW;kbShpia5rmr$2N~*dsoaX0%2(m2qd3ysaH{ zE%&AENVKS!S9_W-bPiKvkQ7*pIz-tv4lqK;yQk)}@IE?5^#dbO-aT^j;Xa=|T8=_p z{6n=#|J!FCgD^j$#1}p#4r!t=@pqb}d0DocHdmtJD+LZ{wmDYLB@}F%tlY6Zs7)D_ zYt}DmOzCh!(@7j=*cMepcga>=FA8$VSk2vxHb+6L6lV0kY z+5|Hv5F!HZXQJkwMc8RY%c~?r?cfT7nsa=Uzpg>8?SNaIk?Z@?i66>6xIGZ7bPk>~chY3^q;NVkiuHGO4|M8|Ogfw!6z z#0Y#fL7n5KiPuIt-g&xmy!8B_AtJLhRrKK~$Hg;5ION|_gE_aW8$JrK?5MF^P+`>& z3(tw!lbG8UW79dk!ex6Dd2p>TpG;*tl6H^UIoiIcWH;^dkcwR2Zoaa2pnv4u|Iouy z7bqod(W>W^;?p1fB*Slbo5nhRykL%Jt*p3`!81IK8DSUCM6zvP?O2JzM2K6wF|@g! zJE@Mx7w%yvDO~Tc|0~%PRN|nIaRF6^fXf5W#5zw_QIq8CM%4HC@dt#@434J5F$VEl zKT-nEcAQt+#6-D+6Bctg1!T27-|EjLd?-fx4t=f(cw+Kv*ZIrQe{M!*-+@J!DAC#NZ6-NCXu4-KC(ET_eH|U&fEy(YQdlMdjz(J53*QGl(_L$YDEMYNla=wrCjbbYlWN?W{yJkD8pYooYXcT0m^!}){ zDN~H%fbv|BC%=|fzq3sVwIJQU-V!tbe?w!sfsgXz!aNOsez_|1L6BLDyiegAtsYEA za1c*bRysTs&)D1GyfOMj?O!=;^6Z#I{0@psgW zowV^YNSP=a(7fy3l=@%kS`PFnAXlAjh#UE!rP!*m|Ha|kWGSJ+$~Rm&39(vib^G>5 z2a8?JA?2X|j2xvC!JRO1YNe}wHdvdfFJQrXGvE9)Sx5P`l;>EZ`wrm$7-dbRbb{%U z@s(@BJj)K?1eWd3-DAQv_>Az%I^Ivoh@`3^J&`+C{^hNd_(VC-?SaeQ55}I2b?L>3 zrwuZm#T<3>>fM>U_x(`f#T>oZ+5C>VTCV@dR>bX5+mmBfZRq6JUG>W%x=q91M9X*u zc{H2jqt6Kl@TOAo$SWzQ((A#<&XWD#-G?2mvk8i1I!u927j^1)%jJx*EtbL~`NL!~ z1u&r0ZhhnU-TN57TMA006#pIzIcst+N$C!KpT@xDRi*&usaJj*bd!hqh&xRRV=`(( z0n*aPN-B7V1D%1mmSmA06e#~2XqgjsZCYkQtSuZw@>@b!7h#U^r zX6?XB_h^n+JZOuzpM0GQrNh?~=;?pD8&PMJdPi2y;pJL9D>uO$<;vf)dQBir5DY9R z61;MSa|={`_8-H&{7$*zWUpJihoUX$e%`<213D^#tVusF$a~+cwA<g)Wfcp>Jmq`MQ~>?7You%9`%v^}j8O`6PJk=UO9}vUmzS{fR$;bCVOKgY(G$ zuG*mb8m;77wYtq+sqH1SE?5<|u6gKhQ>Y65M3#^83b^-QMQRzD<=ln-8w@Z+gomD- zBYlrxno60%^)c^Rb4GKy+4q7l zoBxuFzMj%on_KPi)G@rNPpr5dWL{K`t8JV9GU@-M z+T|=MGRv>0&^IK;w-TGo{X)YZ=dM-JzH5@IHhTL-89gf_z?0^9x(M9Q_VrN2kMTqX z{Z4|nPsp|Z$cbQu4IdD*`P?UZg~`08mSGEZb=EJ3H_2!-l%9R>UDK9GsmS=Ydyk6+ zkCz$s9?ycieTf;myFLEzytbSbc%pT_9bfNjR--^W-vn_wry);iIHuuw+KB;@G}L|% z=Fk-g?f>#=H;=P#-gl<&KWdpT5}<-6r3+`~Rp&nNn`eKb6^{0Iw!Tc6D8`QLwA)Y_ zX1htPUd5J$x)vGuQ6FNBUv`5IY|hb}k^CbFak;>JKzE4ZfGgg}G-7XiP$MWMz|4qL`Raic4l6 zD?n)Kn821B2+yKgTqP={(ng8Zt7*?VryVxak#qSK!T+f8eNa_z4wU_25T#Nc3%|U? z`Sn(X>tUL8zEfVXglL1pkl5nA)rJ16FP0xHVDb#pZdUa(qI8V@%Fsc5(AA3o9i&Fz z4l8AcEm}d{%36UDn3{XWX>=Dtu*&4{g;_LRistE*PHTcg_J zQC_m#!GDWjHUfQ2cBlp;RWIY8p0!9HZQQFlfGk0;4!c4hET$|M6Ktl|yQJRPjP5j| z+{l|AEfkhYc^U!&NPu&SWw=@7X^u(pIDBsa_ka|w19g(g_zXI6k>#_YqNIw!Gn!A8 z-kow^!ef{22w0~l_&(=}v?3WarUF8z!|WLy{S=`0)dN-wBNI+n_cZgm$L~`o$UxBOaV4X<6>IxK;_-YMTSp zplGSy&3n5WA~>%yMC~FyoX`&k<9Y|&lk%4MJW(&nWCzt3Y2ia{TIvj#Qd3bxt!p$@83~(NCm@f;tsFO|Co~|IO+uS2OU+zkQ3ga+A9_ofNh5B z1cGFK1R6RW;<5&DK-2EJ{|NBHW(w;Nb4PqwwP zMw8r$g;TL}f{=M)Cze7gm!o6-Be{{p^Laq|<@?NVPj z4Fz?C3Ns}pM+vd8AD3{m)c)~l8xF1e_d4=+&g;M<;~9$1cu_?fl+08((tVj+m67eg zJCtyDILM3xdNJV(n?(>sVcD+d4sIHY^d0NYyg-*7GY7h# zt}Fi-wnd)5No6)Lofdz%6nI@a5V;36!zs_oU8+`^OFnN7KDo;B5aN2K_lp2TVF7_z zTDXc&ov?gXXm>BliBQ7D>5+p3y9*9(c(>a~>}VUAd+b8xiL(0_Ks-qHEP$f#aQj1d zSA&GCI)TXE;6OF@(UlhjKsUE(F(Hc+La1Az32QwHxEf)jnSS)%^CnQJux1kwzsb^m zVrz`Pj|qRuHTm;nbm$zz2gi$`#1ZJkerY|S@h$ud3cC^9)a$*0ga%gy6yxw&icfgo zNU(uyZj|W1&|}Hm&B82AW3??66(8I=2{-owZE$Rl@fltrSRn{LwwI$njff~%9dVK^ zXQgK@Lu~t+eO!-fg$p5GM4>+e4MrlvL23p!B0w~@=Xi=v=A^eJwgY?jvv|Q^IX8ec)U84I1St6 z(m0gbnwR0=WF{S9bdDw6E&L)On}wStx9Z@Tf47_@ebB-K5p< zUC6Mm7057Nr+eMvi{|f0F=TZs25CUmXBb=p&I-VLOxE6mru#s^NL*VvMADx1 zbDuqUf8Dl}<000lmIJh%=g32770DN}z)E?z^nHa)xW3B0l@MRKV59N1h>&IwNmC3R zxFT^hB{JLd*x0FMBq$>aUYvjX4G?_u^)wT z$<@H{-fl++I*XO$g45EomW^ub<&314K%H*fiP>a)xGR)bv~1C=AFe_T{ICbHM&}tx zKy!s#51Ln|sPC^`%7!v8%SW#PvG;+(bMJxuY2ZgoC#32=P&7?&yDh&U0O;UKAiA}d zJ=MW0KKVjst^x0IREg+xq-G1>5cI?MwucCEqd0tdf5GjVC1OP^k)kmkbDRc)A0 zh?IU?ZtQ08)e-EYZ)TF8?tZ`hGWV-xJL`H50T*f0(7ALeNC5|KB*;Y!LJKbKYm061 zTxMQ@H*_@QXY~NRuXj7k7jQbAUKR`Ctv10DtQ62;TU@QiskpmTE)0sIKJ@P6&lB?o zfb#;KwND9&HSjxTYeroa&pc2M`%QRS9YO7^GmgUhuSWu@&{JfTBZl@290HP?Z;+$()SGsPsIf|x7&;&Gt=hQCdIM5 zddfW1tW%|4Fs@NFBw}6vIz|)daXgn2ntws{IztvU4IZWoyt@yeWS$ZW1p4c4g(^o# z>1tU|L0J0J{VY+74NoZwL;)bRd4@)|oX`QBms1Od?DN(WkU(&(vLM?f*nP)v zgDsn3pl}`_J{revW&jicD0d{7D0->hU0@7M|Lq!i(6oNz=i-2IOqK&693`0fn7531 z@9?FL1@uAKewlIkttt-F61Qrfv!cr==)sHCnKhLAFujBJhw-V z4sunH!I$s4xY$5eWtuOI!v}fc{%tIXT-}*{t~YH>kIT$fn2+q2BMJKB!#G#TWiYA- zBl0l62e-6IhRA`l*cpFa`LF+&hh96OGyyX-7kh(o+ zvjDXqrILRepn?YCM{!bwPN0|-SQ``|*kSK^p`?NK*-+L+EG6!k!HM#CSj=1xBM{HOUei12T zenG!FMdUEW^)R;93vqe{?z#mgmn00o<9B6_i2PP=$Of=)s_yVudIWP1xIe;Kc=qB+ z22cnD_97%{?+X>GNH|c)MEn-9QuA7#mcc_?UAf<5u|QcWUZ2gQ=5E|U^b-RyI{8KN zGWk!-&~BW?)>T3fI;-KPFD(B60c-iT#gK;3`iN}lt`-)wL)t#jyK+w>4vqnOC^MbC1`<7slT+y`iFnk3En+=MnBiKuaEK`{s;GxNn z;O1w9t5)~mk8vpE2`<#v_z)La(39lGTJIhTIn^ef>re-ei zOFYh~IE2Mp-U(rWix)^82plU@d8+LGC#jzV&+slCl2>K512#GcUF-}dJfYJ@X z1cg(;)tUpA(?!#B7j=PZM>KRIk~uG$Jz|GYk{W~?pjXb|;+Kkg=t?t|4MpxlI6pD1 z1a~w7>gMN;@fG>F`?LL$`te9bvW{hC%x@woJuf>A5t0misXu+&x>#t~+P)&ZuZ?6Y7ABEd2xWcZCXNGQ z1D+@YjVj4IVOw2?`QgnYoFQT?p7O~ymEqtFR=V;9V@S-KCxv*h+d2+`0Y8iIq>Sj3 zbUEueYJ9K_w0jPr()^^NSplIwh|9i6orhHT)-xOE{0QpcA<`n#uokEG{u&lzbV6GX z(0^aQ3LZIBA}Sh_ydt+mKD?UlHzbG0OeU|vxt~oe24(pcjSbQ_;0|56Cil3%k*~0P zRP<6>RdnME%B?Ku%rCZytX~`&RB(oND-bx$8$T7??qymr6*E)6J#PIN$>kw6z0nK* zzJ4NwqZhhcT;`;xy&$l{Z+`#5fG*F1(J7NhhmaRtOJPru!*KccZwU#^K`!tn`rEOe zdU1KI@nll_yh09)cy$-~I~0TmXqc0i(QwQ)?Z!l%!6pk-S2%%;5h8d||C8!?Sa`+E z_@)5YH=UDVOanl)CZHkJ#Oa#>jERgiO`{H7 zZ#aKO>}Jn4ubM#GZmxnmI1Hh?4{x+p0H4h-!X}u8{dMSq!Yd-C@WfzgCHX!w4LH|M zHl;ylx#9Rrx}Xo0#H6^y*DOvr|L)_plx-&V-1HbWMqJtt#rx^IRdz^fmP=1`J^aw zZ1Tgt!T?{xn^cMqG#v&RKNe%kB+#otD=Gb_7b;e!9mPQQY*?*qCw2_@TOV8yK-TL& z>p29+4a>X-j7w)gn&?CL30n98!W%jrMAiB}Fwr;Y)`h^ER0qNJey}I>5TP^Y(}Qbl z@Os~o2LwL@uNK5eKn6^#pE>b|VrM!{u>>bVv}E`o8t#LH@mtH^1kzG$ z^93AA_$|DC+x65+FRa6T#WfiJPJf9)oZgwEEiFGRX)g_LM6FCn@l8RhTlp`YhCvA z>7%y-4=kd|>TNPoPmsV+$I0>;z(eoGcrh?S zf9=ZWC)w`l7+9|lOeH{Ca1u_)fx>}2Hpt$XYg%{+XTZzCL%I-F8}OjeB!Bq5s7}0x z#9@--gjW;6Oa!;3%P2#07>Rx5-Brc3cfh*IN?*0OLeQo49F#NF;1IATLp|>gu9ER= zgYW@u2WN69TxekW#NDVq7am3M_h9JEm1KU*?vHJCsiq%-KO&<1gAfjXooh!R6=+Hp zrS#nt_ZiM1hzs+zq?Utm5pfkw2UE<*ZAGK7bl?Fl{fM$oB3ZGIr;gw;*fI_1hKZGZ z!(Y^1mx4C4JmX%C+~`AuAKj8TEckj)zxP|b52=&J0V^uoKX_oUvMUaN`OaTcoF2VG zxY|MHGJ$_y#?rx`8@7>1*?rV1)DNiY8KX%=Hl@&S-Iz%oS(&7x2uW9GS&VQauWsy( zfVFP`>_-^9p#c=j+UGBWY;7z79KT5mix9m7>Ve4o}!WZA21wbbsF8P{^A3B(Wq{qP-h&ue`BdRFMbKgXW1~}CY2Ur#tP6? z%oyBJ0kky%=zaX)wnOt-*O=b5y+lP(duay!&}su9lo`rM=f)&z4kIdS7!n?;4sk_2!aD)6tJUq6z|vC3gJQNGZt>|V&UMjiJ94x{dxM!DVuc%kTuSmdLi_mrE#?n zsNLSl-X32LAtdkA86}d&6A(p!##FMR+jI^B^iA`!^0@G_1%c{F5veq|>U!k>47x)8 ztA#eZ2l1m+N@PW9>kfF86xW&ic@)U|&k7CLVwNK0wB=N&MJaFiV8Ez2<}JE4s7u3! z@)4+ejLvzy1U@CLWR8yl)&9azmcpljHg}E6ngs`H^;oi#S2uVElvjJH1_ZoWwxlH` zR@6GmuW$}$VREvDPHJqQYbb&jgp4$Z6hmG=C0xWM*O>ctBj_)c!PTHRywfP;ZYcza zYy1sL5_3Zfdh5!`^PAcW2V$wwW!EYxKQzU|;nqcYZ}IA~11jn)lBxk>N8|ax4y9!& zFV05`@KqAVVM;>6zwy?s!>k`9qHhO$oLuij8Y4`Rl{t@~=tb6Wa~3q@2==k$ z0T0@>l7PpHj9T0c!Xx6y=ZC;H+_i*0PGUe1g}8y<8@{H(e)k#YZF%_w%G37eWtB?G zN*3o(+YT?1`nB;nF*pf^!hjMJXl#g!J2Ot|HWjtdZ@i4C=z6jl#ck|s=dCUB+0m1O z^3m66*mD6}*{GrZw$1N6V`UIx@99(L$v}FC2!d@oL^cOSN=58+RyyLl{IleK{w;#& z`pa1(B%%WO1?E}m$TrP&W2DkI&4?)N-OrlziN4k@_}NHeJDDSjQ0F8^hFh{*z@e}n zN3IsLxSvQ@8l{`?Y){l`{L=l;?0gjM=bn}g2K%rVM22AhiI%(@fQJw!!+y;+LBfEP zxlzZzxpfcY*TiMOmAiHHvH}8iu+z!t+Y4Fvt9gA4ArPr8bR;QTMU-VdF0V+f4b#+p z1FHs0HvFF0W_mlw{o}FYDZkN#e6)1C*%DglQquc&m2>Uh0w(J6^Hu!Ht9AUpm@-7H z@->MlBj9MU^>CZ~*%q#ZQ&|-z2F`NdhR)oBQwpB^H@fxH@{GW%Au8UonbORxj8%^f z?tXVJ_ic;s&oxO)e?xo5_kf*PLi1lZUp92^Jcw!A!pbhI6oOV~l&rg{!Wp?#=o|PX zAt2a);o{1r|5yx>YoT%kDJGAtV6UcHnq^xP5J~E#4B#wvea7uivAL zmi1SEeeo?CyrFd=f*?eRr@svkWS{-gzlT|>9Clu%X)D%yuwvO~{tGWm&l`XYs{-D? z^~UjvAohv_SNjXQ<)2=R=wA1Rf=MAOu(GbT2Gaa5Yy33Zqbti6zMT-3wL_ z1=^M9M8{k@`rBXZ%ctT<1OnfkIEoIoGNC3@L2p5Z$Maj+{44Afu~b%z3rPu7WT z%Hu(Q;d47QAyNDbD7L*}=Gphn_t76VOAx-#wit{hFU>oAq$5ZC7jQN~BHCd@gcp6D zSS|FAMigm_J{RB}#$$xkeSVbl93!Lu;9RuRg;3%BCKZ&}?Yt2m(^5R2BxL1C3efel zPwVLX2kN*h3o7Wed%9=8%h18zGL8sNF$fdnq&E5O7?qFl@LOn+qNhaq#@~~HU(a1y z0gId49MMwU`Zmj&vFz`P+$Q*i`2QJo89#CbUv1_f@((rGfo}V@cZ_eTA0)vWR7fJU zw)a)2eD@vb*zO(!x_=Q6i8@D++#w%AiB6WM0?@NQn$VkYEaNcOX zvEYskIsAde=5do(Q5|FG$6-t4!MIYkrZ89xDs)dn`z`2gC&Pk~tcQ%_>g;`Vf2;N{ zvfDge$lK5RdN&6}S7^k}&gxi^4!mbS<#bc9DA zo#5D2O!{`_1$?mkJ-YZsy7~Rw_1&f96#LV3RR4~8sKZxAQx;>-%MrHZY_)h)_d3Pc zbI6!a6sz@UUTs#PZ*~QpzuA z6qX?*uSA$_S3MkYsWV0XqIJX;86e-8uT=X#>itPwT^yFjAwdo|D6WB*81*&V#f7A| zzqG~4geLuq64b*DBS?eNBAH=ZxTpI#*=U{Ef@df_991{yAK35jw4lp{FCyu?N;&VC zWx_+m{cqZsMA4n1@A;QLB{T{kbRov7+?tnCROz2a*!{~$Y`~#Q~nWx ze>k|QXavb0((ZFm#sb5iYkz9GKUX2-Gk>l?8leAwZRwLct z(niVNNq)X~h!071#&Ji6u6uN4xmrvr&OYw@O=IQ`C9|}CI=R|8Tx}icoIV;ZA_Duc zh)kyW*mlk)5kF;PSJ=IN4ai;(m_KYBiEBM&hYi04wjqCi7X5qL&j#dMj#3RS=qi*b z=$64I?uvR70JE@oN$Oq^cs;uRn%IQ(qrK}ekDgP*Hv?G1BFOQ- zz3qiGh*A*|;MO14c#4ab&c=E9%(xF8-$9XX#Jlkqf49K2Dbw~FEs?-m`40jw^p|)c ze5#<@z+T-GE`zl2!|wGVmlJ1^PV;Lnetg)j-SiA`VmqO8zV-mg-o1``vz2}~*pFM|x?z11InD>`Me}MlON7`F+e`nvvB=(I_!+Gx@+vgpx zx5TCz;4R^uaY-1={vclE~aGV z{wEx=0X7hl)9EW($j&=M1*-1yU_&$7x0}kMGYayPk*j8G>|M%gC+0PgrUFI&q~t<> zQ*x~%2{ozBUm%C5%=f`>%9u9N*z?(4o@eeZ*qY_Go(laF&o?h?aXyw&}#RLfhu9zr!{sGf>T|by#hECuw2Y+79KJ=QbHve_Ap)A{DPA5l{oZ z6-5eUx=Orsz$6*G1#%(KodI>$(3pQrP#ODCH2dN&`YrDU)VCdT;L@b})LSdMNj0JV zH~&^8x$BsJi`tjoJ?7sM{_t;CO|8ilui`l^#g4N?6q)5&Cf+R~>Gtp(teb8^=@gkr zEd0Z_cTJ%h)A5eGrl&XJwwEe4B&Md)s_KPx7Xpyk?Vn@OJ04sa!d>7`p!;Y3I9%TX zPe_;BSK4~^N&Zv3kGMO2gu681V^spRIuq3!eApl^Ejuu#r4us$hEa-Vh@O4%?Iqqf1DL7UGb>$4Ix zJYHwsgYxeVnM$6O9}D_E4fS`ORtZZc`xA}gwnQqe+EnUg6ZZZojg1zqMHs!Z^G`1A zX5^1FBA0eHH~W6nEQSMTN3S@F?b2@|dvqDGCG=O;$Yt{|HV$7u6*Wud~VYt$;C z$y9$h4VVh{Cm+3$& z3+dkpuybO*7qh=^c}8_O?Y0=Fg*oa9&({iPh2V+&Pe>-{la|hbVfZHxH5cA!IBs>cBJIi3+Vu|uL05Za>6%vF zuJLa*RZMwFV#iw9yZxpg1gb^*SFsz;NSZWHS9$f(9P7m$L@v7*U|>A`P_#sGqTD%g z){rGU-S+j+2BN|7kt1er=1FQs^2R%Uw8Pb0uA}S6Vr9yKGSN${0O!iEl_!Ox!w~YL zeX2>dl~j!Et3zIiPUxDuLqo&4g#0I9nm=38GMvov^o5}tZohb>jcX@11nuHDT}>`! zqRzDG#Px~Zrh5DuXDk@;?AXRb60C7!GD?1;tg-8k5{E7laze<`ED>bc$Q#mt*hV^= z^_t?3wuLc+D^qE)_58S+U)0f6XbnrxMSQ^VPQrbivh}I8w6i9)uivAn3YNj*xChiV zp{y=i$WQ4hhOFAPU_-TncvUGPU-XPjQf16`E%|YZ1ZYBv__t0GKh26O!Ca=6XI6fv zJzjI!-&FlsI!`-z%HCgwGlHwk=LnzNbmH|lDj?D|p2XMkI9Vr>WpAC9IttI+G&8qY zD{EtjC4J=eYH#d>fwDHFEKW@bRJgV#k6Li=pUz5juEigmO3wYk3jN!l;h@_zg^=X8 zYc++TS$paawS=z6(x4HRug+ktf`C#hGgG=kwGE9i@6s+#df<%0ZphA z)MT!63uCuER~=XM<96pG7<+m(ld(D?Q9a#j!AEjO*mu>Z1WdV!n*P-xr3>T7II$&Jg8Z1ijRBE(8A*75 z>|Ppo$g*%K3Uak2FTQ>^x?Q0+PN{VHy-j27gMc`~`!C{>G&aSxqH8=a~1L(C*?I^r2C5Ry9ozkOt;$F4@8f83h;#*2oo^u(xx1GT1BgT4T zu&FDUaIdEShFjM;05I-+rGD(aj`ye*8Gv(^h)Psl0k@w^Mu*Ptt+im*84)XN7DiVOX+$J+V8%rUuzYz!-k9k zGC&@7LV`YiT*LK|w*io*x~gE1DpT+E>);mhln$hYphK3)zklJm1%G(0uTyPgse9cN zZ>nCUkh=|8Q=1++@=Ic@U-t!kx^76~@-Ae=n7`{D&ty`1(d%*UDdG)uwqj@*Qj1mo z&eoTDB2%;y1{M38D`m_tDb(nCF(ReSl?2b~TBusUY!w7Pw2K zV1t_`-+}-l5&O+TY)fjwq+G`g%-S=7P-g1D8FKJ-{wg`l1lVX>f!~=X@_*iPx!)d1 z8TGQm;%;e&ET5)ZXxsOLJPHVv_p#hMW>ex@Y)I#WJ*d4T?OEE=x(9+nx-5 zoi0xPph?g0b-8?SpvYm{xH0xmkDy@zl(O|4j5*`NpYeiu)%t#Oi_AF)k)MKe?a30+ zyh*C*D0}uA8IyRmIOrp5rjew7jaS;^|TQtkmN&?`v z|B}Fn$YleWQ00D?Eq{1PN%`A}-#Ua4)04(}Ma1U?Ug6Z^P zuTi7eJ({o6dx9ZX_VlXh*U9(OSoh!b083?(JpmKtukk|0=H^*&1CZNPQTbDjbb=Ab z4M3_Msa`8I79R*0kn-!!R9wfN)Op1f zd4A6Vk6#K3YwT#{iVkHFKr&`buB$8ROow!R$eCKiMe2Qo&90GSS*-P~z`ATqg)0$o~N!mEo>l+^0 z^My2O?B{pr#Gfk#zjy`#tR7D03X_9nhzVq`oOOt614-~$7BWZeFkBEKiSZmJ5zSHQ>D^z8tSbI^R@YlHl?T(n zYPZ-Kn2$_ehGws&vpQ95e2(i*Nz#t{>Ot@;(gf(DuxizSS&@T94ImQGIEmOt?8|B5 zo#P1!Y;L`=j~Kw>qN5h;yc`UTuL!!^7O<6DEt_}=xO>&_me%ublJYCleCE@7Y{3^e zj}AM0Ej*Ng!Z$ok=K`z*)$*|wU*86Vb}NGs49@bKDDX=gLF5qhwm8kF=OqL9bQ)kO zv;O<@UNU+_DbyIymHJxd(FO^pRS6IMvZJvC%i**_ue~~p5JfMgZ0E27HTFln?&Px| z(w}Q4CZUkiR)8>@vRN#A?ad2+v8k5Qb5vYv#`$xI25@5URTB%vfFIrFb6tQQOy%&H>;r{ ztvP3zr2&>fC6Z+QRHCNnFak|c^*giAvwgF#KObzhJ2Yw-qpn%2ZVh&h0C#FD^LoyFG#@H-_mKp(EAJ8aP(^$jmrY8# z<}mduHT1LODb<{m=09l*$@b;*49~Y~BE}?sjcnEIPOHg#HEF})oBeRwWZMiPB}RSA zv`l^x8Id?-Q5ZU5#*MVZ>b5g5q;L22UbV>S+hFGWHPnHYc*K9|UaPMf%)56!sVGYF zZE=T_T#B_H2J)KhZT#Fw2d9@qBpp?M-ftnLnekpAnqo9w_8bReuw?bsbMh}Y4g->K zU6(NyW`c?|xPr%Fn1tWQ)smNlv>KCkol}jeD!xPjGhpx&^zhYY7zYkv-=*(5`8{#j z?AL4E^3fwCZdob;z1LKH!!#ISzK@v0*zfjFA0w?~S=w$gqMN^LHPgQGhRjk=Lo2TZ z)*11tLduC_e>9xO9ma8J6nf#fDB~jToyn1lYF>LDF5Q!Ndhq7#!Cqs4OB=I$U+{6U z7)8e2=`pg~3b`A^RkpVCh!H`5P) zZJbgRN|+HnLL1X6OA-s9J^P9M!%!RixpKba2U|%*#R%rcL83d#Ap!e z6Z-*-6f+HfwF6j5e?ImH`V?Dzl3uKdVmuIHoVJ`#m^QD!i97lC!Sr@49P(mM_q&k! z75d(LI)3hkXQpVis6SR8m%u4E;nwMlUxt38n&OlZhHv(*EpG%IA0LS|{f=|+=Wdt1 zJ*ydoKLBPR!(eM_;fq^nA9+rWDwaRmNV)mNzJ`cbiUbnNVq&$|tJOQLXzX)V_j=1# zn4R}mL_{(P)1CxNAp2i0X9F?il^iJ``^T*7%mV8BjfOKYtYr+0*6$Xdf`uHEK2;na z_ld1W{lKAa?M6oF5}t-bQCsp(>1|FJA!($RW74WE`q%@=e*==dt$zSX)=*xEvXdT1 z{14a0<7o+UKS4-!v=0%49RCSII;rkk-??$+_}@ogN()6otyIiW&hpyi zbxeP`h6L!M{9O2SIOJ>X(a;6zI%myxsR1}xF-*%V{vydX2u9x4~9Z{;|d9tK>6xZ*Ftp);x$` zx6<5*qfSPQl5N_Ik6WOQMpwcAIGc-E9X)KQJvbD>t>u&i^tp1_z-;TC-$8OUNX0j2X zfu~#+?#x%N{bSkX^F-Y44q0#DYoFT!g@a!^b}!LOEpnJp{$8pQ{YR2Mm3&|I?^3aF zf0u)ZqiWXReCQtNw^Bp6ZqSAlh|L%set(=WW|r~1>f%@Zl%U7g9c4tDbsLcq9 z9{Hd8^G1u0B<1tW9<0H5ir=UEY}m~2oJ#x;fkM7LKE~k`D1I-Kc*-DkJAQx<^#Aqd bJ>USy%y@7R*|35yKsO%xTu~bwF+1Ig?WJw~)l0w;cvK$iQC2K0O4Mw!c5=FKlG0HNw zjD0X=>_amcGiJ`$>;3xtuIu;5oO7=0oa@Yep3CEY-jCRqZoa?0MNeBeOb=AV; z1_Z)-bjbuc&USRVbe8qZ(dk5x#qCfCgoFRz9}}dYNEiZnc;%{z;mxR`&GzUzg~)J1 z^rx-A^SP4h-Hj5G`&L#~Xe%3=m}xypCFhcCrE4>jY-j4x05`Jeyb+6i}dKZdHT z-}?3OtO|g$F){Ujef##opxg36acDfj@x_COM#rU}^8R~RQEzu3Cj9U6-^1xFamfF7 z&xEayN$S6+c#ZBS{QqxM*FI)XD}PJ7a7(WGZe7<+2dC;o=!ITQOFIEs_6mjm@=dVp zBj_n;0qU-nZ}}hc^jG+!KlsyT!V1E43mX-+>fhrpw-+Xo-MD(*>y&gcDYd9z!i0Lv z_iMcdy(qBw-u;M~0e$6911r!x7Iy&t&J3*77|j9gkiZz&eIc6>{mEwEn?@Q$_NyJ_ zJCwA3Ar|0Pz`9ZVt^yF?a|hRive9VZQlUAi>^Hsi*O&NO_zKY7-|QbdJh1P_G}9^jZRLwB^v6^F#=gv<_b8mgYob}xQ#YviH=ld&&s@!>Su@V>z+lQzAp)kbPm6mTsry=uy-b3;+dQF|DN-|In+dR%NOIh2fAJ+$mz^5VO_sM0=!T)c24P&yx9iYx z+pR>k23fC&QPj$a8r2M|t>p&<6Ma|p+$w-jpG+1h5io04fLE9`wxP$nd9}r3SW3=7 zD-~iYE1gJmUzvUA)s#Oq<+W0086mcuPSto5yv2Zv><0b>oCHTvBA~~gVqk)Lld?he zGELssic8r?(rFof31kX2HvRRNPcZ|-2Qa&_4rF&=vVUA8fb8IlV4RW5x}w($#R%-S zrj;|4eJhWPs45nNJK~LVxE(8&!*d9DbzsPLEOx+E1&sT#CvK60L)%8oZsm=Obbrm( z_EFTC4Ti4J<0JRJ?}-;@qrAO%3Z@jHTao{|EY#ALWhl2&^bqIeMq-z3N!s4qQ z$#hj+NV!#A@P5c+mN-gm^z8-eB!s`)383bC4Q`NiNj^p!-`x4eHH7yYc@}C>`{}yvh=gkf!Uex>3TER{> zgJ=o*; z>!E&}mDP-_0OpTiBHGe|2`cn}tGb0nk3zq?_gX?U?{PiS#W2zQ7V$T0@w&r9M%O}f z;rA0kS5<~a%%0aoKCoz4BT`_P0oN4-BE%dblkiNlgr~5ME+gjOjf9Wx1-Y#3cZ9EP z2$npi8^I{;G<>T%XDyc2tuM)s6EPm~o#^@I$i zcJ=AuyVvm_?~dKEl{GJkd;Llq@{T(95yhMMYr`9v8Q=1iBWL*3ZvQ-PvdM(-azJ>h|Mo z_&Z-9lf`a0WqwzJz2j5`AnTLDQtId_FJVHzf)t`vjUJB$w zrSCkA(a7jJ8Q65{$8rtur>z4%j%d=d^Ij;$ya9Pv5pwOy#UG4kAEDO*Jz{sxR*>3j zz!ouar#*W$iPR7_dd{)zi{Zrttu<8ZCI*!_O0iytc6Oq;Uco>t8C zi5$9F#9yzHg>N*)npCiRI$ti_)c#5oZ+;#RP8e?hL)eYzP6?D+V5Cpr40-NLlVi=O z{xMon)YzA+nw1y6V0(rZMtuqy=>0UcNITFgUq+`ZM*sYu{7CGuoa6W*H|H={t-<_$ zZl>(>IFM1KNP8ED`rL%ZW}S!JY9hkPk0MjFR!~GQlmY#sBI_s+Q2~^Y<=8HruU1WrY8CH)%@lbi3U<6Lc2dxN7b>{6)aV3(|f00Q^ zOl$-;)BMZ3;k=1UIGB7Zd+k)$8MCYC<$yHEl1ihROWq=@=BZD|{C<*-{7d=zVvDKi zxofUV%u*b(+pa6woA`m}6PToxs)iiE_-dJ|%Y7IRr}tfo!u1p_;#aihZD>Tu$O%QIlp zU*&V_LlynH;%6)SojSfXCqBa#j!8GM+iUQ|H*FRtylF5MkzC*Mxh9JH{aI?kPcd%l z5_X4iekk$7Y5}90VL(gYFVfzv`%I=~kx73F_2ce36Hc$+ZJi|=H1o&Y+e1gNj? z$6h@Q{IfE6=FWfc`1MDz)UC3I#f+Pr0Tu2uDtc=?bPWqYlX+W`CzBiB$~6jX8>@0n zp55Y|3^H~fT?*4AS{F{qDFhD6I^bzY2Fh`6M63-E<=SnYg$_#)ATmGAR}T}m(6P5& zG~A`ERp>XV&_8tz(_Y;{WmM!P^6CMVmu_PQ5_9=rUS7#v-Zqt_g&WZ6;1i#Hi`Wa* zx^=ii%(`;OTHvLEUWW!|t7w$sRbQVXS77q&9YMnRo4r!D>I4iu(Xf zNtRpLPHY5-m42nNTg|$QwBO|&r7}0B}53~lCND@9|c*pp$n)qeMgTVt<|0JEmv9&B^_~hwO{UY`s(L0`AdnEQl zyRe{0m;I~F7>qs9h1fp1!;+(?-D`^X`OobY^- zi1bkOcX@n-UJfJKd|8<-e?~OLbEA2$Z{A`GQY$Gr!-u3@a9g&MZh%bJIB?P}+CEj{ zp(-r;D>Tv-6`C5D5t!W&q$qZ?z^1b%;D^VZsKP(8DYT0YJcyZYK->#(msC z2X-a~z8iQ{Chdst*O4!98o6W#ZmVYIwJtceDhI1pm{$>Bw=jRTxn}uvZU-OU_)dp5 zbN>*glq<%(#w|o|?CO%6hV3@&lK=W=9dGL#kRtVlS+@dc2A}gPLTBp1+X?R?uRb9wlj+lqStkP zeU_AfAZ6U;*;2o}s$^279-2WhcV4am$`6A5k{2bKUm?3QGrPX%`1QVa)1X9eb1-I_ zF%@x#+#h55=W`no+u|1104Wqg&AXY0Z=L6^-L;-EmejMJrnC9;hD%%5Iz!;Nt0#9@d=m2xnt_JMIA^$99#&+_k zyR~&`DGo4UlsOa8_T7KDP1@?Qrim1dwREP;(+dr?1yi75KQO$%^WPZWm$uD zqF`YZ%g})J5k7Y^wN1=lk?aW!A?zQmVB3@6!Hi+H6cGeZI2CE1sd^+Tct zSGK-s`eL)YyLsVv*SbG&rXA=3#Ae_mrMqaiHT)n7qf;bAxiWcq=!5{f{wAX8!LPlU zGVl()39K;!-S&u#_cW@;4Og71D$F2^;s-0q7w1Z!E*=bbPuIbFa zEg{I=v$Bu-kq;`hM8>pce`SGeh+P}AqtArpIGr1X!7iXNbibe%j1u4YG}Y)~F6J=C zy$j0gF^|~jp37_`8EQs{7? zKd!4~25MgH`2tRmR$H^0NA@*JMAP~NZ+yeF+S@uq`%Lg&xJAqc#1cD?3L^~njBnXl zaY~T#7lYGM!Ue`3c7|7wrI{A)dhH?T)Xdj1m$$L0wo7e>Ip1uEdRJ*$B`kr+7Tz~a z$}3r!_;a5lhnS5g<}=Nof9(c}dMTca16lon->~Qj%x%o&LzWh_`{}$(+D!|r&l&JB zT-EHIGzQGwE3jr5%<$U7Mz7#Z*dYx7L6X3S5`w=8c$<3qR)*Y1mAzh(#96-7oTsXK z-(eNGmqpT{p|U}+&p^a4?Z)Nh;d}I%5IdifqcEE#)n`fj*ch}J-xKh6gM5%0(R3vX z=S9!m0zU%qzMZDQ4Ujx!m`1rq`sZDNbLjRIt#9g;jC$?P(9wYF^E;U||6v5ldrTS{ zj#R)8T`0gTQ)fd;#fIc|^h3ajjS9X3vbAU5h=IPY`#rN1bMvBN15Ik*w$hq~-_t*m zr3#9n=HvZyC+fD0?HJ)fm$!pT)i9Rl;bTuN!GEo_&2vL;6Gz+W7|7C-Y1CckxDt6X za$$#DvjVByWpHHh;dZ3Y{Ww7eb3A!&pMjQb8t*?JIv>WYCQuVWLb> z=*j6dT*@;8v24b{6(!~yVGC~2sub7_F36qdj15lhKgA=&GE9K9r?jac>KvU=Ne_>2 z1D|Vy;s?-bgMyNywOf2oOydE$6@}kCym93eG>qkMyapQ#D=Ay|BmL$+Lt2Fv$>`}3 z*flQ1r)Q4tW_2f)o-L1mJD0F1TlDxa#x-aoGFI4VQAAqPdw5mJnRpqucWE?!i_mFf zFS>`+yYkG6J8XNHfpt+qlKt<){p=crwC~NqV`JX(B$7A?BN>zD*Y3--AF2wby<~(M zQx&I|cuE%9v)8}VX{1tmTrx( zlC_;<9u~qy+Chizlk;qM8#qwC;$?enB1IXxhjl{Q*)U7&iB%X-0lX4{81rlksv-i5 zKE#~H6P3PyeHLv!qjMN;d6D+b{hxXu>?k>8nEy?V1uj3CQCJ|`5kF(UwP-eLLMKMB z;7>u>OUgMdk0G)cm>}fFjZq*nk+;WfTq|MR&LlDWY{EOUsm{X!H>9(=WaG{zFgJ4= zL*dogSF9F3^%RMD30~4Xe(zDB!ePrYK2hVHu(UR4CInOc(2AFIM)~N&z8OK{ZUB%E%N1(*-`N=OD8S=3`)8z`WC>9 zJ-2z9M*hj1|2i&I*Rw!FI9z!SRWnI2wEDyu-&7G6)WID*@)b&=UpxO{Y1;r02CH?1 z4wqg4!uyuyts+=9 zD8ZLqCu8Az62EtD%FEKYQ1erS)2jMLd=EK9ERQgV-XF1o3uEt`H%toB?2BE@>UGi` z*oa&t2GwWvTe09&>kyOJe&hGA^9u}-IgHyfbdpyoOa`S3MvRfo1(?n!$SaT=MVc<{ zMHN7?{DNa`%KgL8hd5vTe)bwuB~A~{a{jMVe)w7kEFiqRLLsTvwJWuDnp0f@0&MXAC|RoGX}HioYu;Nq4s@9A?|`%ymgsm!nOJ>k<& z7*3~)QBF5AWe0=Q{q4O@Xjfe)I(&Y5Yu(N1q7UQUPmM`op=;RhTgtu@hjO7Bk{M}sbggTPkpi!AN=@g$zMKEPhj#OG;`v* zai^&Fo(3Xk=u{?*+?4&9FH6xo?N>3h=-c3w#7dt87piMN^nO~dlPQjD(f6&Y6Z~221)my9ryGoIky&g z|7~^5URu8YhBsddpn4sU9rO?=mr)I@OdLVH6hF>@7_}vruU(m=t`am?rJe@Klj$CV4!AJmG+obrjbI?E2fyr?~ zV-Elm0*BKJhO+1Y>ey!eWdywF*f_~Mg4q&W&1PIHo8pF8?IaXluwk-CtDd_x_vIYl zv%JOJ#4#XxpgcWc^*>&ilSZs+hHrQ`6muKK6?54DFLtYR`H84>~O zP66;w6E(BYW2gD0=y^sB5|ACE{@w*u_VC#d(%*r)eQ3(sEqNE&O5=YGA{3is`d~gu zJJDgrDTP6ius-2ZML(U({|wv_rky)_XMzu_^FP|#9bfj$|sTz zv_MyG3$X2ITr8Ws*Ds2`1$P_uN}P|=xV$_6gi_nZ;b1A!LERQ$=*>HRux1jnhqQY# z4Lhu1y0!GJYOxotyb7{TpW(6N$(*y!_vpSbTA%j@<}DSx$F7r@&GcR6ngw_i0L`RwaGuxU=w)83$zfWmW5P(?G z;?S(9vnidy-^^}~<5N;rv;K_S{v&O0Pkn30+hoG=Bd`%whp$>w`_#F-8MLLX`K8^K zCq>8g!#I@s2@mCV(@a!`#H&8`m;n))BpO(WA2m2Abv&W;k39P&{`OJ7 zy7;6~L(w&+N2>qBoB4%FB)@}08CJ9$_Ug~UH@==*C%4I^3vvt5zY5D?MS#O+j#3?Q zk$dVt+14<2aa(WQn{8GzIqn~O%QiqR^$gcoMX8rX^pB#}VrR*8U5So7#+dX`c-E?& zmx|@Z#|}R$Es~+<=Ak>j$v$0j7}OsfH2Gh`7QPn<;;6ly52bhxjup-3_*t&?&i>;In6T`R_x{p!RgUn8H}`DLMZPs zDSS51XZjI?%uzL!cdp}Iz}SgS+^>&lOoLKJWGWY=f+21CUH1a{jq%2{n*V|z$uDiJ z259@LZVISVB4gb&j4BMQ(9y7tJL3!{1iMDH1-O2Zj1Jt2+T+1E%T%&ht2CZ>vA-m~ z?y#EG2dg2ium;WXjMp5jN$<%zW^ZMD!R!L*ne_L&8bAN8C;K{B(U)HvevhgEZ}@aP z{A8cw3a=M3y?*9$WrEdXqwhrYB|t9@^XuU?OZLKZ{th>fN*XgNfg|exzBkL{m&OP_ zXhcLl+8~xu6hv<9|Kdcx)Be&w3X6ApdNVwXd6AcQERkCk`$QgHLAh)Xiajci31VB2 zbg%=<6t3Ons|;p@tVNCozoa5Vf6kZ@cs4tZ@h$Yq{D&KEdxWr4vv=&cCf>?+{>qn) zHQH`r7ZK=Tl{0Spfv1bKFsUA%@lp6MK!U2)!ZO%C3?q=-ljkD$uB9DcXl?LhRK49g z)5RnJht&T%g*51&fN?u~3k>q!UVjPLr{ga&2Ji{%)8MDwT53FentoRhw=StP(~j6} zVrvApVowVW0X2@@h-d!?tO*VAO4uLU-kuAkPu$t>HsVk4VKXE$J}pH?X{GPqC-Uyy zW?LZt=Q+}Yw71_{GshRM22?*AgbhR z$1pmz(-;_Q5ruJoOZH4G=&*vpb#J4GU$)?c#=1gLo>4tRCue}ReRFnDi|3X*J?Qd^ zq|(_@*qx*4F!9Msg5qIw*Wbit{<1Awa}V^Uq08xah;7Is>p~%Yj(oSpBhJ6vjsJUT zS(pV_sm3@bOYf-}V@2oe8gxl;XiTp_oEsSw|FD~N8^w!T?~iY9*e!f2zaIR6{$MR@ z)102O)qYw#sagHUfrg&{7VOd%W_vCPz`8&|Wa(fXV|Kpt6Pf7P z2*eK2x>nbeHKop(Q}1kXC+JZOWIz9uKh>F{`Bdxem9Up9BmCcm$nU?w+PKZ-4$l1H zH~POC=q#=1?3;CHR`f=?gW$0OI0Ngr0xdS!s7@pH_yv8>^EKMGEq$=+_W5#=-6ST) z2>vTCj}#cfhFrawQe@aip?vFMr< zn!U*#08%m~Chy5qfPZ~DSQb7kraUefHJGA&qiF})3TR&08Wqn#`D_T?KR#=G{zK|b z7iBykG&k(VSNd-kD9HmdTXqj$P<$y0=w>Eo^#@f6&>AI1!7p*(8_@4NK1Ewfx9y2e zV*e;Yr(Agbhsq20qb^+k1uquUPHOz7H`+Pu@DoE_jvn}S1VLn~pWr}1N5LQwgM1?) zZg&oJN!CI6E;_FL(cC0sr^E})Vezr70KZ*D`p$T;*5$DaCI<5_Sa7zgx;G+p7c?~A zB)Oqec@(qw(-7EiKeAnckpb5LFNDr_<-XUKS8&6I#t7*IH~E zewu2;a7;iqC9u@Vou`agSh;Tw8NsxQ3QGH=;MmI2lZbxPi1*qvX&J8KU%2rY)g{I$ z5GL99uxWHTLZhWiSKg8+yQ;glqO|az{DY%&{KeVnEO@G*avh{(XnKkd~o08 zNHd{G=Lw+-3QBbPUxAeAmBU5>eQdmD9Cnt8)%!!Th(?5?OEzP8{w;r}eaHN@sfWvi zZ~h%EWW-%i&K4e6EZ*s}-+VfV;G07Yoe=R$)Sm;t`g|lKL{?Ez(~A%bm+L|WBSK>i!AzS)u8-s5I22N-1HPAnz3?SwY<) zL46+jK}cOq2?~WOF)P0ez9c6b*S2mq_;hE!5`Nk+UY&k*b|#ZIo`c>m}&Pq4+%4P~_s zOcf24>>I1V>ugm9)8YNN6mR=zG+F{}vNn$DCW=Jf0aRu3X zA+wGxW1{ZP>nrlhW<;_gPq9JD9V~2aDVH7yC;E@UGVTZ-tYK)ExzV?4Pag8Fe)>}k znI&tf@obL=JGjzxu{rax%!c!!2I z>dVSLZR^kjZG)0{iJ1A`xAUww4rd>Tfk$K#FA1Fd*uuE8B5ool-9cFKyjqK4Wrygn z9~IUjTJeO7svXbt(ZT2|@{_%4_b9QQpB#pko;)@WlCQ@%aavo<+E9_NB_WTt{#{LTM18^ zM;S?6T8ZNM94Gw54lr3gnD!8qFzWDnG5$53z`c&?HVo3Y01r;h=fwu5ISkVO&6}?!l^S3lQ}@W{&vK@S;?At4vm75>eKMPqpyAz*w22(cx7qR` z(<=^JY-mk*Im0WKM+GTNw(b%&@E|4!!MJd!5y^)BL_V&Q!d&Oo$JTirp~LL(IQXQZ zPWliWQ$MR^splof5~w3h7y1B3ucaGSwOZtTwpD?!i8jRz{q6kBoFY-)92?i=y&gc> z(MsAZfeulXKVk00bC)XS_L}wT7A2%of>k@JgE{Y{ZY+|TB@z6|2=A)Zwk6ttiU0Nw6|rF<`BHA<^1%S zzV-2=1^t5{oaX&>J_P_!0{d9Di&&<}g?7MF#hq@{2;3|(i^*b>9zx!yTm}EEfz73Y>xi)U3ZCxYYjnzxMPL!X z?s$?)zk&dD$*96?Z{G3nv$#S3FVq?Xp-Q)VG}C$!UO$)L1IHS_iH!YX@4;Tz{ndth zA&e)R!C^`zY(geyrZgyt00N+z%)2K$va``nIJ2?Iu-?z=IJl0m5x2hd{mYJC<-4eQ zAf>Mx5!3QF=;AJ5#hvg&49MNJIs9Y0|Hb9_v;lrMZwIAIAN#OR73yP6Oc^mShto}x zu?Q8&q}J0V*MvO0U*aeiuzK_mZUxQI24zf>g1$dHNgt^ho838GZniSK(_mMH2<#U> z(Yu{Qeq99X#{%dXU{qf_RBMI<3z|Rnc8@fc{+q?_eXLVD%uTat(yp@>rK-w^M2%|I zInkTw4A8TT|2X~Yg!!V~;`{QT*t-O4sQx;wJ>l2y#z5U`V6rToU_%p!)P@^#g(f2T zv)c^K=3O$$o&C=c->xQb=mkh>3hZPD-F&E1ks3D$L%#ru^r@MPINj~6A52P9$4Y-t z>sxz5CnPf_RTl@Lq-!bYQFu$9%32i|d+ujV@ zx{WoD?pz*Nq0Hs{Ngp~9!B|xDiW^pQ*V+fKhjg@O6?N9L^jS-GNRl7EJ??#2x`{KU znw#_C?1!0NFs>Q?=id=5)$MCSn>>_L7AFh^N^N`tY{{9xr=K*pl)}CPr3pXy zd%e8*17mi4yp539t;C`go*HNPL=;%?9&~#>MMx?1A2TiGQgsGQ83kpq@r-as`(i8q_C&LQV)LSYBlt%ia6Em{X z>S+(1zQdzp`hbcErSlW3jzMj(F%f@D>34!C2A-M1OCmUb$Ca$mr=yHWz>=!y3YM$` z)n;IP5XBg%A@Lm<2%(ds`?T)~^6i@(+?ONNG;S4#pe&crzvA=sja4CRI-L40zx&7+h$G0U}KC>pv6eGMU81uwoeICG^Z=+fkz(^0X@MmRMjSR=>_XNi0L z<)v3;4x@hrcj1wuUo(Gm>0aRY*AGA0Jkd&9AmKt$xA|6OCw(qYlq|mSF+9 z@@ch?`+Iw?tVd}|20o+WpDA9L%fm96j5CPcVFqH-qP*~95XqCBh|v1F{4IDUOpIym zP|*=^3DlT%GLCsrH4OK8gC?a*xBy@tZ(@IF(cf zk(@}}pFAxNnf*bqX0B~$2PV;5GTQ8~LP5AEoBgLxx#xBaolj&M4E;?zCbbChVz;dp zfWn_htrZ?or-oF;ln54|Wd9eg2#7Szeri=CmhL z5;12DsVuYXM}^mYAFpcjGMU_KAGH;|=xmG))@^zD*I z$8MVyKe<5nIBo!He&Lyq>sTc+-oi*)wiHza_*3ZRR=+=(I#Ei0jY8K!OyEeB?cm>M z?#c1EvAjQ`xcG3N=qYX=cH!29tBUCy`UHfuSi&xxlnVdbIhC{-lEPGkcG=*g%7t-P z_cHYvH$*j0s2B4)P{qQ@rE1=wfMBMS0wSAn@u+f3(R>!saDKKAw!8!_;~?K|@j(@& zv4})(PDyLeYCpIO*h_z}IWq@C3vIC^*r z6nj$y-N#v-{}GtO@4iY!4hFZHo;J8jQVVU3%WtArc$Sy?8W?8I0>+#A<(arg2OOh_ zD$>$zortz_RPvF21|(MKmH#t2)aujzp4LKkyY#Me&(z}_TL(|4Vd@^VmI<~xW+?Nd zpTNt`xkj$a#QhuB({I4s+4vWXOW}}(Zy9|$>HEkR6T6#nzAsoto?{7!8x@e^X87BD z&e1f~t=q%3;wIo%mM4#1tesT11jh{`?cvL%p!=O+sJHR-5bDm-5mQjPk|nRobDsAZ zoMZR)a8Mzcm@xvvEl^y*Rtzf>+pz!!%;@~LALqmJc<4;4q!+I!URq4An1yzJTPS(O zS`fk5D4`U|RzfFB&Ccm!72%FNeNYDgF|md3=yD}^ZYU?zVjbn}^wPONkx!U**kQhj z3Zs8C0tp9K-ipl zd_)Q&T()kzk7bLUNE(vShCVEG{J0!+AN_IOEQ_j=@>ELZ<}IFsNh||u_HGID_Y2rQ z&ZsX|wIRF3)L*TDSNXS16n6$Vao2F&+o9Hug^PJ6e!ZNK@daeUmAP|mNh@xLXVJ9k z7x|1hIV_5w*v}7rEv;~BXRIIftFh~EN1+ST^{bi1zK1PYzMyPeOx3LPixM|=m-dSi zs97?!o{4)DfKP*;RcA{HA|?{$*LOa&-#OIK_%f$42y{EUvox8wF}uv3N>N8INwAoc+2zJ3*`*QFC9 z=}q#FdFVu#0iem1eVO7CDRo$l!U1#~f}8Qh)}k&9{nV+1kyZK4rf+#_n=>Q$C>>MZ z4=aYzfg#K@*f!C+c}rfE5=h@?oEJfu)8n(rpu>X%gBZ}-#mO?34?|-u47&^T; zkeEBaXoCRDfXHMwEVOj!8*ECasUkFqOnBnIUUR#cVaDC@#1%@Sb*40dCD`NCJ6Nci z>5aRu*I&^PJw>}sCw5UXji6`PM-i`>$R`mGAZPSV@qsx%6K~oIKxRBqj{4E$!93Wi zE20E(d}Tb?P=0=BrY|NP8G(3B-*MNP6A-Nc9^CX|qnm33p5#2c>_mq7RWQVjCe*($ zcK?OP;brYG_Ep45^#a9x87!19*`vhiSFvYSr2TK<;?!|z2b!B?lkM^`PA%lhpE! z8$CF%lfJCh?SGNv*+YdQr+`vG8|oTvKtq3Jp)VeupW{o9$a?fw)BD9L_7R<(cqEJu zU2K{--}h9ZA@f-5^fF|!RTq_9nP@0bNysTHsan}g9C`A`V3qNm+gT}Hmc#z)%_1#EBc#3}wMKsfU!${iY9(L;mL;hv1G>1?k7by7U^uEq@UotL; z&ZoR(Z+_)XA`C$`|H7lqAeJw(S)9;S3E|=G9|b=OYgsF9J<`urZwN%++ju5tLYao5jivz}mliyp14KJglyXJ;xbtL=nS>E4HiF38O^maPG>}&;P!@bwpK;e<20IYyZBLWTmDE zMH>hPa@QA~T}oGNV_T^m z!i5}B$SURFFUenM%0|q<1`tlCsqSK0$j+f_tT-yW&w)VQc_W_fAqtc3w4}X=S^D%vY{8lM&(d7a>Q>vK#;xL$_D!8Cm z0~A~;=cIqvL?J6&Mcxt`%4c<6uBS{qDdylqeP zkP@qaX@kVF#<+@SP?8wzhOWnVvDGZHk$|w#g%xF@&x-gFq9MwqrJ`cxgaK^wUZ856 z_tkJi_v5{LsO!dDX-cdc>5j#Yr~B5(1P_CCeFv#^(6vRQ6rWkGSiyvEbK=4rK}1nt4#SpaoNaw-=c7 zIu7Maf8~*qe}!4Q1{7;=0FqERa%g90O3K%L*-^GSt&`q|PGN|RClCrr>c5DY$TP3xo_cF!PjZFTr6ot0nYi-6340d5* zm#b~T5N7&UQdXIp*_cszarc3zYL9|zx1D>5G_$#k&2{-#AHZc{dM-)s5j#ED4V|J!a0sjdS_A*s3ku8n?N7isUT z*qgdYuXLk~QFxGrdg-uP)okBkj`Im?hu$B7J7O_%N3k5L!NsDfZU(e@(Z`zICUEkW z?u%`!S(-pNw`%fO07W{ZaM!%vS~DStTWU^hSL(TJ=UWo|3+7$f`E}Wy=n(N$U7r+2 zGoyilwVQ@bYq+tbR|@Evd;VizW{#AW9EK9UuP&VN2|ui5DXLtmDKrFKhqGr?wc~Cf zVXyGsoI=Lzr%*IMmDcD)&`#ADY#NQYQMy>w2H8;jj6E^jD-A)K)PDTx&7Gp#%Zz8v zOdWuq2rTDCHR2ivJ!h(` zxGjm?WDEUfheml&1D_`mMAMF!(}9UU!A^7OlA!U(iYQ)bf+n3)n?_x9<%X=p5UU7}A!}ev2B(&g#%%>e$LG ztpJunC!D8YtP6%M9#uCp(KnFSOIpE^f%pVnqatpqxhr|m40jrU`*!A3Dc;D-^A=Ptm3MCX=os~s)}1RI)P8b znH{LIyav0jY{uq@jZBEXqO;k|^@8?i%9nqb|KKmu4F#V)!<0y>Z$})Ssmo?C?L@~4 zRpqCdDK(2+0~L<)paCNcJ4FT&7s>=ebY)J{dG3D_8;n@` zph6pxn+{br15EZSM^G=DD4d$ccom*epsJjX*IC86(url-mxd8KV9}2xU#K-*QS8~DUj*bgHVv=0 zzLVz=RTN5H1P1Ui8Ju0hTuWr-5#1wJ_oy=Tpc4yhfr|Z)8LJegRa^jFnJ4Tntx1#~ z%qZc{-x#RAygPozXF)TJVFYB9H`PE9Ks>dR`WrD{RX1;!U zBr*NdDeLeFIj{j;>-%4yKD3mPcPs3-*DqMyp7|(Bg&LZpQD^{?5A9ZQTJ*2<&>T$# z7W%#)u!<;TL>_ocwCzWF-1mGb^+vDX%|l!M^2U{+;|l^x*7VgE8*^pv4YyncDuB~R zFTdT)aN%-ov;i{bGsd8+3wSbCfp=~cx><~7B~2{tx+xcIeFiu-5wPy{v5ukc6cvNi zbTZG()^q++F=NR41p#jBKal3v-7GG*W;YhOmiR3iS^m@IEWZIGgpDt^yaRxAhAyGW z2f=7prsAoRDo>*(@>+EQFGccLFV>DBYU%U>Qj$)xjq?)Y+43sLxh{UU5Arr8Im1(1 z>xzJV=lgP&s#TQ{?*BaWx{9#^>0=rXplhXZ&}DUZ#R8upOk2rKrNC9Hkf%2HB)2Us zkSEsPe57fT5&boodJ!_Lf4U4{U#+p>zlY$~2%24p9$;65wi{Z2UDR@k|BS3+LpMGf zG;)KkCHh^$c<9u^ZJAS}sNy=3`dSt?Vb{BgZ-NkN+?ce|rr6sE=okPU=Bcr}M5#Ht zuYv;OEDZlNRR}=tl#h@QqfDkc|Dl`LJhkdU1t3X9ua?!NdolU&6fxYYV5(U!JMqJc zpTWI#%&z!7TJ0F_8zBVp`vWT69^BG~1e62tlS6TjotjTb?XvVpJ(k|p_(+nwNP*r{ z|353_G1}6}m}_9G@g7F#);8?>B3bbv8~iOQc?k&L#KjgX)+_+22dhwcvhbT!Xa(vZ zEacx$t(Jhqe5xN-VqO~T`1!$p_^*@ss@q2o+c)-9?|+UYs9)DG_~WJ}RL5}9Bcq~n zT^o*in?ZMJ*zK%{H8)mz|9P@vH~z~TP*9nLV+4h}PH(-#IxPP(2_1S)+2*McPq#y>PRIV{ngRF08=PM@4Ys92g(_fJUUr> zv{OFm+H{~Y^uKS^N@rM&f(@hpueUc3hq8U+#%G9B)+e&Xgrb$~yHVLHk&re^Da%vY zvTrxa60)R)q_Kr0OFVXlFr#c4%5E^i*v4397-sJGMo*9L?>K&cy#Kua%yBs8zOT8i z^E&tQbDq#1FCIMracDo+ADnSqp%p$~ku?`9N37PMkXhF*m&nM0%?iFl4opi~g% zw|K^o!qikGMy_BtPaWM7l&qsrXO8T)hHuS7rfcEQ12inT*83G>s2kyHl#A?O5~B}% z0%NFd?*XOFMMSAyW#&2|ha@qc3vakZY_+r|TfkKu#kw_vysdlX;~Cnt$xndbvVDdz z&C3FanQwZ4AmTOYJbS|CH%`*4K7n&Mq}1-ZcO@NptIJA%C5KKHiTXbuoS(@gp$bdr z{7ViSIOIi$MuvH46D+g{DI232C z0b*>;R#p=~-~39HGP%**AAB*2ec71*O+FtJk$sy!hw0#x;frAP<~>6VBcu&KBHktw z>~?P{gBx?AWAQzwZhFWqZ+wYO=O*sj-v$*{Hle1_#-qBC0n+qj=r8ESj+bNaf#NOf z9}c~CUf%B?barY3?7VvmyZp|@J|~2L5sOs5 zH9w3OF+NgH(UA~TxJ5)kU@qqa=>X1(R%QXVsZOD;Xuk&tf`Z9aO4!W>--Ge0MDQ9K zlq$^xP7Ht(Z4c3zZ|b;e51_KeQ`6_hWhF%fUHO{1hT21J*S zBeGTDKhO)5jvw{9#iPEK;hjj2gI&1Sv?a}0!xd z%z@aEfv-mzX?jFNnY0bigj+`C28Ay>OKo4`$qV3aePz>RrpXeSjpyNB~(JKw)ksir0?*3`$lx zu4-j(SMc`E%&(CBskP1UpTFZVI`= zAT^BrcOm7-R;dg=39B0BWx@0b7VU?P0TD>BV-Q1ySx{8j9s&uxh6*CS%Tc~KhnduYyn6WnSq z)01ezeE<%*e>W_9oo{r-(HL*Q&nj`w<_*wli}V&w7u*&?)9lT01~K9nK)YZv{X5DO zIr#w@_|cXxRXrPd-$PkEnm$3oXw6cr96tv@w6OPm0zn!8mS)ivkbj8DH1%o49r7v*V51Ls@;FF9+rFBQ zv=DjCSexn~M5h54l#QUF6)VU&{CRMG3N?LEBTU&W1HHClO_SjxA`$(wuxq@2yT_Rs zG1$acVl~{#Fgw!WIOfzj{#WOw@LBtU1Rw?7)=k3}jcyt}2}1S-aG4>w>2B7anX{%% zenj#@#wDxS5cK4NU%TsZUdLyI9Ne5EXL*%3sVVL zixq&V%%2J20yH2wVW#)>J$67XcNEZjE-9X%SDjCaW#qyOQMj1(?!OG?BC4*;G_uU|?;jz<^L~&bEo!v{T!vgg1#Ov%4;k!fBwkXZo6UBk)5l;_|M$XXyj|3%ZKi z&-}3&5P6{8v`~{I_%%EOKe5n<*z>d8PB8^ zxpNBB|L=IF{}*56-8^?RGJTwS@A?5thNW!erU94P+IHjEv2SjT49nx4tEKk`kGL*P zxh*MuqtfT)aj}Vg2pNi3)6vc2qPLHgqyl5rTXmK9%M~8sPwsmo^If^Ps&$sIq}aS0 zz3wDGuzZG_g+B2LiS`XdAERuU-+f!ttKy$B+t@roVxP@LHFM*Yia9_HP26+ptj8|S z`_Wv1)EYa_##SR5KM|UPQX^cm-=)1Z5E>rj!88%|-)?oBbYZboodFfu^mOL9bT>oV zhOFX;D$~=~sB}Be?$-R3hf6#Lomf+7Mu44XYwK{}DxObq>sq%5Wx3DfA-J*C!STJwD?kvmY^?k9@0p)#1j;4Wvl;j#F2(F}b8=59B8lS$j{<{lgH{ z0@>bA`tH6n@nVqU!a9rNfcecCADsngNISHJ z#z#X2#;BUfI1_9xpq_t%{1-_f0vZ|vc|^a-be$t;KX2cFm@U$SsohVuP*iZ_n3}i1 z@JwfuBN^gvc!%I7Pg`%z1dA{{2s^#O(|0qYXQ06yKh!h%L0doz6?eCUi`^@FF2xhs zQ*9&o&^RUd+|J*KXHH#Et*!S_p6~Ec;KulNobaU5>1%tGJM?G?ZL@#N`_%wnv(&A6 zl9rlWj-U2>ov3MBNI@%epP|FT}K6*WW$IaY*0bg)^L)m8=6hF3p z8$nIR0RX<$DRs<--y#+(@)To9!~mP4DUvKlFyQ=`{Q?^!zQ8cW=o?SL-oP(ZB9RX* z!?`8({9AW@=Sb$lk3~R1u%*NO+y>4j&eq5!ntG`N#BnSLYyP!*!@9)KvrKr{qQa#1 z7c1?R*Wt_N8lS*2tMePddpzan^VBzeE&lzV-*xPZF|e8DeM`olN4pNVpeFpw)u1Bq zzY?V5R1EX~0?@6Lb4~UPZYV~tor)a^=xKd7L99pDmi5-H0+G%$opzoT!t4CLjq_)% zkq;-=TW2rva^w-t*-_LPv>azbB58km{LHXV--7;hP{h|Q*Y!6CNif?`!&UE5gygH9 zqyz7T`vNZTVEjiM-!441qlhSf>$2yMza8_T;pb6Wc+Y^@^^H%A0YHD|eN6N2w%OP8 zD)gfJuYLZ44|=N4eI6Bg-o@~_an+>m=}snXhM(>YR`FE2RN{-e(9TiojlGXKFjZv$5GtmX4g8!sJ>Eo>Db?^dh+Y{<^9S@7bBS%!3A9z4!;hV zA4NBykTukoYVZWecm2cI5Yy$$!Qvmn>cjcHfQX|>NIH;YX zNhb!i!-Kg9$Wu#a@i3g1$wU9B^Z)@M+5@pT_o-8<=UA?{glD9hpn;6mT<6#2wNulu z)_ptpx|AROHdMl?*?L}2HF_Z=(sgCf8-VL>L}T_#3@JZDC|OUkdB84fJZQ)WN#?z7 z*z$Jo2h3pbs>yVmgKy#54wctA#~u{#So^bjgg-jK9rhC{u89j#s}5jhDIZLOeyuZn zA7hrZbmH|6ik`%0tbIEb&4TeHEmO<5fSa9leLFAc6!XXh7Z7L;9LY5uNyX1DG^D4PDW zMD#&e)vYYkE#1|m z$&+R!C)19OKrO0JO!l85zH{=?J!d2GFOq-&ks$8+_Dd8eb7>ECFJVLY;2xb(86DmV z`OkA)?gEX5JKk(XB-XTzXFJw93#=p-2(wZ@e20%jh_d@D4XXCrE2c!`QV$GEXbO-z z(?+`QTJhVyY#QJB`b(>f3?OlG;CQZUaasqf8ahUg(TjNRa7cfn{BISK{#ZXW_K|&| zb>=vSxA>+n1Z+=Vlyig4E}8)`ghx_}Q&MT)cqhqCs)MUeVP?@+0fc`M(z*h<_o(ESE55C`#3gpa z*cnj`w}#9+%O4Ba`}51^WBD3v^;tSJB+J+M_}}c*K9Za;QGAs6O;?Ti@)ZmpITDX3 z`BX0YlYY6$WKgUDsafi9Gm^`_uc!T z!gTG*jfV<({5+PzWkc`u5k813C9&$e?|I8?x4Ql&R02CJbDc6&u6N_%NzO0@8#_^x zvOAHSOp$>r4gf)J)%cFw|6X8f+<|PyPd?h6-YMyvfQx{roN~D^naAh8~t;%6)@4S$ISsH3U+UzymV(ZPT z8>v8>-1E!+QdnDiXXto?`T^FD^6dml(Md0*a+V@6mx zgNhl^WVAt9XeUSS_ZUL(jNzO^Zx4^Dk8_S7*aG!CeH(mw`S=3VWc5dk#z$cSI$z7V zdo@?x4F7hH{{F*6*|Yp_K@Ge?7}D!3ZCRC)fNq$)b7uz~4xBT2)pjuT2CuFowr#e^ z&hrIkz)Fwc-1C7+88h@n04b={Y*OVoLafb=_Ti=XlY6LPX1@y9GmBkv!j+&d+oC4uLgg?4nT{p@Y^)Cey!kmq znUtB+mA$vovDFK|?f&ZMorAH4Em<6!E}e6%qtfKF;g57(jD+>1>W@bQ{s)K_(d$F$ zMy%q{FcjH-gsa02I?8>62|Q)WG8>V4-Xg9G-!CnC5|MV#TSK<= zDQTTgkD+QzZ(5vk@i%EgPXzC{bV)(jdi3NHA4}DIdPf=YQO4QZ0#dCe>cgzDlZtX< zez&FF%xDu2hx7*;OH2QzSdZr;u^;pq6Qi+a%EZLqx-{wsj*KPqQako!eCt>?CVNrk6Z zRba=};Rfrv-<;3?sP7rNtUr3%uqTvUb#Rn$tm%7__KVnOe)}B1cwOaXDekO5-`lXy z11}y+(U`;D)Cal#QMbA|dC_9oVtrc}I5HJEgW`?qLbVhHazmH}miVhoYE5L3<(+C% zsbXW{_M*(u57P-QGUjV~*oLWMr0H^pTMziY_x790`JAL0M-W(~WG`i2gc2NE&T&K- z?)dJyT7wb7S?G!vyNNUt(k>TWXCt2B^p%#&L}8RG7G@eypQrz%aFP&*p2Z)dy)I)E zkbjkJP%mCM10?i;9wd2B3$Q*4sp{kq1ie3pvZuMpW-Q_CiTUJ8o|;% z3}!+*0oO|=r*#%RLpozSo(BVx?k%Ua%8fg$g@nL89x%BdU}n-o+~*I>v^d~ZDZR8N zwr|g&-P+;*5g{vpGpNVces5=0_Z|a{+H~eRTQ8ql=FDBzXYpz0;%ckHF)NEo3!*J) z%yH4+lju#1Q&Dy{YKikM>Me{&_iCFhXq}~`F$cYcsoD4Eqx-kH-$CV*D~vrIK#ya5 zr|*g^$>5FmX=$0!jb04zIai-Q#1ZCNed}O!)DynpKAQy5mv#FiH%^6OX29cbBsrTV ze}3t9Pp+LUuuy{)TBJYwL*fH7SMGxYW-ay&^H(*Pl-Qd5o?`K114-7|SIcGKv;egAJXoG-KrP6 zLIrhMeDYk*6MR(Nq7?Ar?$Z_Ay%+rj4TXQ^*YnP0o~PNaU-Jsbbrngg<;_4186=&^ z2_ioE68KaNbc|@0@K09J$5pt%>9Nbn{Bw{N{Gg|k%aN8Rz8z^7FpmT(KleJj%oVQ? zz1HME1Wi0KmMhjbxgcY_hw^UEoubfKs(vojCsreU>1bsE@}Z1JtEalp(Zg82U!%NV zddcqX8_Bo7m0wF^xD1jDqi5{8z`B6ipY~zetZaMFr3Z=eiy6k62`?sO7zLeXJM$+N zy=5+f0Y+IVuK>#2-^>AJ859=zb+PF>3Aw5{+lVe4p3FC&g%2nxC?lpYE(tx3jkAQW-Fy&c;QP!{*4Rkt^qVfMPws8W9^HjFn36mbF}3Vos^@Ynzo{ zr?yB`S070^7u5|W&bT(N0IWp7U5`Ga1{P58=W2r6;(Y3gbrV4pSy9~GX`2`t2Vu+& z>&Xnb{=(&8x^RPm|EILTMua|HRd?#$3{PG6o>eRPDuoBkwz2Wk=+Q9Ez11}y^?=n$ zeUOk3{vxOctY*jt@O+NqZCiyvS6s*Z($l1<7JO41- zjDJ%G=-3B{MuyUxhHvVE>Y3;h*AuqRB?;*;;#Q+=EUr=46`= zzS&*NLeuXRR2bv+-Sy*05FsuFUVZP~Gn)-=o)n2~KM1kAE;WIERj8`%Wd-6_2l{i_ zhE~RgC2xQ_u>*U|a^3bFOPm#Wb(Q>L?}mf|Nku&FlUm4}9UslYlL>Lrw82$~nx!A- zb@b)B7O5mGMnnx1rQ_)zR1x{@MP_usulyOa*U1#F0*~zP1-@yQb*Lunf5on(Qo_`q zL3J5>EF-d=Ynv+^`uhR`>M{!Oi-1dTG8UL;^~^oM*mZ+pY4xjSvQw+IqxMYf-5hkp z-qQC*b?OenSbCNGi?h`ewqd&2D+r>_n^;-&@XVR&*O(03SrF14D^M?>w=k&xOR+}_**KP@Lo zHRTP(r+)Z}E3;nY%a>pVB%(X@ZcFDSi^`;mTN10vx_ECRTx~^ou-)gqSHE%UzB+je zOt%8#jcmTLtyO#Vi%y_E`4u6>JvO)^Hkdu;IX{A!v6a}Ep!(YC4q*LeeSMITR%u(8 z&VfM9>r1nbAKPzhL~ij6N7$!3oSsS(GP1=zooA1!-532a!1l5~_R45!t=B}?Qh301 z|CqH({8-p}OWUmSF^)dd`mWj>PHhMhA7w+oNZKXoVa?+?Ugm$H*;e$&iaUVh#~ESh zR;}=_(eJ0MX>Lt93>T)^`y?sNa+s`)qo}HETxVr+C&i$ zXMa-V=Fl1<;h6YV;!{WK9E=hiBgj8qB`LrF4yd_l8c!N`s_qM|EKexZ>v}X~>{vZB zyrxXj$vnQ04yDpB9sDpvS}~g7@nYg@Fp#cKsD=j?v;)E`_``JkObU>Z#u_mXd_%=A z0;uc_pgnv2BXQ&L_qCpi?O)`)v@Q?3!aKLOAhTv31HOOpce3~j5}F_2&SW!UTkT9t zValJ5xd%GSuWQLywIBy56<_v&Lw9?loTgD%O28;DrlQ%5uY&HwT_C!$?1I6*0>4xJ znIL$PX068)Foh;|1dtYhz}^bH$KE+F_Gfde*;9b-q;;S8mQap;&*Z&#|HNb7L9?Ki zoDk(J4@t7cz+F3}c0Q-TMwM`?`$)*dm>w3^*>raUKQ0eH9C+Ma)M-e5)tossl!mUG z(K5^hUk>**%1KoxB&AoX?XD~UO^4ux6G_PXked!LbaYcf_C&3RmH?vOnU5}PslwLK ztLm`7s#q!ObPoRh3j}AdC`t3nGxvSAAtoD9+0!BQ)?t&~@YN1GiY{$*UqFf!7Z&`u z)N`BeoQ2Sw$G>m487sZrXfdfRNkfJXXa904(A-Vo3(0$&-=r44oy0yn6~;W$=k&yS z48us#`t*~83lW&C(zSKFy@2hu;av(53=BsC?h3is972yPy=Bzwp~uw0sY1pv^%24- zHlF8+I~duHd|2d0ZIB@^s=eM`cF+;v(O%;9*P+a3#Ry?2n6>hcF)#}_w$vsvqtGHT z>Mf#WH5nRJ5!-1ssm)4Tcayk*5_v|mc*|@~BK-U~tuuA&uPxf|OA{7^d1zqwg%n+H zD^hxwP-VS;&#Vs_z1(*xa?$QRfL8}_=%SOCz!z|r;@{EaT-Hi4%uH~+Dka2zO_+CC zPH3hj1-6e5y(WJWUDeq%i*_hvY~0ucB`CYS-{$HG_ny38cdTpZ9|j*^81-I0QLBH? z1uAkXjU9dSc$t4k-uS^F=}9xf4Y6=NdfDwCmj@?mw7ex{I`7d@wd3F+&hURjS}699 zrgkZIYDcgABG(_}nC+wuXp#6^aQ316j&{J$fbNy~SNa@*oyrbuYT=I6c zKMEl{dSJQ*D_ZJC;I~avr(5L=to&(ufS0+>D(uRW_{FF@HZ|OId6bdi_M<JQrMGAt^G) z5}66RX|VEZ%;s9)!^8_31~LcQb_D$C>w+*{li4IvX!d-5kC_Kn&U@n9D4m<0(1(ZM z`u`=5zQP0qKrH?7z_GvB8c?VT+d4fYW+Slu8Hli+#&gT>OwVstN;Z)4{wBUG&M_Nv zPe>JyA=vgqrwybDOI?4^&hQb6UNNA2>+BNwB5*iER725>rZ+C5yP-{tM;ld~uiOL% z1v89a|C@Ci-VAck+9Z?ieFaH3@4vEr$D14Cr++TAP6#RrC1--D?|%PQhS-K8ABsK4 zk_c3fma87DzG+vyr)?r8cJ4Hu`4BxBrBH0K?kBMN8|_gC&w|SvAIX}+&%4{CSL{eu zL?8K8d}9&=lL~C+SX-y!zNkL*DtsW4bLidb9(naK!sD)>r^$-^-uriEzmG!1c){;f zSg^LFyZ($(@?gl;3$DXS{ws3i!#OdbO?bz@r1HMjiqWY*n`XB*_NT-)2z^WKUJGp(~P_cOFn zIG}?A`BP)0ZD-bH|L(fFRq#3@d7mwKC3jf!bBOSA7ccon_6n}Jm4Vr@;rIdWpvlXT z&K=e$rDDGi=ju%Am&@;e!}n6=3d$G`9$Y)5MMDne8BFdV)=rQ}3q6`QJo|y@BJ?%H z0Qdj=IFubb?q;p)SgDr+k7i-CMh~E0l%DHESBl>e60U}Zi~lDtZm_yRs7BATXP3SG z;7NA>R;hPt{HNFO5A688&B>Q!q+bOty_av5mxdJ8fA?T^IO<1#GgM`7yAwxpTJN)? z2n=(3uyXS?z9KD>oZiuun|5Z;?vBH*d1J?z8E}5aapIc7dx1yeWJwQLKLpVG_iif< ztHNO?KUbPJ>fh`OuBaRAA8I-?u_brp zHq>_PH81yfdVCQv>bn?&Ig!~^? Cz%7>m literal 0 HcmV?d00001 diff --git a/themes/space-pixel/source/alien_animation/climbing_action_start.png.import b/themes/space-pixel/source/alien_animation/climbing_action_start.png.import new file mode 100644 index 0000000..adae81f --- /dev/null +++ b/themes/space-pixel/source/alien_animation/climbing_action_start.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1sspdi4ir8rc" +path="res://.godot/imported/climbing_action_start.png-3b595123148dd874df8e3c2391030f0e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/source/alien_animation/climbing_action_start.png" +dest_files=["res://.godot/imported/climbing_action_start.png-3b595123148dd874df8e3c2391030f0e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/source/alien_animation/climbing_action_stop.png b/themes/space-pixel/source/alien_animation/climbing_action_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..da6d719f12e53470d202b178e44ba31249b11199 GIT binary patch literal 24552 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%0Al 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%0A+{hw$V(_r=vT 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 literal 0 HcmV?d00001 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/hanging.png.import b/themes/space-pixel/package/assets/animations/alien_pet/hanging.png.import new file mode 100644 index 0000000..d8b91df --- /dev/null +++ b/themes/space-pixel/package/assets/animations/alien_pet/hanging.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7d45p4xo6waq" +path="res://.godot/imported/hanging.png-b2789e9f89ccc9fedce7d4e0b20a9a23.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://themes/space-pixel/package/assets/animations/alien_pet/hanging.png" +dest_files=["res://.godot/imported/hanging.png-b2789e9f89ccc9fedce7d4e0b20a9a23.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/themes/space-pixel/package/assets/animations/alien_pet/idle.png b/themes/space-pixel/package/assets/animations/alien_pet/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..99a2960ea52e224e695021db55cd60a0a6f59bd2 GIT binary patch literal 38524 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