Godot-Moddable-Template/autoload/ModLoader.gd

59 lines
1.8 KiB
GDScript3
Raw Permalink Normal View History

extends Node
var mod_paths := []
var mod_manifests := {}
const MODS_DIR := "res://mods"
func _ready():
load_mods(MODS_DIR)
load_mod_content()
func load_mods(base_path: String):
var dir := DirAccess.open(base_path)
if not dir:
push_error("No mods folder found.")
return
for folder in dir.get_directories():
var mod_path = base_path + "/" + folder
var manifest_path = mod_path + "/manifest.json"
if FileAccess.file_exists(manifest_path):
var manifest_file := FileAccess.open(manifest_path, FileAccess.READ)
var manifest : Dictionary = JSON.parse_string(manifest_file.get_as_text())
if typeof(manifest) == TYPE_DICTIONARY: # always true ?
mod_paths.append(mod_path)
mod_manifests[manifest["id"]] = manifest
print("Mod loaded: %s" % manifest["name"])
func load_units(units_path: String):
var dir := DirAccess.open(units_path)
if dir:
for file in dir.get_files():
if file.get_extension() == "json":
var file_path = units_path + "/" + file
var f := FileAccess.open(file_path, FileAccess.READ)
if f:
var data = JSON.parse_string(f.get_as_text())
if typeof(data) == TYPE_DICTIONARY:
ContentRegistry.register_unit(data)
print("Unit loaded: %s" % data["id"])
func load_buildings(buildings_path: String):
var dir := DirAccess.open(buildings_path)
if dir:
for file in dir.get_files():
if file.get_extension() == "json":
var file_path = buildings_path + "/" + file
var f := FileAccess.open(file_path, FileAccess.READ)
if f:
var data = JSON.parse_string(f.get_as_text())
if typeof(data) == TYPE_DICTIONARY:
ContentRegistry.register_building(data)
print("Building loaded: %s" % data["id"])
func load_mod_content():
for mod_path in mod_paths:
load_units(mod_path + "/units")
load_buildings(mod_path + "/buildings")