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 } export interface SecretQi { qi: number peak: number } export interface WorldSimState { /** 世界库存池(资源循环) */ marketPool: Record /** NPC 动力学 */ npcDyn: Record /** 秘境灵气条 */ secretQi: Record /** 灵气潮汐(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 = { 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>> = { 旱灾: { 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>> = { 旱灾: { lingcao: -0.3 }, 涝灾: { lingcao: -0.2, lingkuang: -0.1 }, 蝗灾: { lingcao: -0.45 }, 疫病: { beastcore: -0.25 }, 兽潮: { beastcore: 0.3 }, 寒潮: { lingcao: -0.2, beastcore: -0.15 } }