【主线一:世界自演进深化《八方风雨》】 - NPC 战略姿态 stance:守成/扩张/隐忍/结盟四态,年首评估(era>景气>power>relation) 全行为调制:raid 概率×2/×0.4/×0、互攻阈值 -40/-70/不攻、贸量 ×1.3/×0.7、 赠礼收益 ally×1.3、结盟门槛 ally 放宽至30——NPC 从统计物理到行为战略 - 超卖潮(谷贱伤农):池>1.8×base 世界产能回调×0.7 + 年度播报(防玩家玩崩市场) - 盟约连坐:结盟令世仇(rel<-50)对玩家-20;盟者世仇 raid 概率×2 - 盟友求援:互攻失利盟友告急(distress 旗标)——WorldPanel 响应(出资200/见死不救) - 干预天下:调停(50灵石令世仇-60→-25、声望+2)/ 资助盟友;恩怨网情报视图(各家关系展开+调停钮) 【主线二:孤立系统归并引擎】 - P0 兜底修复:empty() 收敛 makeWorldSimState 单源 + normalize 补 tideTicks/calamityLeft/ era/eraStartYear/prosperity/distress/overfluxYear(旧档 NaN 级联防死) - FxGate 从 engine/kernel/fxqueue.ts 并入 ui/fx.ts(kernel 清纯引擎;deltas 顶层导出, 3 处引用 10 行改动);engine 侧零 UI 依赖再下一城 - 音效语义补充:onFx→blade/pulse/spark→sWar/sGong/sBell;onLog kind 兜底保留(不静音) - store.advance drift/season 段左移 fx.ts(fxSeason 复活接管 season 检测) - 死码清除:timesense.tideOf/tintLabel、tideDir 全链(类型/初始/写入/domain) - domain.ts worldSim 局部类型补全 0.1.18/0.1.19 全部新字段(断言类型安全) 【测试】1002 全绿(41 套件):stance-world 7 例(兜底/姿态/raid/超卖/连坐/调停/求援)
157 lines
5.9 KiB
TypeScript
157 lines
5.9 KiB
TypeScript
export type NpcStance = 'guardian' | 'expand' | 'endure' | 'ally'
|
||
|
||
export interface NpcDynamics {
|
||
/** 景气指数(0~100):月结余/断供受挫/灾年支出;驱动 power 微调 */
|
||
prosperity: number
|
||
/** 战略姿态:守成/扩张/隐忍/结盟(年首评估) */
|
||
stance: NpcStance
|
||
stanceSinceYear: number
|
||
/** 宗主姓名快照(换代时更新) */
|
||
leaderName: string
|
||
leaderRealmIdx: number
|
||
leaderAge: number
|
||
/** 演化旗标 */
|
||
lastEvent: string
|
||
lastEventYear: number
|
||
relationsWithOthers: Record<string, number>
|
||
}
|
||
|
||
export interface SecretQi {
|
||
qi: number
|
||
peak: number
|
||
}
|
||
|
||
export interface WorldSimState {
|
||
/** 世界库存池(资源循环) */
|
||
marketPool: Record<string, number>
|
||
/** NPC 动力学 */
|
||
npcDyn: Record<string, NpcDynamics>
|
||
/** 秘境灵气条 */
|
||
secretQi: Record<string, number>
|
||
/** 灵气潮汐(0-100 全局系数) */
|
||
tide: number
|
||
tideTicks: number
|
||
/** 灾年(当前灾因 id;持续 calamityMonths 个月) */
|
||
calamity?: string
|
||
calamityYear: number
|
||
/** 灾年剩余月数(递减,归 0 时散去) */
|
||
calamityLeft?: number
|
||
/** 天下快讯(滚动 N=120;itemId/kind 供 UI 响应按钮与区分) */
|
||
newsFeed: { year: number; month: number; src: string; text: string; itemId?: string; kind?: 'quote' | 'npc' | 'calamity' | 'annal' }[]
|
||
lastNewsMonth: number
|
||
/** NPC 换代计数 */
|
||
npcSuccessions: number
|
||
/** 世纪弧(时代状态机) */
|
||
era?: 'shengshi' | 'pingshi' | 'luanshi' | 'mofa'
|
||
eraStartYear?: number
|
||
/** 超卖潮播报年份(谷贱伤农,一年一次) */
|
||
overfluxYear?: number
|
||
/** 盟友求援(最近一次:互攻失利波及盟我之族) */
|
||
distress?: { id: string; year: number; month: number }
|
||
}
|
||
|
||
export function makeWorldSimState(): WorldSimState {
|
||
return {
|
||
marketPool: { lingcao: 600, lingkuang: 300, beastcore: 80, 'pill-qiyuan': 90, 'pill-ningyuan': 40 },
|
||
npcDyn: {},
|
||
secretQi: {},
|
||
tide: 0.5,
|
||
tideTicks: 0,
|
||
calamityYear: -99,
|
||
calamityLeft: 0,
|
||
newsFeed: [],
|
||
lastNewsMonth: -99,
|
||
npcSuccessions: 0,
|
||
era: 'pingshi',
|
||
eraStartYear: 1,
|
||
overfluxYear: -99
|
||
}
|
||
}
|
||
|
||
/** 市场基准库存(单一权威:WorldSim 再平衡 / Market 行情 / brief 图标 三方共用) */
|
||
export const POOL_BASE: Record<string, number> = {
|
||
lingcao: 600,
|
||
lingkuang: 300,
|
||
beastcore: 80,
|
||
'pill-qiyuan': 90,
|
||
'pill-ningyuan': 40
|
||
}
|
||
|
||
/** 世纪弧:时代 → 世界调制量(0.1.18 大周期) */
|
||
export const ERA_CONF: Record<'shengshi' | 'pingshi' | 'luanshi' | 'mofa', {
|
||
name: string
|
||
desc: string
|
||
calamityMult: number
|
||
supplyMult: number
|
||
demandMult: number
|
||
auctionMult: number
|
||
tideBias: number
|
||
/** 转移概势表:[下一态, 权重] */
|
||
flow: Array<['shengshi' | 'pingshi' | 'luanshi' | 'mofa', number]>
|
||
}> = {
|
||
shengshi: { name: '盛世', desc: '灵气鼎盛,百业兴旺,天下升平。', calamityMult: 0.5, supplyMult: 1.25, demandMult: 1.15, auctionMult: 1.3, tideBias: 0.08, flow: [['pingshi', 0.7], ['luanshi', 0.3]] },
|
||
pingshi: { name: '平世', desc: '四海无波,仙凡相安。', calamityMult: 1.0, supplyMult: 1.0, demandMult: 1.0, auctionMult: 1.0, tideBias: 0, flow: [['shengshi', 0.35], ['luanshi', 0.45], ['mofa', 0.2]] },
|
||
luanshi: { name: '乱世', desc: '群雄相逐,烽烟四起,灾祸连年。', calamityMult: 1.6, supplyMult: 0.85, demandMult: 1.05, auctionMult: 0.75, tideBias: -0.04, flow: [['pingshi', 0.4], ['mofa', 0.6]] },
|
||
mofa: { name: '末法', desc: '灵机衰微,大能隐迹,仙路将绝。', calamityMult: 1.2, supplyMult: 0.7, demandMult: 0.85, auctionMult: 0.6, tideBias: -0.09, flow: [['pingshi', 0.6], ['shengshi', 0.4]] }
|
||
}
|
||
|
||
/** era 持续年数区间(转移时机) */
|
||
export const ERA_DURA: Record<'shengshi' | 'pingshi' | 'luanshi' | 'mofa', [number, number]> = {
|
||
shengshi: [25, 45],
|
||
pingshi: [20, 40],
|
||
luanshi: [15, 30],
|
||
mofa: [20, 40]
|
||
}
|
||
|
||
/** 世界演化参数表(全部可调) */
|
||
export const WORLDSIM = {
|
||
marketDriftRate: 0.03,
|
||
marketRebalance: 0.1,
|
||
priceFloor: 0.55,
|
||
priceCeil: 2.3,
|
||
// —— 0.1.17 真库存循环 ——
|
||
worldSupplyRate: 0.02, // 世界侧月供给(base 比例;潮涨时 ×1.3)
|
||
worldDemandRate: 0.015, // 世界侧月需求(坊市/宗门常驻消耗)
|
||
npcTradeRate: 0.008, // 每 NPC 月贸易量(base 比例;上桌食量)
|
||
tradeFloorPct: 0.35, // 池低于此比例时玩家买入拒单(断供告急)
|
||
tradeCeilPct: 2.4, // 池上限(玩家大量卖出后价格封顶)
|
||
tideSupplySpan: 0.3, // 潮汐对供给的浮动幅度(tide±0.35 时 ×(1∓0.3))
|
||
// —— 灾年持续 ——
|
||
calamityMonths: 6, // 灾年效果持续月数(结束月报“灾云散尽”)
|
||
// —— 潮汐/秘境 ——
|
||
tideCycle: 72, // 月周期(6年)
|
||
tideMin: 0.65,
|
||
tideMax: 1.35,
|
||
secretRecover: 2, // 灵气月恢复(潮高 ×2.5 → 用 secretRecoverHi)
|
||
secretRecoverHi: 5,
|
||
secretConsume: 6, // 每次探索消耗(missions 默认)
|
||
// —— 天下事件 ——
|
||
calamityChance: 0.18,
|
||
calamities: ['旱灾', '涝灾', '蝗灾', '疫病', '兽潮', '寒潮'] as const,
|
||
npcEventChance: 0.05, // NPC 互攻年首诗签概率
|
||
newsEvery: 24, // 月
|
||
newsKeep: 120
|
||
}
|
||
|
||
export type CalamityName = (typeof WORLDSIM.calamities)[number]
|
||
|
||
/** 灾因 → 家族实际生产乘量(1 = 正常) */
|
||
export const CALAMITY_FAMILY: Record<CalamityName, Partial<Record<string, number>>> = {
|
||
旱灾: { lingcao: 0.7 },
|
||
涝灾: { lingcao: 0.8, lingkuang: 0.95 },
|
||
蝗灾: { lingcao: 0.55 },
|
||
疫病: {},
|
||
兽潮: { beastcore: 1.4 },
|
||
寒潮: { lingcao: 0.85, lingkuang: 0.75 }
|
||
}
|
||
|
||
/** 灾因 → 资源方向 */
|
||
export const CALAMITY_EFFECT: Record<CalamityName, Partial<Record<string, number>>> = {
|
||
旱灾: { lingcao: -0.3 },
|
||
涝灾: { lingcao: -0.2, lingkuang: -0.1 },
|
||
蝗灾: { lingcao: -0.45 },
|
||
疫病: { beastcore: -0.25 },
|
||
兽潮: { beastcore: 0.3 },
|
||
寒潮: { lingcao: -0.2, beastcore: -0.15 }
|
||
}
|