diff options
Diffstat (limited to 'addons/escoria-core/plugin.gd')
| -rw-r--r-- | addons/escoria-core/plugin.gd | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/addons/escoria-core/plugin.gd b/addons/escoria-core/plugin.gd new file mode 100644 index 0000000..8c5dc09 --- /dev/null +++ b/addons/escoria-core/plugin.gd @@ -0,0 +1,613 @@ +@tool +## Plugin script to initialize Escoria +extends EditorPlugin + +## Comma separator const used to build enabled extensions. +const COMMA_SEPARATOR = "," + +## ESC files extension. +const ESC_SCRIPT_EXTENSION = "esc" +const ASH_SCRIPT_EXTENSION = "ash" +const ASHES_ANALYZER_MENU_ITEM = "Analyze ASHES Scripts" + + +## The warning popup displayed on escoria-core enabling. +var popup_info: AcceptDialog + +## ASHES scripts analyzer. Needed to allow calling the analyzer from +## Project>Tools menu. +var _compiler_analyzer: ESCAshesAnalyzer = ESCAshesAnalyzer.new() + + +## Virtual function called when plugin is enabled.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _enable_plugin(): + add_autoload_singleton( + "escoria", + "res://addons/escoria-core/game/esc_autoload.gd" + ) + # Prepare settings + _set_escoria_main_settings() + _set_escoria_debug_settings() + _set_escoria_ui_settings() + _set_escoria_sound_settings() + _set_escoria_platform_settings() + _set_filesystem_show_esc_files() + + # Define standard settings + ProjectSettings.set_setting( + "application/run/main_scene", + "res://addons/escoria-core/game/main_scene.tscn" + ) + + ProjectSettings.set_setting( + "audio/buses/default_bus_layout", + "res://addons/escoria-core/buses/default_bus_layout.tres" + ) + + popup_info = AcceptDialog.new() + popup_info.dialog_text = """You enabled escoria-core plugin. + + Please ignore error messages in Output console and reload your project using + Godot editor's \"Project / Reload Current Project\" menu. + """ + popup_info.confirmed.connect(self._on_warning_popup_confirmed, CONNECT_ONE_SHOT) + get_editor_interface().get_editor_main_screen().add_child(popup_info) + popup_info.popup_centered() + + +## Callback for warning popup displayed on escoria-core plugin enabling.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _on_warning_popup_confirmed(): + popup_info.queue_free() + + +## Virtual function called when plugin is disabled.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _disable_plugin(): + remove_autoload_singleton("escoria") + _set_filesystem_hide_esc_files() + + +## Called when Escoria plugin gets added to Godot Editor's tree.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _enter_tree(): + # have to add this here since reloading the project doesn't re-add the Tools menu item + add_tool_menu_item(ASHES_ANALYZER_MENU_ITEM, _compiler_analyzer.analyze) + + +## Called when Escoria plugin gets removed from Godot Editor's tree.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _exit_tree(): + remove_tool_menu_item(ASHES_ANALYZER_MENU_ITEM) + + +## Prepare the settings in the Escoria UI category[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_escoria_ui_settings(): + register_setting( + ESCProjectSettingsManager.DEFAULT_DIALOG_TYPE, + "", + { + "type": TYPE_STRING + } + ) + print("Default dialog type has been reset!") + + register_setting( + ESCProjectSettingsManager.GAME_SCENE, + "", + { + "name": ESCProjectSettingsManager.GAME_SCENE, + "type": TYPE_STRING, + "hint": PROPERTY_HINT_FILE, + "hint_string": "*.tscn, *.scn" + } + ) + + register_setting( + ESCProjectSettingsManager.INVENTORY_ITEMS_PATH, + "res://game/items/inventory/", + { + "name": ESCProjectSettingsManager.INVENTORY_ITEMS_PATH, + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.DEFAULT_TRANSITION, + "curtain", + { + "name": ESCProjectSettingsManager.DEFAULT_TRANSITION, + "type": TYPE_STRING, + "hint": PROPERTY_HINT_ENUM_SUGGESTION, + "hint_string": "instant,fade_black,fade_white,curtain" + } + ) + + register_setting( + ESCProjectSettingsManager.TRANSITION_PATHS, + [ + "res://addons/escoria-core/game/scenes/transitions/shaders/" + ], + { + "name": ESCProjectSettingsManager.TRANSITION_PATHS, + "type": TYPE_PACKED_STRING_ARRAY, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.INVENTORY_ITEM_SIZE, + Vector2(72, 72), + { + "name": ESCProjectSettingsManager.INVENTORY_ITEM_SIZE, + "type": TYPE_VECTOR2 + } + ) + + register_setting( + ESCProjectSettingsManager.DIALOG_MANAGERS, + [], + { + "type": TYPE_PACKED_STRING_ARRAY + } + ) + + +## Prepare the settings in the Escoria main category[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_escoria_main_settings(): + register_setting( + ESCProjectSettingsManager.GAME_VERSION, + "", + { + "type": TYPE_STRING + } + ) + + register_setting( + ESCProjectSettingsManager.GAME_START_SCRIPT, + "", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_FILE, + "hint_string": "*.esc,*.ash" + } + ) + + register_setting( + ESCProjectSettingsManager.ACTION_DEFAULT_SCRIPT, + "", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_FILE, + "hint_string": "*.esc,*.ash" + } + ) + + register_setting( + ESCProjectSettingsManager.FORCE_QUIT, + true, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.COMMAND_DIRECTORIES, + [ + "res://addons/escoria-core/game/core-scripts/esc/commands" + ], + { + "type": TYPE_ARRAY, + } + ) + + register_setting( + ESCProjectSettingsManager.TEXT_LANG, + TranslationServer.get_locale(), + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_NONE + } + ) + + register_setting( + ESCProjectSettingsManager.VOICE_LANG, + TranslationServer.get_locale(), + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_NONE + } + ) + + register_setting( + ESCProjectSettingsManager.SAVEGAMES_PATH, + "user://saves/", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.SETTINGS_PATH, + "user://", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.GAME_MIGRATION_PATH, + "", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.WINDOW_MODE, + false, + { + "type": TYPE_BOOL, + } + ) + + +## Prepare the settings in the Escoria debug category[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_escoria_debug_settings(): + register_setting( + ESCProjectSettingsManager.TERMINATE_ON_WARNINGS, + false, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.TERMINATE_ON_ERRORS, + true, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.DEVELOPMENT_LANG, + "en", + { + "type": TYPE_STRING + } + ) + + register_setting( + ESCProjectSettingsManager.LOG_LEVEL, + "ERROR", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_ENUM, + "hint_string": "ERROR,WARNING,INFO,DEBUG,TRACE" + } + ) + + register_setting( + ESCProjectSettingsManager.LOG_FILE_PATH, + "user://", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.CRASH_MESSAGE, + "We're sorry, but the game crashed. Please send us the " + + "following files:\n\n%s", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_MULTILINE_TEXT + } + ) + + register_setting( + ESCProjectSettingsManager.ENABLE_ROOM_SELECTOR, + false, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.ROOM_SELECTOR_ROOM_DIR, + "", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.ENABLE_HOVER_STACK_VIEWER, + false, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.PERFORM_SCRIPT_ANALYSIS_AT_RUNTIME, + true, + { + "type": TYPE_BOOL + } + ) + + +## Prepare the settings in the Escoria sound settings[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_escoria_sound_settings(): + register_setting( + ESCProjectSettingsManager.MASTER_VOLUME, + 1, + { + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,1" + } + ) + + register_setting( + ESCProjectSettingsManager.MUSIC_VOLUME, + 1, + { + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,1" + } + ) + + register_setting( + ESCProjectSettingsManager.SFX_VOLUME, + 1, + { + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,1" + } + ) + + register_setting( + ESCProjectSettingsManager.AMBIENT_VOLUME, + 1, + { + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,1" + } + ) + + register_setting( + ESCProjectSettingsManager.SPEECH_VOLUME, + 1, + { + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0,1" + } + ) + + register_setting( + ESCProjectSettingsManager.SPEECH_ENABLED, + true, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.SPEECH_FOLDER, + "res://speech", + { + "type": TYPE_STRING, + "hint": PROPERTY_HINT_DIR + } + ) + + register_setting( + ESCProjectSettingsManager.SPEECH_EXTENSION, + "ogg", + { + "type": TYPE_STRING + } + ) + + +## Prepare the settings in the Escoria platform category and may need special setting per build.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_escoria_platform_settings(): + # Skip cache - certain platforms (esp. mobile) lack memory for caching + # scenes. If set to true, all generic scenes (UI, inventory, etc) will be + # loaded as any other scene. + register_setting( + ESCProjectSettingsManager.SKIP_CACHE, + false, + { + "type": TYPE_BOOL + } + ) + + register_setting( + ESCProjectSettingsManager.SKIP_CACHE_MOBILE, + true, + { + "type": TYPE_BOOL + } + ) + + +## Register a new project setting if it hasn't been defined already[br] +## [br] +## #### Parameters[br] +## [br] +## | Name | Type | Description | Required? |[br] +## |:-----|:-----|:------------|:----------|[br] +## |name|`String`|Fully qualified Project Settings key to register.|yes|[br] +## |default|`Variant`|Default value|yes|[br] +## |info|`Dictionary`|Property info for the setting|yes|[br] +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +static func register_setting(name: String, default: Variant, info: Dictionary) -> void: + if not ProjectSettings.has_setting(name): + # Only core settings should set this to true. Settings configured in + # plugins should not set this to true. + info["core_setting"] = "true" + ProjectSettings.set_setting( + name, + default + ) + info.name = name + ProjectSettings.add_property_info(info) + + +## Sets the Godot Editor settings to display ESC files in the filesystem.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_filesystem_show_esc_files(): + print("setting esc and ash files display") + var settings = EditorInterface.get_editor_settings() + var displayed_extensions: PackedStringArray = settings.get_setting( + "docks/filesystem/textfile_extensions").split(COMMA_SEPARATOR) + var needs_modification: bool = false + if not ESC_SCRIPT_EXTENSION in displayed_extensions: + displayed_extensions.append(ESC_SCRIPT_EXTENSION) + needs_modification = true + if not ASH_SCRIPT_EXTENSION in displayed_extensions: + displayed_extensions.append(ASH_SCRIPT_EXTENSION) + needs_modification = true + if needs_modification: + settings.set_setting( + "docks/filesystem/textfile_extensions", + COMMA_SEPARATOR.join(displayed_extensions) + ) + if not displayed_extensions.has(ASH_SCRIPT_EXTENSION): + displayed_extensions.append(ASH_SCRIPT_EXTENSION) + settings.set_setting( + "docks/filesystem/textfile_extensions", + COMMA_SEPARATOR.join(displayed_extensions) + ) + + +## Sets the Godot Editor settings to hide ESC and ASH files in the filesystem.[br] +## [br] +## #### Parameters[br] +## [br] +## None. +## [br] +## #### Returns[br] +## [br] +## Returns nothing. +func _set_filesystem_hide_esc_files(): + print("setting esc files hide") + var settings = EditorInterface.get_editor_settings() + var displayed_extensions: PackedStringArray = settings.get_setting( + "docks/filesystem/textfile_extensions").split(COMMA_SEPARATOR) + var index_esc: int = displayed_extensions.find(ESC_SCRIPT_EXTENSION) + var index_ash: int = displayed_extensions.find(ASH_SCRIPT_EXTENSION) + var needs_modification: bool = false + while index_esc != -1: + displayed_extensions.remove_at(index_esc) + index_esc = displayed_extensions.find(ESC_SCRIPT_EXTENSION) + needs_modification = true + while index_ash != -1: + displayed_extensions.remove_at(index_ash) + index_ash = displayed_extensions.find(ASH_SCRIPT_EXTENSION) + needs_modification = true + if needs_modification: + settings.set_setting( + "docks/filesystem/textfile_extensions", + COMMA_SEPARATOR.join(displayed_extensions) + ) |
