// 👇 你的所有数据 100% 原样不动
const contentData = {
survival: { title: "板块一:生存指南", items: [{name:"1. 基础准备", subItems:["1.1 基础工具", "1.2 建筑材料"]}, "2. 饥饿值&血量", "3. 村民贸易", "4. 合理的“外挂”", "5. 下界&末地“通行证”", "6. 高级追求", "7. 全成就"] },
pvp: { title: "板块二:面包武道馆", items: ["1. 合成配方", "2. 基础身法", "3. 武器博弈", "4. 防御保命", "5. 高级进阶", "6. 药水酿造"] },
redstone: {
title: "板块三:红石实验室",
items: [
{ name: "1. 能量起源", subItems: ["1.1 能量源头", "1.2 红石基础"] },
{ name: "2. 自动工厂", subItems: ["2.1 隐藏物品器", "2.2 半自动农场", "2.3 全自动甘蔗机"] },
{ name: "3. 红石大脑", subItems: ["3.1 2x2活塞门", "3.2 自动酿造台", "3.3 盾构机"] },
{ name: "4. 熟练于心", subItems: ["4.1 3x3螺旋门", "4.2 垂直飞行器", "4.3 自动刷石机"] },
{ name: "5. 扬帆起航", subItems: ["5.1 16色羊毛厂", "5.2 循环活塞库", "5.3 试炼密室刷怪塔"] },
{ name: "💀 最终挑战", subItems: ["世吞 (World Eater)", "天基屠龙炮"] }
]
}
};
const tacticalData = {
"1. 合成配方": {
category: "Weapon Crafting",
title: "核心武器库:合成与进阶",
steps: [
{ img: "img/sword.png", text: "剑 (Sword):
基础:2*矿物 + 1*木棍。
面包批注: 配合“锋利V”和“横扫之刃”,它是清理僵尸围城的终极神器。" },
{ img: "img/axe.png", text: "斧 (Axe):
基础:3*矿物 + 2*木棍。
面包批注: 1.21 版本中,斧头是唯一能有效破除对方盾牌防守的重型武器。" },
{ img: "img/bow.png", text: "弓 (Bow):
配方:3*木棍 + 3*线。
面包批注: 别忘了给它打上“无限”或者“经验修补”。" },
{ img: "img/crossbow.png", text: "弩 (Crossbow):
配方:3*木棍 + 2*线 + 1*铁锭 + 1*钩子。
进阶: 配合“多重射击”和“烟花火箭”,能打出范围爆炸伤害。" },
{ img: "img/mace.png", text: "重锤 (Mace):
配方:1*沉重核心 + 1*旋风棒。
核心机制: 1.21 新贵。从高处落下攻击,高度越高伤害越高,且能抵消掉落伤害!" },
{ img: "img/spear.png", text: "长矛 (Spear):
配方:1*矿物 + 2*木棍。
面包批注: 攻击距离非常远,可以达到原先近战武器无法达到的攻击距离。" },
{ img: "img/trident.png", text: "三叉戟 (Trident):
获取:溺尸掉落(不可合成)。
面包批注: 附魔“激流”后,在雨天你就是会飞的超人。" }
]
},
"1.1 能量源头": {
category: "Redstone Power",
title: "核心能源合成清单",
steps: [
{ img: "img/redstone_torch.png", text: "红石火把: 信号反转的核心(非门)。能向上方块传导强信号。" },
{ img: "img/redstone_block.png", text: "红石块: 永恒的 15 级强信号源。" },
{ img: "img/observer.png", text: "侦测器: 监视方块更新。只要面前有变化,就发出一帧脉冲。" },
{ img: "img/target.png", text: "标靶: 只要被射中就会传输红石信号,远程武器练习的好帮手。" },
{ img: "img/comparator.png", text: "红石比较器: 监视方块更新。只要两个信号强度不一致就会发出信号。" },
{ img: "img/repeater.png", text: "红石中继器: 在红石信号即将消失的时候,使用中继器连接即可恢复至15级!" },
{ img: "img/daylight_detector.png", text: "阳光探测器: 监视时间变化,发出对应的红石强度。" }
]
},
"1.2 红石基础": {
category: "Redstone Theory",
title: "红石能量基础知识",
steps: [
{ img: "img/redstone_decay.png", text: "1. 15格衰减律: 信号随距离逐格递减。" },
{ img: "img/redstone_invert.png", text: "2. 逻辑反转: 逻辑门的基础。" },
{ img: "img/redstone_freq.png", text: "3. 高频红石: 利用侦测器的特性让两个侦测器互相发出信号达到此效果。" },
{ img: "img/redstone_signal.png", text: "4. 单一性: 红石粉连接红石方块时,只有直接连接会传递红石信号。" }
]
},
"2.1 隐藏物品器": {
category: "Level 2: Factory",
title: "方块置换式隐藏装置",
color: "#4ade80",
steps: [{
img: "img/hide-item.png",
text: `
原理深度解析: 本装置利用粘性活塞的复合推拉逻辑。通过红石信号同时激活垂直与水平方向的活塞组,实现地面方块与下方隐藏容器的瞬间位置交换。当信号切断时,活塞回弹,地表恢复平整,从而达到完美隐藏物资的效果。
面包批注:
1. 这是最基础的隐藏逻辑,适用于任何平整的地表或墙面。
2.
注意点: 确保活塞推拉的方块属于可移动属性,且电路布线不要干扰到周围的装饰方块。上方的泥土方块可以替换为任意可推动的方块。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"2.2 半自动农场": {
category: "Level 2: Factory",
title: "大规模水流式半自动农场",
color: "#4ade80",
steps: [{
img: "img/wheat_farm.png",
text: `
原理深度解析: 本系统利用发射器(Dispenser)内置水桶,在接收到红石脉冲后瞬间释放水流。水流通过流体更新算法,将成熟作物从耕地上“震落”变为掉落物实体。随后,利用水流的推进力将散落的资源统一冲刷至底部的收集槽(漏斗链),实现一键收割。
面包批注:
1. 这是生存初期的“财富密码”,建议配合简单的时钟电路(Clock Circuit)实现收割后自动关水。
2.
避坑指南: 务必在水流路径上方覆盖玻璃或其他透明方块,防止作物在冲刷过程中因物理碰撞飞溅到耕地之外,造成资源浪费。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"2.3 全自动甘蔗机": {
category: "Level 2: Factory",
title: "观察者式全自动甘蔗收割机",
color: "#4ade80",
steps: [{
img: "img/sugarcane_machine.png",
text: `
原理深度解析: 本装置基于“非接触式高度监测”逻辑。当甘蔗生长至三格高度时,位于顶层的侦测器会瞬间识别到方块更新。信号穿过支撑方块激活中间层的普通活塞,将甘蔗的第二层及以上部分推断。由于甘蔗底座未被破坏,它会继续循环生长。
面包批注:
1. 这是火箭燃料(纸)的核心来源,建议采取“多模块并联”排布。
2.
进阶技巧: 在甘蔗根部下方使用“漏斗矿车”进行全局收集,效率远高于普通漏斗。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"3.1 2x2活塞门": {
category: "Level 3: Intermediate",
title: "2x2 标准内吸式隐藏门",
color: "#FFD700",
steps: [{
img: "img/piston_door.png",
text: `
原理深度解析: 经典的“内吸式(Jeb Door)”结构。它通过两组粘性活塞的复合联动实现:第一组活塞负责将门面方块向内拉动,第二组活塞则负责将门面整体向两侧侧移。利用中继器调节延时实现完美平齐。
面包批注:
1. 红石美学的入门之作。不仅可以装在基地入口,还可以藏在图书馆的书架后面做暗室。
2.
技术重点: 注意布线的对称性。如果两侧开启时间不统一,视觉上会非常别扭。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"3.3 盾构机": {
category: "Level 3: Intermediate",
title: "音符盒受控式盾构机",
color: "#FFD700",
steps: [{
img: "img/dungouji.png",
text: `
原理深度解析: 利用音符盒更新触发侦测器,立即激活推进活塞组。通过活塞间的逻辑时序,带动前端的TNT复制机构进行水平位移,实现精准的手动步进效果。
面包批注:
1. 受控式更适合处理复杂地层。遇到水坑或黑曜石时,能立刻收手避免机器损毁。
2.
致命提醒: 启动前必须观察前方是否有流水,防止 TNT 在水中引爆导致回弹炸毁机器。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"4.1 3x3螺旋门": {
category: "Level 4: Advanced",
title: "3x3 螺旋开启式机械门",
color: "#00D4FF",
steps: [{
img: "img/Spiral_Door.png",
text: `
原理深度解析: 需利用底部的“二级递归(Double Piston Extender)”结构。通过及其精确的中继器刻数控制,在门开启时收回中心方块。四周方块则按照螺旋顺序依次收回。
面包批注:
1. 这种门的结构复杂且极其吃时序。稍微调错一个中继器档位,整个门就会因为方块没收回而卡死。
2.
建议: 初次搭建一定要开着 Litematic 的投影模式对照逻辑电路部分。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"4.2 垂直飞行器": {
category: "Level 4: Advanced",
title: "单向垂直升降引擎",
color: "#00D4FF",
steps: [{
img: "img/vertical_flyer.png",
text: `
原理分析: 利用观察者面朝下捕捉更新。当底部更新时,观察者激活顶部的粘性活塞,将整个机身(含粘性块)向上拉动。随后下方活塞跟进,完成单向循环。
面包批注:
1. 非常适合做全自动电梯或顶层轰炸机的上升部分。
2.
注意: 顶端一定要有“不可移动方块”挡住,否则它会一直飞到高度上限。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"4.3 自动刷石机": {
category: "Level 4: Advanced",
title: "高频防损式全自动炸石机",
color: "#00D4FF",
steps: [{
img: "img/stone_generator.png",
text: `
原理深度解析: 该装置利用水与岩浆接触生成圆石。通过高频红石时钟控制顶部的 TNT 复制机构,在特定高度引爆瞬间将圆石转化为掉落物,并由底部的漏斗阵列回收。
面包批注:
1.
安全核心: 水坑的设计不仅是为了刷石,更是为了吸收 TNT 的爆炸冲击波,防止机器炸膛。使用红石火把塔传输信号确保逻辑通畅。
2.
效率调优: 调整中继器延迟,让 TNT 落下频率刚好匹配圆石生成速度。避免了同时出现2个TNT互相爆炸的情况。
(图片仅展示结构逻辑,具体样子玩家可自行修改。如有不符,以文字为准)
`
}]
},
"天基屠龙炮": {
category: "Level 4: Advanced",
title: "天基屠龙炮",
color: "#ff4444",
steps: [{
img: "img/tulong.png",
text: `
原理深度解析: 天基屠龙炮是基于矢量加速与时序控制的末影龙斩杀装置。核心原理为:通过 TNT 复制矩阵在炮膛内同步生成大量 TNT,利用其爆炸产生的冲击波,将箭矢沿预设弹道加速至超高速;同时通过红石中继器与比较器组成的精密时序网络,控制 TNT 引爆时机与箭矢发射窗口,使箭矢在末影龙刷新瞬间精准命中其判定点,实现一击必杀。
面包批注:
1. 末地终局利器:专为高效斩杀末影龙设计,可集成于末地平台或移动平台,大幅缩短终局战斗流程。
2.
技术重点: 需严格保证 TNT 复制与引爆的同步性,箭矢校准模块需精准对齐龙池刷新坐标;时序偏差会导致威力衰减或炸膛,布线对称性是稳定运行的关键。
(图片仅展示结构逻辑,具体外观可自定义。如有不符,以文字为准)
`
}]
}
};
// 👇 最稳定、最简单的 JS,保证能点
function show(id) { document.getElementById(id).classList.remove('hidden'); }
function hide(id) { document.getElementById(id).classList.add('hidden'); }
function openPage(category, subItems, customTitle) {
const home = document.getElementById('home-page');
const detail = document.getElementById('detail-page');
const container = document.getElementById('sub-blocks-container');
let data = subItems ? { title: customTitle, items: subItems } : contentData[category];
document.getElementById('detail-title').innerText = data.title;
container.innerHTML = '';
data.items.forEach(item => {
const block = document.createElement('div');
block.className = 'glass-card p-6 rounded-2xl text-center font-bold text-stone-700 cursor-pointer';
const name = typeof item === 'object' ? item.name : item;
block.innerText = name;
block.onclick = () => {
if (typeof item === 'object' && item.subItems) {
openPage(null, item.subItems, item.name);
} else if (tacticalData[name]) {
showTactical(tacticalData[name]);
} else {
alert("【" + name + "】正在努力烤制中...");
}
};
container.appendChild(block);
});
hide('home-page');
show('detail-page');
}
function showTactical(data) {
document.getElementById('article-category').innerText = data.category;
document.getElementById('article-category').style.color = data.color || "#f97316";
document.getElementById('article-title').innerText = data.title;
document.getElementById('article-content').innerHTML = data.steps.map(s => `
`).join('');
show('article-overlay');
}
function closeArticle() { hide('article-overlay'); }
function backToHome() { hide('detail-page'); show('home-page'); }
// ======================= 🔐 后台管理系统 =======================
// 初始化存储
if (!localStorage.getItem('admin_password')) {
localStorage.setItem('admin_password', 'admin123');
}
if (!localStorage.getItem('feedbacks')) {
localStorage.setItem('feedbacks', JSON.stringify([]));
}
// 等待DOM加载完成再绑定事件
document.addEventListener('DOMContentLoaded', function() {
// 后台入口按钮
const adminTrigger = document.getElementById('secret-admin-trigger');
if (adminTrigger) {
adminTrigger.addEventListener('click', function() {
const modal = document.getElementById('password-modal');
if (modal) modal.classList.remove('hidden');
const pwdInput = document.getElementById('admin-password-input');
if (pwdInput) pwdInput.value = '';
const errorDiv = document.getElementById('password-error');
if (errorDiv) errorDiv.classList.add('hidden');
});
}
// 密码提交
const submitBtn = document.getElementById('password-submit-btn');
if (submitBtn) {
submitBtn.addEventListener('click', function() {
const inputPwd = document.getElementById('admin-password-input').value;
const correctPwd = localStorage.getItem('admin_password');
if (inputPwd === correctPwd) {
const modal = document.getElementById('password-modal');
if (modal) modal.classList.add('hidden');
renderAdminPanel();
const dashboard = document.getElementById('admin-dashboard');
const home = document.getElementById('home-page');
if (dashboard) dashboard.classList.remove('hidden');
if (home) home.classList.add('hidden');
} else {
const errorDiv = document.getElementById('password-error');
if (errorDiv) errorDiv.classList.remove('hidden');
}
});
}
// 取消按钮
const cancelBtn = document.getElementById('password-cancel-btn');
if (cancelBtn) {
cancelBtn.addEventListener('click', function() {
const modal = document.getElementById('password-modal');
if (modal) modal.classList.add('hidden');
});
}
// 回车提交
const pwdInput = document.getElementById('admin-password-input');
if (pwdInput) {
pwdInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
const btn = document.getElementById('password-submit-btn');
if (btn) btn.click();
}
});
}
// 关闭后台
const closeBtn = document.getElementById('close-admin-btn');
if (closeBtn) {
closeBtn.addEventListener('click', function() {
const dashboard = document.getElementById('admin-dashboard');
const home = document.getElementById('home-page');
if (dashboard) dashboard.classList.add('hidden');
if (home) home.classList.remove('hidden');
});
}
// 清空全部
const clearBtn = document.getElementById('clear-all-feedback-btn');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
if (confirm('⚠️ 确定要清空所有反馈吗?')) {
localStorage.setItem('feedbacks', JSON.stringify([]));
renderAdminPanel();
alert('✅ 已清空');
}
});
}
// 刷新
const refreshBtn = document.getElementById('refresh-admin-btn');
if (refreshBtn) {
refreshBtn.addEventListener('click', function() {
renderAdminPanel();
});
}
// 修改密码
const changePwdBtn = document.getElementById('change-password-btn');
if (changePwdBtn) {
changePwdBtn.addEventListener('click', function() {
const oldPwd = prompt('请输入当前密码:');
const currentPwd = localStorage.getItem('admin_password');
if (oldPwd !== currentPwd) {
alert('❌ 当前密码错误!');
return;
}
const newPwd = prompt('请输入新密码(至少4位):');
if (newPwd && newPwd.length >= 4) {
localStorage.setItem('admin_password', newPwd);
alert('✅ 密码修改成功!新密码:' + newPwd);
} else if (newPwd) {
alert('❌ 密码长度至少4位');
}
});
}
// 建议箱提交
const form = document.getElementById('suggestion-form');
if (form) {
form.addEventListener('submit', function(e) {
e.preventDefault();
const text = document.getElementById('suggestion-text').value.trim();
if(text) {
const feedbacks = JSON.parse(localStorage.getItem('feedbacks') || '[]');
const now = new Date();
const timeStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()} ${now.getHours().toString().padStart(2,'0')}:${now.getMinutes().toString().padStart(2,'0')}:${now.getSeconds().toString().padStart(2,'0')}`;
feedbacks.push({ content: text, time: timeStr });
localStorage.setItem('feedbacks', JSON.stringify(feedbacks));
alert("✅ 收到建议!");
// 面包特效
const btnRect = e.target.querySelector('button').getBoundingClientRect();
const fakeEvent = { clientX: btnRect.left + btnRect.width / 2, clientY: btnRect.top + btnRect.height / 2 };
for(let i=0; i<3; i++) {
setTimeout(() => { document.dispatchEvent(new MouseEvent('mousedown', fakeEvent)); }, i * 100);
}
document.getElementById('suggestion-text').value = '';
}
});
}
});
// 渲染反馈列表
function renderAdminPanel() {
const feedbacks = JSON.parse(localStorage.getItem('feedbacks') || '[]');
const container = document.getElementById('admin-feedback-list');
const totalSpan = document.getElementById('total-feedback-count');
if (totalSpan) totalSpan.innerText = feedbacks.length;
if (!container) return;
if (feedbacks.length === 0) {
container.innerHTML = '✨ 暂无反馈 ✨
';
return;
}
container.innerHTML = feedbacks.slice().reverse().map((fb, idx) => `
📝 ${escapeHtml(fb.time)}
${escapeHtml(fb.content)}
`).join('');
}
// 删除单条
window.deleteFeedback = function(index) {
let feedbacks = JSON.parse(localStorage.getItem('feedbacks') || '[]');
feedbacks.splice(index, 1);
localStorage.setItem('feedbacks', JSON.stringify(feedbacks));
renderAdminPanel();
};
// HTML转义
function escapeHtml(str) {
return str.replace(/[&<>]/g, function(m) {
if (m === '&') return '&';
if (m === '<') return '<';
if (m === '>') return '>';
return m;
});
}
// 🥖 面包喷泉特效(单独保留,不和后台冲突)
(function() {
const bt = ['🍞','🥐','🥖','🥨','🥯','🧸'];
document.addEventListener('mousedown', function(e) {
for(let i=0; i<8; i++){
const el = document.createElement('div');
el.className = 'bread-emoji';
el.textContent = bt[Math.floor(Math.random() * bt.length)];
el.style.fontSize = (Math.random() * 20 + 30) + 'px';
document.body.appendChild(el);
let x = e.clientX, y = e.clientY;
let vx = (Math.random() - 0.5) * 10;
let vy = (Math.random() - 0.5) * 10;
let o = 1;
let rotation = 0;
let rv = (Math.random() - 0.5) * 5;
(function animate() {
x += vx;
y += vy + 0.15;
rotation += rv;
o -= 0.02;
el.style.left = x + 'px';
el.style.top = y + 'px';
el.style.opacity = o;
el.style.transform = `translate(-50%, -50%) rotate(${rotation}deg)`;
if (o > 0) {
requestAnimationFrame(animate);
} else {
el.remove();
}
})();
}
});
})();