v0.1.26: 墨规清辉——MOD 规范范式 + 灾因注册表 + 页面提亮(1047 全绿)
【MOD 规范与范式(核心命题)】 - docs/MOD_GUIDE.md:完整作者守则——命名/id 规约/semver/schema:1/五数据口 (事件/模板/词库/灾因/配方)/依赖冲突/安全红线(无脚本·禁碰 rng·不动核心时序)/ 打包分发(.cotymod 单文件)/行为承诺 - validateMod 深度校验:category/weight/境界/负成本/非空/options.eff 形状 - modPreflight 权威冲突检测:findEvent(池+动态分支 raid/渡劫/大比/传薪全量) - MOD_SCHEMA_VERSION=1 + schema 声明与升级提示;PluginStatus.author 展示 【灾因归一化(平衡版落地)】 - calamities 由 as const 死表→聚合注册表(calamityNames/calamityFamilyOf/calamityEffectOf+addCalamity) - WorldSim 灾签/生产/Market 全链路走聚合读口——MOD 灾因(剑灾/灵潮湍变)进入世界循环 - 默认表不变→基准世界指纹零漂(clock.test 全绿实证) 【页面可读性(有点暗)】 - .dim #6d6150→#a99c80(3.4:1→7+:1)、.dim2 #96896e→#c3b595、.help-text 提亮、 .feed-item 显色 #efe4c9 + 灰金系 8 处提亮(styles.css 12+/11- 纯色值) - tests/contrast-readability.test.ts:WCAG 对比度审计(≥4.5:1)+ 历史暗色迁移断言 【测试】1047 全绿(47 套件):mod-system 9(+validate/灾因/冲突/预检)、contrast 3; 【金钟罩】0.1.25 基线零漂;build 通过
This commit is contained in:
@@ -18,6 +18,8 @@ export interface ModPackData {
|
||||
fams?: string[]
|
||||
suffixes?: string[]
|
||||
}
|
||||
/** 灾因扩展(0.1.26:进入世界灾签循环) */
|
||||
calamities?: Array<{ name: string; family?: Record<string, number>; effect?: Record<string, number> }>
|
||||
/** 丹方/铸器配方 */
|
||||
pills?: Array<{ output: string; name: string; danfangLevel: number; stones: number; lingcao: number; beastcore: number; desc: string }>
|
||||
forges?: Array<{ output: string; name: string; stones: number; lingkuang: number; beastcore: number; desc: string }>
|
||||
@@ -30,6 +32,8 @@ export interface ModPack {
|
||||
gameVersion?: string
|
||||
author?: string
|
||||
description?: string
|
||||
/** 模式范式版本(0.1.26 起建议声明 = 1) */
|
||||
schema?: number
|
||||
depends?: string[]
|
||||
conflicts?: string[]
|
||||
data: ModPackData
|
||||
@@ -73,3 +77,44 @@ export function modParse(text: string): ModParseResult {
|
||||
}
|
||||
return { ok: true, pack: raw as ModPack }
|
||||
}
|
||||
|
||||
export const MOD_SCHEMA_VERSION = 1
|
||||
|
||||
export interface ModValidation {
|
||||
ok: boolean
|
||||
warnings: string[]
|
||||
}
|
||||
|
||||
const CATEGORIES = ['daily', 'major', 'fate'] as const
|
||||
const REALMS = ['mortal', 'qi', 'foundation', 'core', 'nascent', 'spirit'] as const
|
||||
|
||||
/** 范式校验(0.1.26 规范):深度字段检查——event 形状/模板境界/配方非负 */
|
||||
export function validateMod(pack: ModPack): ModValidation {
|
||||
const warnings: string[] = []
|
||||
if (pack.schema !== undefined && pack.schema !== MOD_SCHEMA_VERSION) {
|
||||
warnings.push(`schema 版本 ${pack.schema} ≠ 当前支持 ${MOD_SCHEMA_VERSION}(提示 MOD 作者更新)。`)
|
||||
}
|
||||
if (!pack.author) warnings.push('缺 author(建议填,供玩家辨识)。')
|
||||
for (const e of pack.data.events ?? []) {
|
||||
if (!CATEGORIES.includes(e.category as never)) warnings.push(`事件 ${e.id} category 非法(daily|major|fate)。`)
|
||||
if (!(e.weight >= 0 && e.weight <= 100)) warnings.push(`事件 ${e.id} weight 超界(0~100)。`)
|
||||
if (!e.text || !e.text.trim()) warnings.push(`事件 ${e.id} 缺正文。`)
|
||||
if (!e.options || e.options.length === 0) warnings.push(`事件 ${e.id} 缺选项。`)
|
||||
for (const o of e.options ?? []) {
|
||||
if (!o.label) warnings.push(`事件 ${e.id} 某选项缺 label。`)
|
||||
if (!o.eff || typeof o.eff !== 'object') warnings.push(`事件 ${e.id} 某选项缺 eff(可空对象)。`)
|
||||
}
|
||||
}
|
||||
for (const n of pack.data.npcs ?? []) {
|
||||
if (!REALMS.includes(n.leaderRealm)) warnings.push(`模板 ${n.id} leaderRealm 非法(${REALMS.join('|')})。`)
|
||||
if (!(n.initialPower >= 60 && n.initialPower <= 400)) warnings.push(`模板 ${n.id} initialPower 建议 60~400。`)
|
||||
}
|
||||
for (const r of pack.data.pills ?? []) {
|
||||
if ([r.stones, r.lingcao, r.beastcore].some((v) => v < 0)) warnings.push(`丹方 ${r.output} 含负成本。`)
|
||||
if (!(r.danfangLevel >= 1 && r.danfangLevel <= 5)) warnings.push(`丹方 ${r.output} danfangLevel 建议 1~5。`)
|
||||
}
|
||||
for (const r of pack.data.forges ?? []) {
|
||||
if ([r.stones, r.lingkuang, r.beastcore].some((v) => v < 0)) warnings.push(`配方 ${r.output} 含负成本。`)
|
||||
}
|
||||
return { ok: warnings.length === 0, warnings }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user