113 lines
2.8 KiB
GDScript
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
|