import type { World } from '../runtime/World' import { pack } from '../../data/registry' import { traitBonuses } from '../runtime/pcgen' import { WorldSim } from './WorldSim' export function marketPrice(w: World, itemId: string): number { const item = pack().items[itemId] if (!item) return 0 const base = item.basePrice 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 // 世界行情乘子(唯一读口:worldSim.marketMultFor;无 sim 时 1) const simMult = w.state.worldSim ? new WorldSim(w).marketMultFor(itemId) : 1 // 利己(priceMult)与信誉修正 const sellers = w.aliveMembers().filter((c) => traitBonuses(c).priceMult > 0).length const liarPct = Math.min(0.2, sellers * 0.04) return Math.max(1, Math.round(base * mult * mood * simMult * (1 - liarPct))) } export function buyItem(w: World, itemId: string, count: number): boolean { const fam = w.state.family if (!pack().items[itemId]) return false const sim = w.state.worldSim ? new WorldSim(w) : null // 断供告急:池深低于下限时拒单(零库存市场无货可买;世界生产与 NPC 供给会回填) if (sim && sim.poolDepthOf(itemId) < WORLDSIM.tradeFloorPct && w.state.totalTicks > 12) return false const total = marketPrice(w, itemId) * count if (total > fam.stones) return false fam.stones -= total fam.inventory[itemId] = (fam.inventory[itemId] ?? 0) + count sim?.tradeSettle(itemId, -count) return true } export function sellItem(w: World, itemId: string, count: number): boolean { const fam = w.state.family if (!pack().items[itemId]) return false const have = fam.inventory[itemId] ?? 0 if (have < count) return false fam.inventory[itemId] = have - count fam.stones += marketPrice(w, itemId) * count if (w.state.worldSim) new WorldSim(w).tradeSettle(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 { return TECH_GRADE_BASE[techId] ?? 200 } import { TECHNIQUES } from '../../data/techniques' import { WORLDSIM } from './worldsim-data' const TECHNIQUE_GRADE_PRICE: Record = { 1: 120, 2: 300, 3: 700, 4: 1600 } const TECH_GRADE_BASE: Record = Object.fromEntries( TECHNIQUES.map((t) => [t.id, TECHNIQUE_GRADE_PRICE[t.grade] ?? 300]) )