家族模拟器首版:修仙/经营/战斗/外交/叙事全套系统 - Electron + React + TS + MetonaSqlark(aria+OPFS) - 水墨中国风 UI - 引擎种子随机、确定性可回放 - 19 项单元测试、端到端冒烟验证
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { World } from '../world'
|
|
|
|
export function productionTick(w: World): void {
|
|
const fam = w.state.family
|
|
const inv = fam.inventory
|
|
const parts: string[] = []
|
|
const lvl = (b: string) => fam.buildings[b] ?? 0
|
|
|
|
const lingtian = lvl('lingtian')
|
|
const yaoyuan = lvl('yaoyuan')
|
|
const lingkuang = lvl('lingkuang')
|
|
const fangshi = lvl('fangshi')
|
|
const lingshou = lvl('lingshou')
|
|
|
|
if (lingtian > 0) {
|
|
const v = 10 * lingtian
|
|
inv.lingcao = (inv.lingcao ?? 0) + v
|
|
parts.push(`灵田+${v}灵草`)
|
|
}
|
|
if (yaoyuan > 0) {
|
|
const v = 5 * yaoyuan
|
|
inv.lingcao = (inv.lingcao ?? 0) + v
|
|
parts.push(`药园+${v}药草`)
|
|
if (yaoyuan >= 3) {
|
|
inv.beastcore = (inv.beastcore ?? 0) + 1
|
|
parts.push('药园+1兽核')
|
|
}
|
|
}
|
|
if (lingkuang > 0) {
|
|
const v = 8 * lingkuang
|
|
inv.lingkuang = (inv.lingkuang ?? 0) + v
|
|
parts.push(`灵矿+${v}灵矿`)
|
|
}
|
|
if (fangshi > 0) {
|
|
const v = 55 * fangshi
|
|
fam.stones += v
|
|
parts.push(`坊市+${v}灵石`)
|
|
}
|
|
if (lingshou > 0 && w.rng.chance(0.35)) {
|
|
inv.beastcore = (inv.beastcore ?? 0) + 1
|
|
parts.push('灵兽园+1兽核')
|
|
}
|
|
|
|
void parts
|
|
|
|
if (w.state.month % 3 === 0) {
|
|
const drift = w.rng.between(-0.04, 0.04)
|
|
const cur = typeof fam.flag['priceMult'] === 'number' ? (fam.flag['priceMult'] as number) : 1
|
|
fam.flag['priceMult'] = Math.max(0.78, Math.min(1.25, cur + drift))
|
|
}
|
|
}
|