feat: multi-package loading with base framework support
- Add RuntimeOptions.basePackages for loading framework packages before game package - Add ScriptEngine.loadPackages() for multi-package module merging - LuaDardoScriptEngine merges modules from all packages, game overrides framework - PackageActivationController loads base packages first, then game package - GamePackageManifest parses optional 'base' field - Update docs: README, quick-start, lua-package-format, architecture - Update all test mocks with loadPackages() implementation
This commit is contained in:
@@ -27,15 +27,34 @@ class LuaDardoScriptEngine implements ScriptEngine {
|
||||
Future<void> loadPackage(
|
||||
GamePackage package, {
|
||||
RuntimeScriptServices services = const RuntimeScriptServices(),
|
||||
}) {
|
||||
return loadPackages([package], services: services);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> loadPackages(
|
||||
List<GamePackage> packages, {
|
||||
RuntimeScriptServices services = const RuntimeScriptServices(),
|
||||
}) async {
|
||||
if (packages.isEmpty) {
|
||||
throw const FormatException('loadPackages requires at least one package');
|
||||
}
|
||||
|
||||
_services = services;
|
||||
_networkRequestCounter = 0;
|
||||
_hostCallCounter = 0;
|
||||
final script = await package.readText(package.manifest.entry);
|
||||
_moduleScripts = {};
|
||||
for (final entry in package.manifest.modules.entries) {
|
||||
_moduleScripts[entry.key] = await package.readText(entry.value);
|
||||
|
||||
// 按顺序加载所有包的模块,后加载的同名模块覆盖先加载的。
|
||||
for (final package in packages) {
|
||||
for (final entry in package.manifest.modules.entries) {
|
||||
_moduleScripts[entry.key] = await package.readText(entry.value);
|
||||
}
|
||||
}
|
||||
|
||||
// 入口脚本使用最后一个包(游戏包)。
|
||||
final entryPackage = packages.last;
|
||||
final script = await entryPackage.readText(entryPackage.manifest.entry);
|
||||
_loadingModules.clear();
|
||||
|
||||
_lua = LuaState.newState();
|
||||
|
||||
Reference in New Issue
Block a user