- GameFacade 统一门面:act(23 种动作白名单)/query(6 类只读快照)/subscribe(七大事件协议)/ about(版本+模块清单+数据包指纹);UI store 接入门面(act 直达,散装调用收口) - CapabilityRegistry:12 张能力卡(id/name/version/desc/hooks),world.systems 启停即拔插, 时钟按能力开关过滤(禁修炼则无人精进…沙盒玩法);sysChanged 广播 - DataPackRegistry:默认包与静态数据同引用(金钟罩零漂移),override/reset/fingerprint, 高频读口 6 处迁移 pack()——未来 MOD=注入数据包覆写 - 开发者面板:设置页系统仪表盘(清单+启停开关+警示文案) - 测试 225→239(能力清单/拔插分殊四路/广播幂等/包覆盖物价/act 目录/query/协议退订/about/ 金钟罩复验零漂移)
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import type { World } from './world'
|
|
import { pack } from '../data/registry'
|
|
|
|
export function marketPrice(w: World, itemId: string): number {
|
|
const base = pack().items[itemId]?.basePrice ?? 1
|
|
const fam = w.state.family
|
|
const mult = typeof fam.flag['priceMult'] === 'number' ? (fam.flag['priceMult'] as number) : 1
|
|
const mood = fam.reputation >= 40 ? 1.06 : fam.reputation >= 20 ? 1.02 : 0.98
|
|
return Math.max(1, Math.round(base * mult * mood))
|
|
}
|
|
|
|
export function buyItem(w: World, itemId: string, count: number): boolean {
|
|
const fam = w.state.family
|
|
const total = marketPrice(w, itemId) * count
|
|
if (total > fam.stones) return false
|
|
fam.stones -= total
|
|
fam.inventory[itemId] = (fam.inventory[itemId] ?? 0) + count
|
|
return true
|
|
}
|
|
|
|
export function sellItem(w: World, itemId: string, count: number): boolean {
|
|
const fam = w.state.family
|
|
const have = fam.inventory[itemId] ?? 0
|
|
if (have < count) return false
|
|
fam.inventory[itemId] = have - count
|
|
fam.stones += marketPrice(w, itemId) * count
|
|
return true
|
|
}
|
|
|
|
export function buyTechnique(w: World, techId: string, price: number): boolean {
|
|
const fam = w.state.family
|
|
if (fam.techniques.includes(techId)) return false
|
|
if (fam.stones < price) return false
|
|
fam.stones -= price
|
|
fam.techniques.push(techId)
|
|
return true
|
|
}
|
|
|
|
export function techniquePrice(techId: string): number {
|
|
const grade = TECH_GRADE_BASE[techId] ?? 200
|
|
return grade
|
|
}
|
|
|
|
import { TECHNIQUES } from '../data/techniques'
|
|
|
|
const TECH_GRADE_BASE: Record<string, number> = Object.fromEntries(
|
|
TECHNIQUES.map((t) => [t.id, [120, 300, 700, 1600, 3600][t.grade] ?? 300])
|
|
)
|