MagicNStuff/source/addons/run-configs/run-config-manager.gd
2025-02-25 22:07:11 +01:00

113 lines
2.8 KiB
GDScript

extends Node
const CONFIGS_BASE_PATH := "run_configs"
const _CONFIGS_DATA_PATH := "/data"
const _CONFIGS_PATH := CONFIGS_BASE_PATH + _CONFIGS_DATA_PATH + "/configs"
const _CURRENT_CONFIG_PATH := CONFIGS_BASE_PATH + _CONFIGS_DATA_PATH + "/current"
const RunConfig := preload("res://addons/run-configs/models/run_config.gd")
func _init():
if not OS.has_feature(&"editor"):
return
if Engine.is_editor_hint():
return
var config := get_current_config()
if not config:
return
var env = config.environment_variables
for key in env.keys():
OS.set_environment(key, env[key])
print_rich("[color=grey][Run Config][/color] [color=white]Applied environment variables from the [b]%s[/b] config." % config.name)
func _ready():
var config := get_current_config()
if not config: return
if config.custom_scene != "" and get_tree().current_scene.scene_file_path != config.custom_scene:
print_rich("[color=grey][Run Config][/color] [color=yellow][Warn][/color] The [b]%s[/b] config has a custom scene set, but the game is ran from the regular Run button. Please use the config Run button to run the custom scene." % config.name)
## API
static func get_current_config() -> RunConfig:
var ind := get_current_config_index()
var configs := load_configs()
if ind < 0 or ind >= configs.size():
return null
return configs[ind]
static func load_configs() -> Array[RunConfig]:
var settings = ProjectSettings.get_setting(_CONFIGS_PATH)
var configs: Array[RunConfig] = []
if not settings:
return configs
for json in settings:
var config := RunConfig.new()
config.deserialize(json)
configs.append(config)
return configs
static func set_configs(configs: Array[RunConfig]) -> void:
var config_jsons = []
for config in configs:
config_jsons.append(config.serialize())
ProjectSettings.set_setting(_CONFIGS_PATH, config_jsons)
ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
ProjectSettings.save()
static func add_config(new_config := RunConfig.new()) -> void:
var configs = ProjectSettings.get_setting(_CONFIGS_PATH)
if not configs:
configs = []
configs.append(new_config.serialize())
ProjectSettings.set_setting(_CONFIGS_PATH, configs)
ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
ProjectSettings.save()
static func remove_config_index(ind: int) -> void:
var configs: Array = ProjectSettings.get_setting(_CONFIGS_PATH)
if not configs:
configs = []
return
configs.remove_at(ind)
ProjectSettings.set_setting(_CONFIGS_PATH, configs)
ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
ProjectSettings.save()
static func set_current_config_index(id: int) -> void:
ProjectSettings.set_setting(_CURRENT_CONFIG_PATH, id)
ProjectSettings.save()
static func get_current_config_index() -> int:
var ind = ProjectSettings.get_setting(_CURRENT_CONFIG_PATH)
if ind != null:
return ind
return -1