v0.1.25: 乾坤一统——MOD 系统首版(1040 全绿,金钟罩不漂)
【P0 修复(0.1.24 遗留)】worldGen.npcs defs 落档 + normalize 幂等重注册——读档后
动态家族(n-g-*)npcById 永命中;MOD 卸载后存档世界仍完整(存档世界永稳)
【MOD 系统四层】
- M2 内容层:modSchema.ts(ModPack 全 JSON:manifest+data{events/npcs/worldgen/pills/forges};
modParse 纯解析校验 id/name/version/事件模板合法性)
- M3 管理器:modToPlugin(MOD→CotycPlugin 一等子类——插件持久化/双闸/启停/回滚全复用)
- M1 传输层:main IPC mods:scan/read(userData/mods/*.json|*.cotymod)+ preload + env.d.ts
+ store refreshMods/installModByName/installModText
- M4 UI:SettingsPanel「MOD 层」卡(扫描目录/候选列表/安装);内置示例包通路
【世界/插件协同】
- WorldGenPools 聚合词库池(默认不变→基准世界不变;reset() 供隔离);MOD 于新档参与生成
- items.ts 配方聚合注册表(PILL/FORGE base+扩展);PluginContext addPillRecipe/addForgeRecipe/addWorldGenPool
【边界(明注)】灾因/世界数值表注入归平衡版;脚本型 MOD 不做;MOD 只影响新档世界(老档不变形)
【测试】1040 全绿(46 套件):worldGen 存档 1 例 + mod-system 5 例(解析/转换/模板/依赖/基准指纹);
金钟罩 0.1.24 基线未漂(世界生成默认池不变);build 通过
This commit is contained in:
@@ -208,6 +208,29 @@ ipcMain.handle('save:export', async (_ev, json: string, defaultName: string) =>
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle('mods:scan', async () => {
|
||||
const dir = join(app.getPath('userData'), 'mods')
|
||||
try {
|
||||
if (!existsSync(dir)) return { ok: true as const, files: [] }
|
||||
const { readdirSync } = await import('fs')
|
||||
const files = readdirSync(dir).filter((f) => f.endsWith('.json') || f.endsWith('.cotymod'))
|
||||
return { ok: true as const, files }
|
||||
} catch (e) {
|
||||
return { ok: false as const, error: String(e) }
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle('mods:read', async (_ev, name: string) => {
|
||||
const dir = join(app.getPath('userData'), 'mods')
|
||||
try {
|
||||
const safe = normalize(decodeURIComponent(name)).split(sep).slice(-1)[0]!
|
||||
const text = readFileSync(join(dir, safe), 'utf-8')
|
||||
return { ok: true as const, text }
|
||||
} catch (e) {
|
||||
return { ok: false as const, error: String(e) }
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle('save:import', async () => {
|
||||
const win = BrowserWindow.getFocusedWindow() ?? mainWindow
|
||||
const result = await dialog.showOpenDialog(win!, {
|
||||
|
||||
Reference in New Issue
Block a user