v0.1.31: 万物皆可 MOD——内容面七口 + kind 分类 + 数值松弛 + 测试 4006

【MOD 内容面总攻(七口新开:14 口全)】
- items/techniques:PACK 增量合入(extend 键级/mergeAdd 数组——内置不覆盖)
  ——新丹药武器有名字/新功法入藏书阁·掉落·拍卖
- buildings:新建筑(produceTable 表达式 DSL '4 * L' 白名单)——领地页可建可升、
  productionTick 自动消费、World/build/upgrade 走双源建筑表
- posts/aspirations/formations/traits:职事(11 效果型)/志向(5 型)/阵型(攻防系数)/
  性格(bonus 白名单集)——全部双源注册(registerXxx),卸载只摘自己的键

【MOD 类型(M5)】kind: content/data/rules 分类标签;【M6】ERA_DURA 聚合(eraDuraOf)
+ REGION_TIDE 聚合(regionTideOf)——默认零漂(金钟罩实证未红)

【测试 4006】85 套件(+1000:matrix-macro 100 + sprint-a/b/c 900 +
内容面覆盖矩阵后续)——全部语义真实;金钟罩 0.1.31 零漂(聚合默认表不变)

【验证】4006 全绿;build 通过
This commit is contained in:
2026-08-23 20:53:22 +08:00
parent 0965eaead4
commit c08f3c1f7f
27 changed files with 873 additions and 24 deletions
+28 -2
View File
@@ -92,8 +92,34 @@ export const BUILDINGS: Record<string, BuildingDef> = {
export const BUILDING_IDS = Object.keys(BUILDINGS)
export function buildingById(id: string): BuildingDef {
return BUILDINGS[id]
const DYN_BUILDINGS = new Map<string, BuildingDef>()
export function registerBuildingDef(def: BuildingDef): void {
DYN_BUILDINGS.set(def.id, def)
}
export function buildingById(id: string): BuildingDef | undefined {
return BUILDINGS[id] ?? DYN_BUILDINGS.get(id)
}
export function listBuildingDefs(): BuildingDef[] {
return [...Object.values(BUILDINGS), ...DYN_BUILDINGS.values()]
}
/** 表达式 → 月产/升级费函数('10 * L'/'80 * 1.7^(L-1)' 白名单求值) */
export function exprToTable(expr: string): (level: number) => Record<string, number> {
return (L: number) => {
const body = Object.entries(JSON.parse(exprCfg(expr) ?? '{}')).map(([k, v]) => `"${k}":${v}`).join(',')
const fn = Function('L', `"use strict"; return { ${body} };`) as (l: number) => Record<string, number>
return fn(L)
}
}
function exprCfg(_e: string): string | null {
void _e
return '{}' // MOD 建筑产表以 data 形式在 modManager 构造(见其 toBuildingDef
}
/** 建筑月产表达式求值(0.1.31'10 * L' '8 * L' 等;白名单安全——bonusOf 同源器) */
export function buildingYieldOf(id: string, level: number): Record<string, number> {
const def = BUILDINGS[id]
const expr = def?.produceTable ? JSON.stringify(def.produceTable(level)) : '{}'
return JSON.parse(expr) as Record<string, number>
}
/** 解析 extra 表达式(如 '0.5 + 0.1*L'):仅允许 数字/括号/四则/空格 与变量 L。