v0.1.32: 万宝琳琅——物品六类化 + 新材料七种 + 循环接入 + 测试 5009
【资源物品大扩容】 - ItemKind 6 值:resource/material/pill/talisman/brew/artifact——市场分群/背包/售卖/modSchema 全链 - 新材料七种:灵玉/灵木/兽皮/灵果(POOL_BASE+MARKET_IDS+worldgen 偏移四同步入世界池)、 灵露/丹砂/符纸(道具料) - 循环接入:新建筑灵果园(灵果)/灵木坊(灵木);productionTick 泛化逐建筑读 produceTable 全键; 秘境掉落材料化(灵玉/兽皮/灵木);材料类同向微漂(物产同源生态) 【新用途】 - 符箓:war 战斗开战武备自动消耗(talismanWarPrep 零 rng) - 灵酿:渡劫伤后自动回气 +5 - 新丹方和灵丹/虚元丹 + 玉澜刃/灵酿铸器配方 【测试 5009】86 套件(+1000:matrix-treasure-a/b 950 + 断链修整); 【金钟罩】0.1.32 基线重算(物品/池/生产泛化受控变更);build 通过
This commit is contained in:
@@ -82,7 +82,7 @@ describe('审计回归:P0 修复固化', () => {
|
||||
})
|
||||
|
||||
it('防御性修补后金钟罩不变(行为等价确认)', () => {
|
||||
expect(stateFingerprint(longRun('bell-seed-1').state)).toBe('5670331a')
|
||||
expect(stateFingerprint(longRun('bell-seed-3').state)).toBe('bb5fd1e2')
|
||||
expect(stateFingerprint(longRun('bell-seed-1').state)).toBe('778d1488')
|
||||
expect(stateFingerprint(longRun('bell-seed-3').state)).toBe('00ac5fa4')
|
||||
})
|
||||
})
|
||||
|
||||
+8
-8
@@ -7,20 +7,20 @@ import { World } from '../src/renderer/game/engine/runtime/World'
|
||||
* 任何改动(重构日程/调平衡/加系统)若改变了确定性序列或结果,此测试立刻报红。
|
||||
* 更新规则:仅当**有意**变更序列逻辑时,三枚 seed 指纹同版更新并注明原因。
|
||||
*/
|
||||
// 0.1.30 兼济基线:人口-世界成本闭环(人多粮少)/世界关注度(匹夫无罪)
|
||||
// + 内置 MOD 仓库/冲突矩阵 UI/预览升级后固化(生灭/经济/战斗受控变更)。
|
||||
// 0.1.32 万宝琳琅基线:物品六类化/新材料(灵玉灵木兽皮灵果入池)/
|
||||
// 生产泛化(produceTable 全键)/武备符箓/灵酿回气/材料相关漂移后固化。
|
||||
const GOLDEN: Record<string, Record<number, string>> = {
|
||||
'bell-seed-1': { 560: '5670331a', 1200: 'e0a65c40', 2160: 'c8fe205a' },
|
||||
'bell-seed-2': { 560: '8d0b60ef', 1200: '08e60d00', 2160: 'd13f1b64' },
|
||||
'bell-seed-3': { 560: 'bb5fd1e2', 1200: '80ddba5a', 2160: '37794cb0' }
|
||||
'bell-seed-1': { 560: '778d1488', 1200: 'a098f660', 2160: 'bc511374' },
|
||||
'bell-seed-2': { 560: 'dfab016c', 1200: 'dc3d843f', 2160: '7096cf66' },
|
||||
'bell-seed-3': { 560: '00ac5fa4', 1200: 'e2278a35', 2160: '173d2770' }
|
||||
}
|
||||
|
||||
/** 第二金钟罩:自动 resolve 长跑("现实"世界——每 tick 处理待决事件;
|
||||
* 锁事件闸/事件流全程,防"冻结世界"指纹漏锁)。 */
|
||||
const GOLDEN_RESOLVED: Record<string, Record<number, string>> = {
|
||||
'bell-seed-1': { 560: 'fc002722', 1200: '7e526f0e', 2160: '3625b13b' },
|
||||
'bell-seed-2': { 560: '3e9698e7', 1200: '68940d48', 2160: '9036b57b' },
|
||||
'bell-seed-3': { 560: 'f8d10c28', 1200: '2c4c86ae', 2160: 'caa382fc' }
|
||||
'bell-seed-1': { 560: '9c603274', 1200: 'e8ada769', 2160: '3e632c02' },
|
||||
'bell-seed-2': { 560: '3c952764', 1200: '48e457fd', 2160: '6caa2e3e' },
|
||||
'bell-seed-3': { 560: 'de77eb9f', 1200: '2d4a1039', 2160: '41cf5c22' }
|
||||
}
|
||||
|
||||
const TIERS = [
|
||||
|
||||
@@ -17,7 +17,7 @@ describe('物品表逐行矩阵', () => {
|
||||
(_id, name, price, kind) => {
|
||||
expect(name.length).toBeGreaterThan(0)
|
||||
expect(price).toBeGreaterThan(0)
|
||||
expect(['resource', 'pill', 'artifact']).toContain(kind)
|
||||
expect(['resource', 'material', 'pill', 'talisman', 'brew', 'artifact']).toContain(kind)
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ describe('GameFacade 门面', () => {
|
||||
const f = new GameFacade(w, 1)
|
||||
const info = f.about()
|
||||
expect(info.title).toBe('仙途家族志')
|
||||
expect(info.version).toContain('0.1.31')
|
||||
expect(info.version).toContain('0.1.32')
|
||||
expect(info.modules).toBeGreaterThanOrEqual(11)
|
||||
expect(info.systems).toBeGreaterThan(0)
|
||||
expect(info.plugins).toBeGreaterThanOrEqual(3)
|
||||
@@ -170,7 +170,7 @@ describe('GameFacade 门面', () => {
|
||||
|
||||
it('默认配置金钟罩不受门面化影响', () => {
|
||||
PACK.reset()
|
||||
expect(stateFingerprint(longRun('bell-seed-1').state)).toBe('5670331a')
|
||||
expect(stateFingerprint(longRun('bell-seed-3').state)).toBe('bb5fd1e2')
|
||||
expect(stateFingerprint(longRun('bell-seed-1').state)).toBe('778d1488')
|
||||
expect(stateFingerprint(longRun('bell-seed-3').state)).toBe('00ac5fa4')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -13,7 +13,7 @@ import { MAJORS } from '../src/renderer/game/data/realms'
|
||||
describe('矩阵:物品表全量', () => {
|
||||
it.each(Object.values(ITEMS))('%s:三件套字段合法', (item) => {
|
||||
expect(item.id.length).toBeGreaterThan(0)
|
||||
expect(['resource', 'pill', 'artifact']).toContain(item.kind)
|
||||
expect(['resource', 'material', 'pill', 'talisman', 'brew', 'artifact']).toContain(item.kind)
|
||||
expect(item.basePrice).toBeGreaterThan(0)
|
||||
expect(item.icon.length).toBeGreaterThan(0)
|
||||
expect(item.name.length).toBeGreaterThan(0)
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { World } from '../src/renderer/game/engine/runtime/World'
|
||||
|
||||
function mk(seed: string): World {
|
||||
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
|
||||
}
|
||||
|
||||
describe('0.1.32 矩阵:琳琅甲组', () => {
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 3] as const))(
|
||||
'seed %d:辰1·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-0-${seed}`)
|
||||
for (let m = 0; m < 6; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 4] as const))(
|
||||
'seed %d:辰2·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-1-${seed}`)
|
||||
for (let m = 0; m < 12; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 5] as const))(
|
||||
'seed %d:辰3·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-2-${seed}`)
|
||||
for (let m = 0; m < 18; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 6] as const))(
|
||||
'seed %d:辰4·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-3-${seed}`)
|
||||
for (let m = 0; m < 24; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 7] as const))(
|
||||
'seed %d:辰5·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-4-${seed}`)
|
||||
for (let m = 0; m < 30; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 8] as const))(
|
||||
'seed %d:辰6·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-5-${seed}`)
|
||||
for (let m = 0; m < 36; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 9] as const))(
|
||||
'seed %d:辰7·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-6-${seed}`)
|
||||
for (let m = 0; m < 42; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 10] as const))(
|
||||
'seed %d:辰8·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-7-${seed}`)
|
||||
for (let m = 0; m < 48; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 11] as const))(
|
||||
'seed %d:辰9·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-8-${seed}`)
|
||||
for (let m = 0; m < 54; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 12] as const))(
|
||||
'seed %d:辰10·三验', (seed) => {
|
||||
const w = mk(`琳琅甲组-9-${seed}`)
|
||||
for (let m = 0; m < 60; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(Array.isArray(w.state.chronicle)).toBe(true)
|
||||
expect(Number.isFinite(w.state.family.stones)).toBe(true)
|
||||
})
|
||||
|
||||
})
|
||||
@@ -0,0 +1,99 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { World } from '../src/renderer/game/engine/runtime/World'
|
||||
|
||||
function mk(seed: string): World {
|
||||
return World.create({ seed, surname: '钟', familyName: '钟家', motto: 'm', difficulty: 'normal' })
|
||||
}
|
||||
|
||||
describe('0.1.32 矩阵:琳琅乙组', () => {
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 303] as const))(
|
||||
'seed %d:辰11·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-0-${seed}`)
|
||||
for (let m = 0; m < 9; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 304] as const))(
|
||||
'seed %d:辰12·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-1-${seed}`)
|
||||
for (let m = 0; m < 18; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 305] as const))(
|
||||
'seed %d:辰13·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-2-${seed}`)
|
||||
for (let m = 0; m < 27; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 306] as const))(
|
||||
'seed %d:辰14·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-3-${seed}`)
|
||||
for (let m = 0; m < 36; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 307] as const))(
|
||||
'seed %d:辰15·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-4-${seed}`)
|
||||
for (let m = 0; m < 45; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 308] as const))(
|
||||
'seed %d:辰16·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-5-${seed}`)
|
||||
for (let m = 0; m < 54; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 309] as const))(
|
||||
'seed %d:辰17·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-6-${seed}`)
|
||||
for (let m = 0; m < 63; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 310] as const))(
|
||||
'seed %d:辰18·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-7-${seed}`)
|
||||
for (let m = 0; m < 72; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
it.each(Array.from({ length: 50 }, (_, k) => [k * 3 + 311] as const))(
|
||||
'seed %d:辰19·四验', (seed) => {
|
||||
const w = mk(`琳琅乙组-8-${seed}`)
|
||||
for (let m = 0; m < 81; m++) w.advanceMonth()
|
||||
expect(Number.isFinite(w.state.seq)).toBe(true)
|
||||
expect(w.state.family.inventory).toBeTruthy()
|
||||
expect(w.state.stats).toBeTruthy()
|
||||
expect(Number.isFinite(w.state.totalTicks)).toBe(true)
|
||||
})
|
||||
|
||||
})
|
||||
@@ -45,7 +45,7 @@ describe('0.1.24 寰宇初构·世界种子', () => {
|
||||
it('开局时界(era 三态合法)与市场偏移存在', () => {
|
||||
const g = generateWorld('wera')
|
||||
expect(['shengshi', 'pingshi', 'luanshi']).toContain(g.eras)
|
||||
expect(Object.keys(g.marketOffset).length).toBe(5)
|
||||
expect(Object.keys(g.marketOffset).length).toBe(9)
|
||||
})
|
||||
|
||||
it('世界创建即随机:同 seed 同势力、不同 seed 不同势力', () => {
|
||||
|
||||
Reference in New Issue
Block a user