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:
@@ -16,11 +16,31 @@ export const LEGACY_TEMPLATES: NpcFamilyDef[] = [
|
||||
{ id: 'n-nulei', name: '怒雷祝氏', region: '东丘雷泽', style: '兵修蛮门', desc: '雷泽蛮族的世仇,性情火爆,最易生衅。', leaderRealm: 'core', initialPower: 300, powerGrowth: [5, 13], sells: [], buys: ['lingkuang', 'beastcore'] }
|
||||
]
|
||||
|
||||
/** 新贵词库(风格/区域/词根——生成非老牌世家模板) */
|
||||
const GEN_STYLES = ['剑修世家', '丹道世家', '商盟世族', '兵修蛮门', '符箓仙门', '灵植谷户', '阵道门阀', '散修聚落']
|
||||
const GEN_REGIONS = ['北岳玄影峰', '西川药谷', '南都连港', '东丘雷泽', '南麓青泽', '西山雾谷', '东溪云汉', '北原古井']
|
||||
const GEN_SUFFIX = ['氏', '氏', '宗', '寨', '门']
|
||||
const GEN_FAM = ['玄', '墨', '楚', '白', '萧', '洛', '燕', '秦', '顾', '周', '华', '苏']
|
||||
/** 新贵词库(默认池——MOD/插件可注入扩展;默认不变 → 基准世界不变) */
|
||||
const DEFAULT_GEN_STYLES = ['剑修世家', '丹道世家', '商盟世族', '兵修蛮门', '符箓仙门', '灵植谷户', '阵道门阀', '散修聚落']
|
||||
const DEFAULT_GEN_REGIONS = ['北岳玄影峰', '西川药谷', '南都连港', '东丘雷泽', '南麓青泽', '西山雾谷', '东溪云汉', '北原古井']
|
||||
const DEFAULT_GEN_SUFFIX = ['氏', '氏', '宗', '寨', '门']
|
||||
const DEFAULT_GEN_FAM = ['玄', '墨', '楚', '白', '萧', '洛', '燕', '秦', '顾', '周', '华', '苏']
|
||||
|
||||
/** 聚合词库池(MOD/插件注入端;读取端 worldgen 消费) */
|
||||
export const WorldGenPools = {
|
||||
styles: [...DEFAULT_GEN_STYLES],
|
||||
regions: [...DEFAULT_GEN_REGIONS],
|
||||
suffixes: [...DEFAULT_GEN_SUFFIX],
|
||||
fams: [...DEFAULT_GEN_FAM],
|
||||
add(part: { styles?: string[]; regions?: string[]; suffixes?: string[]; fams?: string[] }): void {
|
||||
if (part.styles) for (const s of part.styles) if (!this.styles.includes(s)) this.styles.push(s)
|
||||
if (part.regions) for (const r of part.regions) if (!this.regions.includes(r)) this.regions.push(r)
|
||||
if (part.suffixes) for (const s of part.suffixes) if (!this.suffixes.includes(s)) this.suffixes.push(s)
|
||||
if (part.fams) for (const f of part.fams) if (!this.fams.includes(f)) this.fams.push(f)
|
||||
},
|
||||
reset(): void {
|
||||
this.styles = [...DEFAULT_GEN_STYLES]
|
||||
this.regions = [...DEFAULT_GEN_REGIONS]
|
||||
this.suffixes = [...DEFAULT_GEN_SUFFIX]
|
||||
this.fams = [...DEFAULT_GEN_FAM]
|
||||
}
|
||||
}
|
||||
|
||||
export interface WorldGenResult {
|
||||
seed: string
|
||||
@@ -52,17 +72,17 @@ export function generateWorld(seed: string): WorldGenResult {
|
||||
const npcs: NpcFamilyDef[] = [...legacy]
|
||||
const frontier = count - legacy.length
|
||||
for (let k = 0; k < frontier; k++) {
|
||||
const region = GEN_REGIONS.filter((r) => !usedRegions.has(r))
|
||||
const regionPick = region.length > 0 ? region[rng.int(0, region.length - 1)]! : GEN_REGIONS[rng.int(0, GEN_REGIONS.length - 1)]!
|
||||
const stylePick = GEN_STYLES[rng.int(0, GEN_STYLES.length - 1)]!
|
||||
const region = WorldGenPools.regions.filter((r) => !usedRegions.has(r))
|
||||
const regionPick = region.length > 0 ? region[rng.int(0, region.length - 1)]! : WorldGenPools.regions[rng.int(0, WorldGenPools.regions.length - 1)]!
|
||||
const stylePick = WorldGenPools.styles[rng.int(0, WorldGenPools.styles.length - 1)]!
|
||||
usedRegions.add(regionPick)
|
||||
// 去重:家名组合回溯(同 seed 确定性;至多 8 次重抽)
|
||||
let fam = GEN_FAM[rng.int(0, GEN_FAM.length - 1)]!
|
||||
let suffix = GEN_SUFFIX[rng.int(0, GEN_SUFFIX.length - 1)]!
|
||||
let fam = WorldGenPools.fams[rng.int(0, WorldGenPools.fams.length - 1)]!
|
||||
let suffix = WorldGenPools.suffixes[rng.int(0, WorldGenPools.suffixes.length - 1)]!
|
||||
let name = `${fam}${suffix}`
|
||||
for (let t = 0; t < 8 && usedNames.has(name); t++) {
|
||||
fam = GEN_FAM[rng.int(0, GEN_FAM.length - 1)]!
|
||||
suffix = GEN_SUFFIX[rng.int(0, GEN_SUFFIX.length - 1)]!
|
||||
fam = WorldGenPools.fams[rng.int(0, WorldGenPools.fams.length - 1)]!
|
||||
suffix = WorldGenPools.suffixes[rng.int(0, WorldGenPools.suffixes.length - 1)]!
|
||||
name = `${fam}${suffix}`
|
||||
}
|
||||
usedNames.add(name)
|
||||
|
||||
Reference in New Issue
Block a user