【A 经济闭环】 - 修为经济化:练气以上修行者月耗灵草(闭关2普通1),无草速修0.6~1.0衰减+缺草年告警 - 炼丹等级化:bonusOf 表达式引擎(白名单安全求值),craftChance 转正;丹方单源 PILL_RECIPES(聚气L1/凝元L2/破境L3)+ 失败折半退料 - 炼器筑宝:FORGE_RECIPES(法器/灵器/法宝,灵矿+兽核+灵石) - 秘境灵脉:secretQiOf→rollWarbooty 收益门槛(0.5~1.3折算);掉落按秘境 techGrades 过滤 - NPC 实力参战:raid 强度/风险随 npc.power 浮动(0.5~1.8) - 灾年落效:疫病/兽潮一次性袭击 + CALAMITY_FAMILY 月度减产乘子 【C 治理】 - C13 破境丹渡劫修正:大境界时药力→tribBoost 加成(+12%)入渡劫事件,不再跳过三选 - C14 存储防线:loadState 补 migrate;MigrationError(TOO_NEW/未知版本)提示升级 【UI 半批】 - 坊市新增 定制tab(丹方/铸器);ChroniclePanel 手写史书输入条;MemberModal 册立家主钮 - 年报摘要(要闻5条+辞世讣告);EventModal 选项收益预览 - 结盟引擎:setAlliance(relation≥40)/盟友岁差不降/年利15灵石
110 lines
4.2 KiB
TypeScript
110 lines
4.2 KiB
TypeScript
export interface BuildingDef {
|
|
id: string
|
|
name: string
|
|
icon: string
|
|
desc: string
|
|
kind: 'produce' | 'function'
|
|
maxLevel: number
|
|
produceTable?: (level: number) => { stone?: number; lingcao?: number; lingkuang?: number; beastcore?: number }
|
|
upgradeCost: (level: number) => { stones: number; lingkuang: number }
|
|
extra?: Record<string, string>
|
|
}
|
|
|
|
export const BUILDINGS: Record<string, BuildingDef> = {
|
|
lingtian: {
|
|
id: 'lingtian', name: '灵田', icon: '田',
|
|
desc: '种植灵草,每月产出稳定。',
|
|
kind: 'produce', maxLevel: 5,
|
|
produceTable: (l) => ({ lingcao: 10 * l }),
|
|
upgradeCost: (l) => ({ stones: 80 * Math.pow(1.7, l - 1), lingkuang: 12 * l })
|
|
},
|
|
yaoyuan: {
|
|
id: 'yaoyuan', name: '药园', icon: '药',
|
|
desc: '培育稀有药草以炼丹药。',
|
|
kind: 'produce', maxLevel: 5,
|
|
produceTable: (l) => ({ lingcao: 5 * l, beastcore: l >= 3 ? 1 : 0 }),
|
|
upgradeCost: (l) => ({ stones: 110 * Math.pow(1.7, l - 1), lingkuang: 15 * l })
|
|
},
|
|
lingkuang: {
|
|
id: 'lingkuang', name: '灵矿', icon: '矿',
|
|
desc: '开采灵石矿脉,供给炼器布阵。',
|
|
kind: 'produce', maxLevel: 5,
|
|
produceTable: (l) => ({ lingkuang: 8 * l }),
|
|
upgradeCost: (l) => ({ stones: 130 * Math.pow(1.7, l - 1), lingkuang: 10 * l })
|
|
},
|
|
fangshi: {
|
|
id: 'fangshi', name: '坊市', icon: '市',
|
|
desc: '设摊售货,每月进账灵石。',
|
|
kind: 'produce', maxLevel: 5,
|
|
produceTable: (l) => ({ stone: 55 * l }),
|
|
upgradeCost: (l) => ({ stones: 150 * Math.pow(1.7, l - 1), lingkuang: 20 * l })
|
|
},
|
|
danfang: {
|
|
id: 'danfang', name: '丹房', icon: '丹',
|
|
desc: '炼制丹药,等级越高成丹率越高。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 170 * Math.pow(1.7, l - 1), lingkuang: 18 * l }),
|
|
extra: { craftChance: '0.5 + 0.1*L' }
|
|
},
|
|
cangshu: {
|
|
id: 'cangshu', name: '藏书阁', icon: '书',
|
|
desc: '收藏功法典籍,等级越高越能寻得宝典。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 160 * Math.pow(1.7, l - 1), lingkuang: 12 * l }),
|
|
extra: { unlockGrade: '1 + L' }
|
|
},
|
|
juling: {
|
|
id: 'juling', name: '聚灵阵', icon: '阵',
|
|
desc: '汇聚天地灵气,全族修炼加成。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 200 * Math.pow(1.7, l - 1), lingkuang: 30 * l }),
|
|
extra: { expBonus: '0.05 * L' }
|
|
},
|
|
yanwu: {
|
|
id: 'yanwu', name: '演武场', icon: '武',
|
|
desc: '操练武艺,家族战力加成。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 140 * Math.pow(1.7, l - 1), lingkuang: 25 * l }),
|
|
extra: { powerBonus: '0.04 * L' }
|
|
},
|
|
dongfu: {
|
|
id: 'dongfu', name: '洞府', icon: '府',
|
|
desc: '闭关修行之所,闭关者修为加成。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 220 * Math.pow(1.7, l - 1), lingkuang: 35 * l }),
|
|
extra: { expBonus: '0.08 * L' }
|
|
},
|
|
zongci: {
|
|
id: 'zongci', name: '宗祠', icon: '祠',
|
|
desc: '供奉先祖,家族声望与生育兴旺。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 120 * Math.pow(1.7, l - 1), lingkuang: 8 * l }),
|
|
extra: { repBonus: '0.3 * L /年' }
|
|
},
|
|
lingshou: {
|
|
id: 'lingshou', name: '灵兽园', icon: '兽',
|
|
desc: '豢养灵兽,战阵之助,偶得兽核。',
|
|
kind: 'function', maxLevel: 5,
|
|
upgradeCost: (l) => ({ stones: 190 * Math.pow(1.7, l - 1), lingkuang: 28 * l }),
|
|
extra: { powerBonus: '0.05 * L' }
|
|
}
|
|
}
|
|
|
|
export const BUILDING_IDS = Object.keys(BUILDINGS)
|
|
|
|
export function buildingById(id: string): BuildingDef {
|
|
return BUILDINGS[id]
|
|
}
|
|
|
|
/** 解析 extra 表达式(如 '0.5 + 0.1*L'):仅允许 数字/括号/四则/空格 与变量 L。
|
|
* 白名单校验后求值——所有数字加成以 extra 为单一权威。 */
|
|
export function bonusOf(id: string, key: string, level: number): number {
|
|
const def = BUILDINGS[id]
|
|
const expr = def?.extra?.[key]
|
|
if (!expr) return 0
|
|
const sanitized = expr.replace(/L/g, String(level))
|
|
if (!/^[0-9.\s+\-*/()]+$/.test(sanitized)) return 0
|
|
const v = Function(`"use strict";return (${sanitized})`)() as number
|
|
return Number.isFinite(v) ? v : 0
|
|
}
|