d9404a31-1970-4e79-ac9a-f4f9db60350b

This commit is contained in:
2026-06-23 12:47:49 +00:00
parent e193530f24
commit f73b96026c
101 changed files with 12685 additions and 2 deletions
+307
View File
@@ -0,0 +1,307 @@
// 回响星核 / Echo Nexus — 数值配置(数据驱动,便于平衡与工单迭代)
import type {
CrystalTier,
ResonanceColor,
TechNode,
Fragment,
} from "./types";
/** 初始状态 */
export const INITIAL_STATE = {
crystals: 0,
insights: 0,
energy: 10,
contact: 0,
crystalsPerSec: 0.4,
crystalCap: 50,
pulsePower: 2,
offlineEff: 0.5,
insightMult: 1,
contactRateMult: 1,
autoDecode: false,
totalDecoded: 0,
ascensions: 0,
blueprints: [] as string[],
pendingCrystals: [],
activePuzzle: null,
theme: "dark" as const,
soundOn: true,
};
/** 主动脉冲:连击窗口(毫秒)与加成 */
export const PULSE = {
comboWindowMs: 1500,
comboMultStep: 0.15, // 每连击 +15%
comboMax: 10,
};
/** 离线收益上限(小时) */
export const OFFLINE_CAP_HOURS = 8;
/** 接触进度:每次解码贡献 = base * tier * contactRateMult */
export const CONTACT = {
basePerDecode: 0.6,
// 飞升所需最低接触进度
prestigeMin: 100,
};
/** 晶体生成:每 N 秒自动产出一颗待解码晶体(受技术影响) */
export const CRYSTAL_SPAWN = {
baseIntervalSec: 8, // 每 8 秒产一颗
maxPending: 6,
/** tier 概率分布 */
tierWeights: { 1: 0.7, 2: 0.25, 3: 0.05 } as Record<CrystalTier, number>,
};
/** 晶体价值(解码奖励基础,× tier) */
export const CRYSTAL_VALUE = {
1: { crystals: 6, insights: 1 },
2: { crystals: 22, insights: 4 },
3: { crystals: 90, insights: 16 },
} as const;
/** 解码阵列配置(按 tier) */
export const DECODE_CONFIG: Record<
CrystalTier,
{ rows: number; cols: number; targetLen: number; stepLimitBase: number }
> = {
1: { rows: 3, cols: 3, targetLen: 3, stepLimitBase: 5 },
2: { rows: 4, cols: 4, targetLen: 4, stepLimitBase: 7 },
3: { rows: 5, cols: 4, targetLen: 5, stepLimitBase: 9 },
};
/** 共振颜色(4 色全息色谱,避开蓝/靛) */
export const RESONANCE_COLORS: ResonanceColor[] = [
"emerald",
"rose",
"amber",
"fuchsia",
];
/** 颜色可视化(用于 Canvas / CSS */
export const COLOR_VISUAL: Record<
ResonanceColor,
{ hex: string; glow: string; label: string }
> = {
emerald: { hex: "#34d399", glow: "rgba(52,211,153,0.55)", label: "翠" },
rose: { hex: "#fb7185", glow: "rgba(251,113,133,0.55)", label: "玫" },
amber: { hex: "#fbbf24", glow: "rgba(251,191,36,0.55)", label: "琥" },
fuchsia: { hex: "#e879f9", glow: "rgba(232,121,249,0.55)", label: "紫" },
};
/** 技术树:4 分支 × 3 级 = 12 节点 */
export const TECH_TREE: TechNode[] = [
// 采矿分支
{
id: "min_1",
branch: "mining",
level: 1,
name: "谐振钻头",
desc: "晶体/秒 +0.6",
cost: 5,
effect: { kind: "crystalsPerSec", value: 0.6 },
},
{
id: "min_2",
branch: "mining",
level: 2,
name: "深层矿脉",
desc: "晶体/秒 +1.6,仓库上限 +100",
cost: 24,
effect: { kind: "crystalsPerSec", value: 1.6 },
},
{
id: "min_3",
branch: "mining",
level: 3,
name: "自治机群",
desc: "晶体/秒 +5,仓库上限 +300",
cost: 120,
effect: { kind: "crystalsPerSec", value: 5 },
},
// 解码分支
{
id: "dec_1",
branch: "decoding",
level: 1,
name: "谐振校准",
desc: "解码步数上限 +2",
cost: 6,
effect: { kind: "decodeSteps", value: 2 },
},
{
id: "dec_2",
branch: "decoding",
level: 2,
name: "脉冲增幅",
desc: "主动脉冲产出 +3",
cost: 30,
effect: { kind: "pulsePower", value: 3 },
},
{
id: "dec_3",
branch: "decoding",
level: 3,
name: "自动解码阵列",
desc: "自动解码 T1 晶体(每 12 秒一颗)",
cost: 200,
effect: { kind: "autoDecode", value: 1 },
},
// 探险分支(v0.1 仅产能效果,探险系统留 v0.2)
{
id: "exp_1",
branch: "expedition",
level: 1,
name: "远征推进器",
desc: "晶体/秒 +1.2(探险预备)",
cost: 12,
effect: { kind: "crystalsPerSec", value: 1.2 },
},
{
id: "exp_2",
branch: "expedition",
level: 2,
name: "遗迹图谱",
desc: "仓库上限 +200,晶体/秒 +2",
cost: 60,
effect: { kind: "crystalCap", value: 200 },
},
{
id: "exp_3",
branch: "expedition",
level: 3,
name: "维度信标",
desc: "接触进度转化率 +50%",
cost: 180,
effect: { kind: "contactRate", value: 0.5 },
},
// 叙事分支
{
id: "nar_1",
branch: "narrative",
level: 1,
name: "记忆校音",
desc: "洞见获取 +25%",
cost: 8,
effect: { kind: "insightMult", value: 0.25 },
},
{
id: "nar_2",
branch: "narrative",
level: 2,
name: "深空回响",
desc: "接触进度转化率 +35%",
cost: 45,
effect: { kind: "contactRate", value: 0.35 },
},
{
id: "nar_3",
branch: "narrative",
level: 3,
name: "以太共鸣",
desc: "洞见获取 +60%",
cost: 160,
effect: { kind: "insightMult", value: 0.6 },
},
];
/** 技术分支元信息 */
export const TECH_BRANCH_META: Record<
string,
{ name: string; icon: string; color: string; desc: string }
> = {
mining: { name: "采矿", icon: "Pickaxe", color: "emerald", desc: "提升晶体产能与仓储" },
decoding: { name: "解码", icon: "ScanLine", color: "rose", desc: "强化解码与脉冲" },
expedition: { name: "探险", icon: "Rocket", color: "amber", desc: "远征与维度信标" },
narrative: { name: "叙事", icon: "BookOpen", color: "fuchsia", desc: "洞见与接触进度" },
};
/** 记忆碎片(首纪元 8 个,v0.1) */
export const FRAGMENTS: Fragment[] = [
{
id: "f1_1",
era: 1,
title: "第一缕谐振",
echo:
"在被称作「寂灭前夜」的年代,以太族第一次捕捉到来自虚空深处的谐振——那不是声音,而是存在的回声。他们将之记录在第一颗记忆晶体里。",
threshold: 1,
},
{
id: "f1_2",
era: 1,
title: "晶体之始",
echo:
"「我们为何要留下?」一位长者问。「因为后来的生命会需要方向。」于是他们熔铸星核,封存记忆,让晶体成为跨越时间的信笺。",
threshold: 3,
},
{
id: "f1_3",
era: 1,
title: "谐振法则",
echo:
"他们发现:思维可以被编码为共振序列。同色的节点相邻,便构成一句低语;一句句连成回响,回响连成文明。",
threshold: 6,
},
{
id: "f1_4",
era: 1,
title: "飞升之议",
echo:
"议会表决:是留下,还是离去?「留下意味着停滞;离去意味着信任。」最终,他们选择了信任——信任素未谋面的后来者。",
threshold: 10,
},
{
id: "f1_5",
era: 1,
title: "面包屑",
echo:
"他们没有带走一切。他们将知识拆成碎片,藏入晶体,散布星海。「让解码本身,成为资格的证明。」",
threshold: 15,
},
{
id: "f1_6",
era: 1,
title: "回响之名",
echo:
"舰载 AI 被命名为「回响」——意为:你是他们留下的回声,也是他们等待的回应。当你读懂这句话时,接触便已开始。",
threshold: 22,
},
{
id: "f1_7",
era: 1,
title: "第一个纪元的终焉",
echo:
"以太族集体褪去形体,如潮水退去。星海寂静了数万年。直到——你的脉冲扫描,唤醒了第一颗沉睡的晶体。",
threshold: 32,
},
{
id: "f1_8",
era: 1,
title: "致后来者",
echo:
"「如果你读到这里,说明你已具备跨越维度的资格。继续解码,继续拼凑。当进度满溢,我们将在更高处相会。」——以太族·第一纪元·绝笔",
threshold: 45,
},
];
/** 飞升:保留蓝图数 = floor(totalDecoded / 20),最多 6 */
export const PRESTIGE = {
blueprintsPerDecode: 20,
maxBlueprints: 6,
/** 每个蓝图提供 +5% 产能、+3% 洞见、+4% 接触率 */
perBlueprint: {
crystalsPerSecMult: 0.05,
insightMult: 0.03,
contactRateMult: 0.04,
},
};
/** 数值格式化:大数字友好显示 */
export function formatNum(n: number): string {
if (!isFinite(n)) return "∞";
if (n < 1000) return n.toFixed(n < 10 && n % 1 !== 0 ? 1 : 0);
if (n < 1e6) return (n / 1e3).toFixed(2) + "K";
if (n < 1e9) return (n / 1e6).toFixed(2) + "M";
if (n < 1e12) return (n / 1e9).toFixed(2) + "B";
return (n / 1e12).toFixed(2) + "T";
}